blob: 235d39b93c660c428f04c0768e8fea70282a6cc7 [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)
90#include "thread.h"
91#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)
316type_lock gethostbyname_lock;
317#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)
361 acquire_lock(gethostbyname_lock,1);
362#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)
365 release_lock(gethostbyname_lock);
366#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 Rossum73624e91994-10-10 17:59:00 +0000475 if (!PyArg_Parse(args, "s#", &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;
1405 PyObject *addr_list = (PyObject *)NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001406#ifdef HAVE_GETHOSTBYNAME_R
1407 struct hostent hp_allocated;
1408 char buf[16384];
1409 int buf_len = (sizeof buf) - 1;
1410 int errnop;
1411#endif /* HAVE_GETHOSTBYNAME_R */
1412 if (!PyArg_Parse(args, "s", &name))
1413 return NULL;
1414 if (setipaddr(name, &addr) < 0)
1415 return NULL;
1416 Py_BEGIN_ALLOW_THREADS
1417#ifdef HAVE_GETHOSTBYNAME_R
1418 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
1419#else /* not HAVE_GETHOSTBYNAME_R */
1420#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
1421 acquire_lock(gethostbyname_lock,1);
1422#endif
1423 h = gethostbyname(name);
1424#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
1425 release_lock(gethostbyname_lock);
1426#endif
1427#endif /* HAVE_GETHOSTBYNAME_R */
1428 Py_END_ALLOW_THREADS
1429 return gethost_common(h,&addr);
1430}
1431
1432static char ghbn_ex_doc[] =
1433"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1434\n\
1435Return the true host name, a list of aliases, and a list of IP addresses,\n\
1436for a host. The host argument is a string giving a host name or IP number.";
1437
1438
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001439/* Python interface to gethostbyaddr(IP). */
1440
1441/*ARGSUSED*/
1442static PyObject *
1443BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1444{
1445 struct sockaddr_in addr;
1446 char *ip_num;
1447 struct hostent *h;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001448 PyObject *rtn_tuple = (PyObject *)NULL;
1449 PyObject *name_list = (PyObject *)NULL;
1450 PyObject *addr_list = (PyObject *)NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001451#ifdef HAVE_GETHOSTBYNAME_R
1452 struct hostent hp_allocated;
1453 char buf[16384];
1454 int buf_len = (sizeof buf) - 1;
1455 int errnop;
1456#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001457
1458 if (!PyArg_Parse(args, "s", &ip_num))
1459 return NULL;
1460 if (setipaddr(ip_num, &addr) < 0)
1461 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001462 Py_BEGIN_ALLOW_THREADS
1463#ifdef HAVE_GETHOSTBYNAME_R
1464 h = gethostbyaddr_r((char *)&addr.sin_addr,
1465 sizeof(addr.sin_addr),
1466 AF_INET,
1467 &hp_allocated, buf, buf_len, &errnop);
1468#else /* not HAVE_GETHOSTBYNAME_R */
1469#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
1470 acquire_lock(gethostbyname_lock,1);
1471#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001472 h = gethostbyaddr((char *)&addr.sin_addr,
1473 sizeof(addr.sin_addr),
1474 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001475#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
1476 release_lock(gethostbyname_lock);
1477#endif
1478#endif /* HAVE_GETHOSTBYNAME_R */
1479 Py_END_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001480 return gethost_common(h,&addr);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001481}
1482
Guido van Rossum82a5c661998-07-07 20:45:43 +00001483static char gethostbyaddr_doc[] =
1484"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1485\n\
1486Return the true host name, a list of aliases, and a list of IP addresses,\n\
1487for a host. The host argument is a string giving a host name or IP number.";
1488
Guido van Rossum30a685f1991-06-27 15:51:29 +00001489
1490/* Python interface to getservbyname(name).
1491 This only returns the port number, since the other info is already
1492 known or not useful (like the list of aliases). */
1493
1494/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001495static PyObject *
1496BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001497{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001498 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001499 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001500 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001501 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001502 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001503 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001504 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001505 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001506 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001507 return NULL;
1508 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001509 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001510}
1511
Guido van Rossum82a5c661998-07-07 20:45:43 +00001512static char getservbyname_doc[] =
1513"getservbyname(servicename, protocolname) -> integer\n\
1514\n\
1515Return a port number from a service name and protocol name.\n\
1516The protocol name should be 'tcp' or 'udp'.";
1517
Guido van Rossum30a685f1991-06-27 15:51:29 +00001518
Guido van Rossum3901d851996-12-19 16:35:04 +00001519/* Python interface to getprotobyname(name).
1520 This only returns the protocol number, since the other info is
1521 already known or not useful (like the list of aliases). */
1522
1523/*ARGSUSED*/
1524static PyObject *
1525BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1526{
1527 char *name;
1528 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001529#ifdef __BEOS__
1530/* Not available in BeOS yet. - [cjh] */
1531 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1532 return NULL;
1533#else
Guido van Rossum3901d851996-12-19 16:35:04 +00001534 if (!PyArg_Parse(args, "s", &name))
1535 return NULL;
1536 Py_BEGIN_ALLOW_THREADS
1537 sp = getprotobyname(name);
1538 Py_END_ALLOW_THREADS
1539 if (sp == NULL) {
1540 PyErr_SetString(PySocket_Error, "protocol not found");
1541 return NULL;
1542 }
1543 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001544#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001545}
1546
Guido van Rossum82a5c661998-07-07 20:45:43 +00001547static char getprotobyname_doc[] =
1548"getprotobyname(name) -> integer\n\
1549\n\
1550Return the protocol number for the named protocol. (Rarely used.)";
1551
Guido van Rossum3901d851996-12-19 16:35:04 +00001552
Guido van Rossum30a685f1991-06-27 15:51:29 +00001553/* Python interface to socket(family, type, proto).
1554 The third (protocol) argument is optional.
1555 Return a new socket object. */
1556
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001557/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001558static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001559BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001560{
Guido van Rossum73624e91994-10-10 17:59:00 +00001561 PySocketSockObject *s;
Guido van Rossum6f489d91996-06-28 20:15:15 +00001562#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001563 SOCKET fd;
1564#else
1565 int fd;
1566#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001567 int family, type, proto = 0;
1568 if (!PyArg_ParseTuple(args, "ii|i", &family, &type, &proto))
1569 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001570 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001571 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001572 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001573#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001574 if (fd == INVALID_SOCKET)
1575#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001576 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001577#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001578 return PySocket_Err();
1579 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001580 /* If the object can't be created, don't forget to close the
1581 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001582 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001583 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001584 /* From now on, ignore SIGPIPE and let the error checking
1585 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001586#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001587 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001588#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001589 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001590}
1591
Guido van Rossum82a5c661998-07-07 20:45:43 +00001592static char socket_doc[] =
1593"socket(family, type[, proto]) -> socket object\n\
1594\n\
1595Open a socket of the given type. The family argument specifies the\n\
1596address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1597The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1598or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1599specifying the default protocol.";
1600
1601
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001602#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001603/* Create a socket object from a numeric file description.
1604 Useful e.g. if stdin is a socket.
1605 Additional arguments as for socket(). */
1606
1607/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001608static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001609BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001610{
Guido van Rossum73624e91994-10-10 17:59:00 +00001611 PySocketSockObject *s;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001612 int fd, family, type, proto = 0;
1613 if (!PyArg_ParseTuple(args, "iii|i", &fd, &family, &type, &proto))
1614 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001615 /* Dup the fd so it and the socket can be closed independently */
1616 fd = dup(fd);
1617 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001618 return PySocket_Err();
1619 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001620 /* From now on, ignore SIGPIPE and let the error checking
1621 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001622#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001623 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001624#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001625 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001626}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001627
1628static char fromfd_doc[] =
1629"fromfd(fd, family, type[, proto]) -> socket object\n\
1630\n\
1631Create a socket object from the given file descriptor.\n\
1632The remaining arguments are the same as for socket().";
1633
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001634#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001635
Guido van Rossum82a5c661998-07-07 20:45:43 +00001636
Guido van Rossum006bf911996-06-12 04:04:55 +00001637static PyObject *
1638BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1639{
1640 int x1, x2;
1641
1642 if (!PyArg_Parse(args, "i", &x1)) {
1643 return NULL;
1644 }
1645 x2 = (int)ntohs((short)x1);
1646 return PyInt_FromLong(x2);
1647}
1648
Guido van Rossum82a5c661998-07-07 20:45:43 +00001649static char ntohs_doc[] =
1650"ntohs(integer) -> integer\n\
1651\n\
1652Convert a 16-bit integer from network to host byte order.";
1653
1654
Guido van Rossum006bf911996-06-12 04:04:55 +00001655static PyObject *
1656BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1657{
1658 int x1, x2;
1659
1660 if (!PyArg_Parse(args, "i", &x1)) {
1661 return NULL;
1662 }
1663 x2 = ntohl(x1);
1664 return PyInt_FromLong(x2);
1665}
1666
Guido van Rossum82a5c661998-07-07 20:45:43 +00001667static char ntohl_doc[] =
1668"ntohl(integer) -> integer\n\
1669\n\
1670Convert a 32-bit integer from network to host byte order.";
1671
1672
Guido van Rossum006bf911996-06-12 04:04:55 +00001673static PyObject *
1674BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1675{
1676 int x1, x2;
1677
1678 if (!PyArg_Parse(args, "i", &x1)) {
1679 return NULL;
1680 }
1681 x2 = (int)htons((short)x1);
1682 return PyInt_FromLong(x2);
1683}
1684
Guido van Rossum82a5c661998-07-07 20:45:43 +00001685static char htons_doc[] =
1686"htons(integer) -> integer\n\
1687\n\
1688Convert a 16-bit integer from host to network byte order.";
1689
1690
Guido van Rossum006bf911996-06-12 04:04:55 +00001691static PyObject *
1692BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1693{
1694 int x1, x2;
1695
1696 if (!PyArg_Parse(args, "i", &x1)) {
1697 return NULL;
1698 }
1699 x2 = htonl(x1);
1700 return PyInt_FromLong(x2);
1701}
1702
Guido van Rossum82a5c661998-07-07 20:45:43 +00001703static char htonl_doc[] =
1704"htonl(integer) -> integer\n\
1705\n\
1706Convert a 32-bit integer from host to network byte order.";
1707
1708
Guido van Rossum30a685f1991-06-27 15:51:29 +00001709/* List of functions exported by this module. */
1710
Guido van Rossum73624e91994-10-10 17:59:00 +00001711static PyMethodDef PySocket_methods[] = {
Guido van Rossum82a5c661998-07-07 20:45:43 +00001712 {"gethostbyname", PySocket_gethostbyname, 0, gethostbyname_doc},
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001713 {"gethostbyname_ex", PySocket_gethostbyname_ex, 0, ghbn_ex_doc},
Guido van Rossum82a5c661998-07-07 20:45:43 +00001714 {"gethostbyaddr", PySocket_gethostbyaddr, 0, gethostbyaddr_doc},
1715 {"gethostname", PySocket_gethostname, 0, gethostname_doc},
1716 {"getservbyname", PySocket_getservbyname, 0, getservbyname_doc},
1717 {"getprotobyname", PySocket_getprotobyname, 0,getprotobyname_doc},
1718 {"socket", PySocket_socket, 1, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001719#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001720 {"fromfd", PySocket_fromfd, 1, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001721#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001722 {"ntohs", PySocket_ntohs, 0, ntohs_doc},
1723 {"ntohl", PySocket_ntohl, 0, ntohl_doc},
1724 {"htons", PySocket_htons, 0, htons_doc},
1725 {"htonl", PySocket_htonl, 0, htonl_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001726 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001727};
1728
Guido van Rossum30a685f1991-06-27 15:51:29 +00001729
1730/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00001731 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001732 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00001733 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001734static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001735BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001736{
Guido van Rossum73624e91994-10-10 17:59:00 +00001737 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00001738 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001739 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00001740
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001741 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001742}
1743
Guido van Rossum30a685f1991-06-27 15:51:29 +00001744
Guido van Rossum8d665e61996-06-26 18:22:49 +00001745#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001746
1747/* Additional initialization and cleanup for NT/Windows */
1748
1749static void
1750NTcleanup()
1751{
1752 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00001753}
1754
1755static int
1756NTinit()
1757{
1758 WSADATA WSAData;
1759 int ret;
1760 char buf[100];
1761 ret = WSAStartup(0x0101, &WSAData);
1762 switch (ret) {
1763 case 0: /* no error */
1764 atexit(NTcleanup);
1765 return 1;
1766 case WSASYSNOTREADY:
1767 PyErr_SetString(PyExc_ImportError,
1768 "WSAStartup failed: network not ready");
1769 break;
1770 case WSAVERNOTSUPPORTED:
1771 case WSAEINVAL:
1772 PyErr_SetString(PyExc_ImportError,
1773 "WSAStartup failed: requested version not supported");
1774 break;
1775 default:
1776 sprintf(buf, "WSAStartup failed: error code %d", ret);
1777 PyErr_SetString(PyExc_ImportError, buf);
1778 break;
1779 }
1780 return 0;
1781}
1782
Guido van Rossum8d665e61996-06-26 18:22:49 +00001783#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00001784
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001785#if defined(PYOS_OS2)
1786
1787/* Additional initialization and cleanup for OS/2 */
1788
1789static void
1790OS2cleanup()
1791{
1792 /* No cleanup is necessary for OS/2 Sockets */
1793}
1794
1795static int
1796OS2init()
1797{
1798 char reason[64];
1799 int rc = sock_init();
1800
1801 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00001802 atexit(OS2cleanup);
1803 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001804 }
1805
1806 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
1807 PyErr_SetString(PyExc_ImportError, reason);
1808
Guido van Rossum32c575d1997-12-02 20:37:32 +00001809 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001810}
1811
1812#endif /* PYOS_OS2 */
1813
Guido van Rossumbe32c891996-06-20 16:25:29 +00001814
Guido van Rossum30a685f1991-06-27 15:51:29 +00001815/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001816 * This is called when the first 'import socket' is done,
1817 * via a table in config.c, if config.c is compiled with USE_SOCKET
1818 * defined.
1819 *
1820 * For MS_WINDOWS (which means any Windows variant), this module
1821 * is actually called "_socket", and there's a wrapper "socket.py"
1822 * which implements some missing functionality (such as makefile(),
1823 * dup() and fromfd()). The import of "_socket" may fail with an
1824 * ImportError exception if initialization of WINSOCK fails. When
1825 * WINSOCK is initialized succesfully, a call to WSACleanup() is
1826 * scheduled to be made at exit time.
1827 *
1828 * For OS/2, this module is also called "_socket" and uses a wrapper
1829 * "socket.py" which implements that functionality that is missing
1830 * when PC operating systems don't put socket descriptors in the
1831 * operating system's filesystem layer.
1832 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001833
Guido van Rossum82a5c661998-07-07 20:45:43 +00001834static char module_doc[] =
1835"This module provides socket operations and some related functions.\n\
1836On Unix, it supports IP (Internet Protocol) and Unix domain sockets.\n\
1837On other systems, it only supports IP.\n\
1838\n\
1839Functions:\n\
1840\n\
1841socket() -- create a new socket object\n\
1842fromfd() -- create a socket object from an open file descriptor (*)\n\
1843gethostname() -- return the current hostname\n\
1844gethostbyname() -- map a hostname to its IP number\n\
1845gethostbyaddr() -- map an IP number or hostname to DNS info\n\
1846getservbyname() -- map a service name and a protocol name to a port number\n\
1847getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\
1848ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\
1849htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\
1850\n\
1851(*) not available on all platforms!)\n\
1852\n\
1853Special objects:\n\
1854\n\
1855SocketType -- type object for socket objects\n\
1856error -- exception raised for I/O errors\n\
1857\n\
1858Integer constants:\n\
1859\n\
1860AF_INET, AF_UNIX -- socket domains (first argument to socket() call)\n\
1861SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)\n\
1862\n\
1863Many other constants may be defined; these may be used in calls to\n\
1864the setsockopt() and getsockopt() methods.\n\
1865";
1866
1867static char sockettype_doc[] =
1868"A socket represents one endpoint of a network connection.\n\
1869\n\
1870Methods:\n\
1871\n\
1872accept() -- accept a connection, returning new socket and client address\n\
1873bind() -- bind the socket to a local address\n\
1874close() -- close the socket\n\
1875connect() -- connect the socket to a remote address\n\
1876connect_ex() -- connect, return an error code instead of an exception \n\
1877dup() -- return a new socket object identical to the current one (*)\n\
1878fileno() -- return underlying file descriptor\n\
1879getpeername() -- return remote address (*)\n\
1880getsockname() -- return local address\n\
1881getsockopt() -- get socket options\n\
1882listen() -- start listening for incoming connections\n\
1883makefile() -- return a file object corresponding tot the socket (*)\n\
1884recv() -- receive data\n\
1885recvfrom() -- receive data and sender's address\n\
1886send() -- send data\n\
1887sendto() -- send data to a given address\n\
1888setblocking() -- set or clear the blocking I/O flag\n\
1889setsockopt() -- set socket options\n\
1890shutdown() -- shut down traffic in one or both directions\n\
1891\n\
1892(*) not available on all platforms!)";
1893
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001894void
Guido van Rossumbcc20741998-08-04 22:53:56 +00001895#if defined(MS_WINDOWS) || defined(PYOS_OS2) || defined(__BEOS__)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001896init_socket()
1897#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001898initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00001899#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001900{
Guido van Rossum73624e91994-10-10 17:59:00 +00001901 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001902#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001903 if (!NTinit())
1904 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00001905 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001906#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00001907#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001908 if (!OS2init())
1909 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00001910 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum32c575d1997-12-02 20:37:32 +00001911#else
Guido van Rossumbcc20741998-08-04 22:53:56 +00001912#if defined(__BEOS__)
1913 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
1914#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001915 m = Py_InitModule3("socket", PySocket_methods, module_doc);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001916#endif /* __BEOS__ */
Guido van Rossum32c575d1997-12-02 20:37:32 +00001917#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001918#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001919 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001920 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
1921 if (PySocket_Error == NULL)
1922 return;
1923 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00001924 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00001925 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00001926 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00001927 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00001928 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001929 return;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001930 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001931#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001932 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001933#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001934 insint(d, "SOCK_STREAM", SOCK_STREAM);
1935 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001936#ifndef __BEOS__
1937/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001938 insint(d, "SOCK_RAW", SOCK_RAW);
1939 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1940 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001941#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001942
1943#ifdef SO_DEBUG
1944 insint(d, "SO_DEBUG", SO_DEBUG);
1945#endif
1946#ifdef SO_ACCEPTCONN
1947 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
1948#endif
1949#ifdef SO_REUSEADDR
1950 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
1951#endif
1952#ifdef SO_KEEPALIVE
1953 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
1954#endif
1955#ifdef SO_DONTROUTE
1956 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
1957#endif
1958#ifdef SO_BROADCAST
1959 insint(d, "SO_BROADCAST", SO_BROADCAST);
1960#endif
1961#ifdef SO_USELOOPBACK
1962 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
1963#endif
1964#ifdef SO_LINGER
1965 insint(d, "SO_LINGER", SO_LINGER);
1966#endif
1967#ifdef SO_OOBINLINE
1968 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
1969#endif
1970#ifdef SO_REUSEPORT
1971 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
1972#endif
1973
1974#ifdef SO_SNDBUF
1975 insint(d, "SO_SNDBUF", SO_SNDBUF);
1976#endif
1977#ifdef SO_RCVBUF
1978 insint(d, "SO_RCVBUF", SO_RCVBUF);
1979#endif
1980#ifdef SO_SNDLOWAT
1981 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
1982#endif
1983#ifdef SO_RCVLOWAT
1984 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
1985#endif
1986#ifdef SO_SNDTIMEO
1987 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
1988#endif
1989#ifdef SO_RCVTIMEO
1990 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
1991#endif
1992#ifdef SO_ERROR
1993 insint(d, "SO_ERROR", SO_ERROR);
1994#endif
1995#ifdef SO_TYPE
1996 insint(d, "SO_TYPE", SO_TYPE);
1997#endif
1998
1999 /* Maximum number of connections for "listen" */
2000#ifdef SOMAXCONN
2001 insint(d, "SOMAXCONN", SOMAXCONN);
2002#else
2003 insint(d, "SOMAXCONN", 5); /* Common value */
2004#endif
2005
2006 /* Flags for send, recv */
2007#ifdef MSG_OOB
2008 insint(d, "MSG_OOB", MSG_OOB);
2009#endif
2010#ifdef MSG_PEEK
2011 insint(d, "MSG_PEEK", MSG_PEEK);
2012#endif
2013#ifdef MSG_DONTROUTE
2014 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2015#endif
2016#ifdef MSG_EOR
2017 insint(d, "MSG_EOR", MSG_EOR);
2018#endif
2019#ifdef MSG_TRUNC
2020 insint(d, "MSG_TRUNC", MSG_TRUNC);
2021#endif
2022#ifdef MSG_CTRUNC
2023 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2024#endif
2025#ifdef MSG_WAITALL
2026 insint(d, "MSG_WAITALL", MSG_WAITALL);
2027#endif
2028#ifdef MSG_BTAG
2029 insint(d, "MSG_BTAG", MSG_BTAG);
2030#endif
2031#ifdef MSG_ETAG
2032 insint(d, "MSG_ETAG", MSG_ETAG);
2033#endif
2034
2035 /* Protocol level and numbers, usable for [gs]etsockopt */
Guido van Rossum578de301998-05-28 20:18:18 +00002036/* Sigh -- some systems (e.g. Linux) use enums for these. */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002037#ifdef SOL_SOCKET
2038 insint(d, "SOL_SOCKET", SOL_SOCKET);
2039#endif
2040#ifdef IPPROTO_IP
2041 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002042#else
2043 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002044#endif
2045#ifdef IPPROTO_ICMP
2046 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002047#else
2048 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002049#endif
2050#ifdef IPPROTO_IGMP
2051 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2052#endif
2053#ifdef IPPROTO_GGP
2054 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2055#endif
2056#ifdef IPPROTO_TCP
2057 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002058#else
2059 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002060#endif
2061#ifdef IPPROTO_EGP
2062 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2063#endif
2064#ifdef IPPROTO_PUP
2065 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2066#endif
2067#ifdef IPPROTO_UDP
2068 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002069#else
2070 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002071#endif
2072#ifdef IPPROTO_IDP
2073 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2074#endif
2075#ifdef IPPROTO_HELLO
2076 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2077#endif
2078#ifdef IPPROTO_ND
2079 insint(d, "IPPROTO_ND", IPPROTO_ND);
2080#endif
2081#ifdef IPPROTO_TP
2082 insint(d, "IPPROTO_TP", IPPROTO_TP);
2083#endif
2084#ifdef IPPROTO_XTP
2085 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2086#endif
2087#ifdef IPPROTO_EON
2088 insint(d, "IPPROTO_EON", IPPROTO_EON);
2089#endif
2090#ifdef IPPROTO_BIP
2091 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2092#endif
2093/**/
2094#ifdef IPPROTO_RAW
2095 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002096#else
2097 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002098#endif
2099#ifdef IPPROTO_MAX
2100 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2101#endif
2102
2103 /* Some port configuration */
2104#ifdef IPPORT_RESERVED
2105 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2106#else
2107 insint(d, "IPPORT_RESERVED", 1024);
2108#endif
2109#ifdef IPPORT_USERRESERVED
2110 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2111#else
2112 insint(d, "IPPORT_USERRESERVED", 5000);
2113#endif
2114
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002115 /* Some reserved IP v.4 addresses */
2116#ifdef INADDR_ANY
2117 insint(d, "INADDR_ANY", INADDR_ANY);
2118#else
2119 insint(d, "INADDR_ANY", 0x00000000);
2120#endif
2121#ifdef INADDR_BROADCAST
2122 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2123#else
2124 insint(d, "INADDR_BROADCAST", 0xffffffff);
2125#endif
2126#ifdef INADDR_LOOPBACK
2127 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2128#else
2129 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2130#endif
2131#ifdef INADDR_UNSPEC_GROUP
2132 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2133#else
2134 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2135#endif
2136#ifdef INADDR_ALLHOSTS_GROUP
2137 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2138#else
2139 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2140#endif
2141#ifdef INADDR_MAX_LOCAL_GROUP
2142 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2143#else
2144 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2145#endif
2146#ifdef INADDR_NONE
2147 insint(d, "INADDR_NONE", INADDR_NONE);
2148#else
2149 insint(d, "INADDR_NONE", 0xffffffff);
2150#endif
2151
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002152 /* IP [gs]etsockopt options */
2153#ifdef IP_OPTIONS
2154 insint(d, "IP_OPTIONS", IP_OPTIONS);
2155#endif
2156#ifdef IP_HDRINCL
2157 insint(d, "IP_HDRINCL", IP_HDRINCL);
2158#endif
2159#ifdef IP_TOS
2160 insint(d, "IP_TOS", IP_TOS);
2161#endif
2162#ifdef IP_TTL
2163 insint(d, "IP_TTL", IP_TTL);
2164#endif
2165#ifdef IP_RECVOPTS
2166 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2167#endif
2168#ifdef IP_RECVRETOPTS
2169 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2170#endif
2171#ifdef IP_RECVDSTADDR
2172 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2173#endif
2174#ifdef IP_RETOPTS
2175 insint(d, "IP_RETOPTS", IP_RETOPTS);
2176#endif
2177#ifdef IP_MULTICAST_IF
2178 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2179#endif
2180#ifdef IP_MULTICAST_TTL
2181 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2182#endif
2183#ifdef IP_MULTICAST_LOOP
2184 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2185#endif
2186#ifdef IP_ADD_MEMBERSHIP
2187 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2188#endif
2189#ifdef IP_DROP_MEMBERSHIP
2190 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2191#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002192
2193 /* Initialize gethostbyname lock */
2194#if defined(WITH_THREAD) && !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
2195 gethostbyname_lock = allocate_lock();
2196#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002197}