blob: 0eb3fd539257c0ef81419a356530790c1b208de4 [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 Rossum8e9ebfd1997-11-22 21:53:48 +000097#if !defined(MS_WINDOWS) && !defined(PYOS_OS2)
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 Rossumb6775db1994-08-01 11:34:53 +0000116#include <sys/types.h>
117#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +0000118
Guido van Rossum81194471991-07-27 21:42:02 +0000119#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000120#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000121#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000122#include <sys/socket.h>
123#include <netinet/in.h>
Guido van Rossume4485b01994-09-07 14:32:49 +0000124#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000125#else
126#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000127#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000128#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000129#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000130#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000131#else
132#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000133#endif
134
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000135#ifndef O_NDELAY
136#define O_NDELAY O_NONBLOCK /* For QNX only? */
137#endif
138
Jack Jansen508537b1996-02-14 15:57:45 +0000139#ifdef USE_GUSI
140/* fdopen() isn't declared in stdio.h (sigh) */
141#include <GUSI.h>
142#endif
143
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000144
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000145/* Here we have some hacks to choose between K&R or ANSI style function
146 definitions. For NT to build this as an extension module (ie, DLL)
147 it must be compiled by the C++ compiler, as it takes the address of
148 a static data item exported from the main Python DLL.
149*/
Guido van Rossum8d665e61996-06-26 18:22:49 +0000150#ifdef MS_WINDOWS
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000151/* seem to be a few differences in the API */
152#define close closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000153#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000154#define FORCE_ANSI_FUNC_DEFS
155#endif
156
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000157#if defined(PYOS_OS2)
158#define close soclose
159#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
160#define FORCE_ANSI_FUNC_DEFS
161#endif
162
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000163#ifdef FORCE_ANSI_FUNC_DEFS
164#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
165fnname( arg1type arg1name )
166
167#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
168fnname( arg1type arg1name, arg2type arg2name )
169
170#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
171fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
172
173#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
174fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
175
176#else /* !FORCE_ANSI_FN_DEFS */
177#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
178fnname( arg1name ) \
179 arg1type arg1name;
180
181#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
182fnname( arg1name, arg2name ) \
183 arg1type arg1name; \
184 arg2type arg2name;
185
186#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
187fnname( arg1name, arg2name, arg3name ) \
188 arg1type arg1name; \
189 arg2type arg2name; \
190 arg3type arg3name;
191
192#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
193fnname( arg1name, arg2name, arg3name, arg4name ) \
194 arg1type arg1name; \
195 arg2type arg2name; \
196 arg3type arg3name; \
197 arg4type arg4name;
198
199#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000200
201/* Global variable holding the exception type for errors detected
202 by this module (but not argument type or memory errors, etc.). */
203
Guido van Rossum73624e91994-10-10 17:59:00 +0000204static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000205
206
207/* Convenience function to raise an error according to errno
208 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000209
Guido van Rossum73624e91994-10-10 17:59:00 +0000210static PyObject *
211PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000212{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000213#ifdef MS_WINDOWS
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000214 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000215 PyObject *v;
216 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000217 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000218 PyErr_SetObject(PySocket_Error, v);
219 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000220 }
221 return NULL;
222 }
223 else
224#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000225
226#if defined(PYOS_OS2)
227 if (sock_errno() != NO_ERROR) {
228 APIRET rc;
229 ULONG msglen;
230 char outbuf[100];
231 int myerrorcode = sock_errno();
232
233 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
234 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
235 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
236 if (rc == NO_ERROR) {
237 PyObject *v;
238
239 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
240 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
241 char *lastc = &outbuf[ strlen(outbuf)-1 ];
242 while (lastc > outbuf && isspace(*lastc))
243 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
244 }
245 v = Py_BuildValue("(is)", myerrorcode, outbuf);
246 if (v != NULL) {
247 PyErr_SetObject(PySocket_Error, v);
248 Py_DECREF(v);
249 }
250 return NULL;
251 }
252 }
253#endif
254
Guido van Rossum73624e91994-10-10 17:59:00 +0000255 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000256}
257
Guido van Rossum30a685f1991-06-27 15:51:29 +0000258
259/* The object holding a socket. It holds some extra information,
260 like the address family, which is used to decode socket address
261 arguments properly. */
262
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000263typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000264 PyObject_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000265 int sock_fd; /* Socket file descriptor */
266 int sock_family; /* Address family, e.g., AF_INET */
267 int sock_type; /* Socket type, e.g., SOCK_STREAM */
268 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000269 union sock_addr {
270 struct sockaddr_in in;
271#ifdef AF_UNIX
272 struct sockaddr_un un;
273#endif
274 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000275} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000276
Guido van Rossum30a685f1991-06-27 15:51:29 +0000277
278/* A forward reference to the Socktype type object.
279 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000280 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000281 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000282
Guido van Rossum73624e91994-10-10 17:59:00 +0000283staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000284
Guido van Rossum30a685f1991-06-27 15:51:29 +0000285
286/* Create a new socket object.
287 This just creates the object and initializes it.
288 If the creation fails, return NULL and set an exception (implicit
289 in NEWOBJ()). */
290
Guido van Rossum73624e91994-10-10 17:59:00 +0000291static PySocketSockObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000292BUILD_FUNC_DEF_4(PySocketSock_New,int,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000293{
Guido van Rossum73624e91994-10-10 17:59:00 +0000294 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000295 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum73624e91994-10-10 17:59:00 +0000296 s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000297 if (s != NULL) {
298 s->sock_fd = fd;
299 s->sock_family = family;
300 s->sock_type = type;
301 s->sock_proto = proto;
302 }
303 return s;
304}
305
Guido van Rossum30a685f1991-06-27 15:51:29 +0000306
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000307/* Lock to allow python interpreter to continue, but only allow one
308 thread to be in gethostbyname */
309#if defined(WITH_THREAD) && !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
310type_lock gethostbyname_lock;
311#endif
312
313
Guido van Rossum30a685f1991-06-27 15:51:29 +0000314/* Convert a string specifying a host name or one of a few symbolic
315 names to a numeric IP address. This usually calls gethostbyname()
316 to do the work; the names "" and "<broadcast>" are special.
317 Return the length (should always be 4 bytes), or negative if
318 an error occurred; then an exception is raised. */
319
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000320static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000321BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000322{
323 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000324 int d1, d2, d3, d4;
325 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000326#ifdef HAVE_GETHOSTBYNAME_R
327 struct hostent hp_allocated;
328 char buf[1001];
329 int buf_len = (sizeof buf) - 1;
330 int errnop;
331#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000332
Guido van Rossuma376cc51996-12-05 23:43:35 +0000333 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000334 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000335 addr_ret->sin_addr.s_addr = INADDR_ANY;
336 return 4;
337 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000338 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000339 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
340 return 4;
341 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000342 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
343 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
344 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
345 addr_ret->sin_addr.s_addr = htonl(
346 ((long) d1 << 24) | ((long) d2 << 16) |
347 ((long) d3 << 8) | ((long) d4 << 0));
348 return 4;
349 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000350 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000351#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000352 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000353#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000354#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
355 acquire_lock(gethostbyname_lock,1);
356#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000357 hp = gethostbyname(name);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000358#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
359 release_lock(gethostbyname_lock);
360#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000361#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000362 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000363
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000364 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000365#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000366 /* Let's get real error message to return */
367 extern int h_errno;
368 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
369#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000370 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000371#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000372 return -1;
373 }
374 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
375 return hp->h_length;
376}
377
Guido van Rossum30a685f1991-06-27 15:51:29 +0000378
Guido van Rossum30a685f1991-06-27 15:51:29 +0000379/* Create a string object representing an IP address.
380 This is always a string of the form 'dd.dd.dd.dd' (with variable
381 size numbers). */
382
Guido van Rossum73624e91994-10-10 17:59:00 +0000383static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000384BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000385{
386 long x = ntohl(addr->sin_addr.s_addr);
387 char buf[100];
388 sprintf(buf, "%d.%d.%d.%d",
389 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
390 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000391 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000392}
393
394
395/* Create an object representing the given socket address,
396 suitable for passing it back to bind(), connect() etc.
397 The family field of the sockaddr structure is inspected
398 to determine what kind of address it really is. */
399
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000400/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000401static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000402BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000403{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000404 if (addrlen == 0) {
405 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000406 Py_INCREF(Py_None);
407 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000408 }
409
Guido van Rossum30a685f1991-06-27 15:51:29 +0000410 switch (addr->sa_family) {
411
412 case AF_INET:
413 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000414 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000415 PyObject *addrobj = makeipaddr(a);
416 PyObject *ret = NULL;
417 if (addrobj) {
418 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
419 Py_DECREF(addrobj);
420 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000421 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000422 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000423
Guido van Rossumb6775db1994-08-01 11:34:53 +0000424#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000425 case AF_UNIX:
426 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000427 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000428 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000429 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000430#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000431
432 /* More cases here... */
433
434 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000435 /* If we don't know the address family, don't raise an
436 exception -- return it as a tuple. */
437 return Py_BuildValue("is#",
438 addr->sa_family,
439 addr->sa_data,
440 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000441
Guido van Rossum30a685f1991-06-27 15:51:29 +0000442 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000443}
444
Guido van Rossum30a685f1991-06-27 15:51:29 +0000445
446/* Parse a socket address argument according to the socket object's
447 address family. Return 1 if the address was in the proper format,
448 0 of not. The address is returned through addr_ret, its length
449 through len_ret. */
450
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000451static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000452BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000453getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000454{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000455 switch (s->sock_family) {
456
Guido van Rossumb6775db1994-08-01 11:34:53 +0000457#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000458 case AF_UNIX:
459 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000460 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000461 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000462 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000463 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum73624e91994-10-10 17:59:00 +0000464 if (!PyArg_Parse(args, "s#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000465 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000466 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000467 PyErr_SetString(PySocket_Error,
468 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000469 return 0;
470 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000471 addr->sun_family = AF_UNIX;
472 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000473 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000474 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000475 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000476 return 1;
477 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000478#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000479
Guido van Rossum30a685f1991-06-27 15:51:29 +0000480 case AF_INET:
481 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000482 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000483 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000484 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000485 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000486 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000487 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000488 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000489 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000490 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000491 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000492 *addr_ret = (struct sockaddr *) addr;
493 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000494 return 1;
495 }
496
Guido van Rossum30a685f1991-06-27 15:51:29 +0000497 /* More cases here... */
498
499 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000500 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000501 return 0;
502
503 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000504}
505
Guido van Rossum30a685f1991-06-27 15:51:29 +0000506
Guido van Rossum710e1df1992-06-12 10:39:36 +0000507/* Get the address length according to the socket object's address family.
508 Return 1 if the family is known, 0 otherwise. The length is returned
509 through len_ret. */
510
511static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000512BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000513{
514 switch (s->sock_family) {
515
Guido van Rossumb6775db1994-08-01 11:34:53 +0000516#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000517 case AF_UNIX:
518 {
519 *len_ret = sizeof (struct sockaddr_un);
520 return 1;
521 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000522#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000523
524 case AF_INET:
525 {
526 *len_ret = sizeof (struct sockaddr_in);
527 return 1;
528 }
529
530 /* More cases here... */
531
532 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000533 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000534 return 0;
535
536 }
537}
538
539
Guido van Rossum30a685f1991-06-27 15:51:29 +0000540/* s.accept() method */
541
Guido van Rossum73624e91994-10-10 17:59:00 +0000542static PyObject *
543BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000544{
545 char addrbuf[256];
546 int addrlen, newfd;
Barry Warsaw752300b1997-01-03 17:18:10 +0000547 PyObject *sock = NULL;
548 PyObject *addr = NULL;
549 PyObject *res = NULL;
550
Guido van Rossum73624e91994-10-10 17:59:00 +0000551 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000552 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000553 if (!getsockaddrlen(s, &addrlen))
554 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000555 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000556 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000557 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000558 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000559 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000560
Guido van Rossum30a685f1991-06-27 15:51:29 +0000561 /* Create the new object with unspecified family,
562 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000563 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000564 s->sock_family,
565 s->sock_type,
566 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000567 if (sock == NULL) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000568 close(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000569 goto finally;
570 }
571 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
572 goto finally;
573
574 if (!(res = Py_BuildValue("OO", sock, addr)))
575 goto finally;
576
577 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000578 Py_XDECREF(sock);
579 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000580 return res;
581}
582
Guido van Rossum82a5c661998-07-07 20:45:43 +0000583static char accept_doc[] =
584"accept() -> (socket object, address info)\n\
585\n\
586Wait for an incoming connection. Return a new socket representing the\n\
587connection, and the address of the client. For IP sockets, the address\n\
588info is a pair (hostaddr, port).";
589
Guido van Rossum30a685f1991-06-27 15:51:29 +0000590
Guido van Rossume4485b01994-09-07 14:32:49 +0000591/* s.setblocking(1 | 0) method */
592
Guido van Rossum73624e91994-10-10 17:59:00 +0000593static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000594BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000595{
596 int block;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000597#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000598 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000599#endif
Guido van Rossumfe28fa01997-05-15 19:09:26 +0000600 if (!PyArg_Parse(args, "i", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000601 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000602 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +0000603#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000604#ifdef PYOS_OS2
605 block = !block;
606 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
607#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000608 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
609 if (block)
610 delay_flag &= (~O_NDELAY);
611 else
612 delay_flag |= O_NDELAY;
613 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000614#endif /* !PYOS_OS2 */
615#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000616 block = !block;
617 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000618#endif /* MS_WINDOWS */
Guido van Rossum73624e91994-10-10 17:59:00 +0000619 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000620
Guido van Rossum73624e91994-10-10 17:59:00 +0000621 Py_INCREF(Py_None);
622 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000623}
Guido van Rossume4485b01994-09-07 14:32:49 +0000624
Guido van Rossum82a5c661998-07-07 20:45:43 +0000625static char setblocking_doc[] =
626"setblocking(flag)\n\
627\n\
628Set the socket to blocking (flag is true) or non-blocking (false).\n\
629This uses the FIONBIO ioctl with the O_NDELAY flag.";
630
Guido van Rossume4485b01994-09-07 14:32:49 +0000631
Guido van Rossumaee08791992-09-08 09:05:33 +0000632/* s.setsockopt() method.
633 With an integer third argument, sets an integer option.
634 With a string third argument, sets an option from a buffer;
635 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000636
Guido van Rossum73624e91994-10-10 17:59:00 +0000637static PyObject *
638BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000639{
640 int level;
641 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000642 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000643 char *buf;
644 int buflen;
645 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000646
Guido van Rossum73624e91994-10-10 17:59:00 +0000647 if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000648 buf = (char *) &flag;
649 buflen = sizeof flag;
650 }
651 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000652 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +0000653 if (!PyArg_Parse(args, "(iis#)", &level, &optname,
654 &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000655 return NULL;
656 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000657 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000658 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000659 return PySocket_Err();
660 Py_INCREF(Py_None);
661 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000662}
663
Guido van Rossum82a5c661998-07-07 20:45:43 +0000664static char setsockopt_doc[] =
665"setsockopt(level, option, value)\n\
666\n\
667Set a socket option. See the Unix manual for level and option.\n\
668The value argument can either be an integer or a string.";
669
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000670
Guido van Rossumaee08791992-09-08 09:05:33 +0000671/* s.getsockopt() method.
672 With two arguments, retrieves an integer option.
673 With a third integer argument, retrieves a string buffer of that size;
674 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000675
Guido van Rossum73624e91994-10-10 17:59:00 +0000676static PyObject *
677BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000678{
679 int level;
680 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000681 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000682 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000683 int buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000684
Guido van Rossumbe32c891996-06-20 16:25:29 +0000685 if (!PyArg_ParseTuple(args, "ii|i", &level, &optname, &buflen))
686 return NULL;
687
688 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000689 int flag = 0;
690 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000691 res = getsockopt(s->sock_fd, level, optname,
692 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000693 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000694 return PySocket_Err();
695 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000696 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000697 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000698 PyErr_SetString(PySocket_Error,
699 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000700 return NULL;
701 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000702 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000703 if (buf == NULL)
704 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000705 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000706 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000707 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000708 Py_DECREF(buf);
709 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000710 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000711 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000712 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000713}
714
Guido van Rossum82a5c661998-07-07 20:45:43 +0000715static char getsockopt_doc[] =
716"getsockopt(level, option[, buffersize]) -> value\n\
717\n\
718Get a socket option. See the Unix manual for level and option.\n\
719If a nonzero buffersize argument is given, the return value is a\n\
720string of that length; otherwise it is an integer.";
721
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000722
Guido van Rossum30a685f1991-06-27 15:51:29 +0000723/* s.bind(sockaddr) method */
724
Guido van Rossum73624e91994-10-10 17:59:00 +0000725static PyObject *
726BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000727{
728 struct sockaddr *addr;
729 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000730 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000731 if (!getsockaddrarg(s, args, &addr, &addrlen))
732 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000733 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000734 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000735 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000736 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000737 return PySocket_Err();
738 Py_INCREF(Py_None);
739 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000740}
741
Guido van Rossum82a5c661998-07-07 20:45:43 +0000742static char bind_doc[] =
743"bind(address)\n\
744\n\
745Bind the socket to a local address. For IP sockets, the address is a\n\
746pair (host, port); the host must refer to the local host.";
747
Guido van Rossum30a685f1991-06-27 15:51:29 +0000748
749/* s.close() method.
750 Set the file descriptor to -1 so operations tried subsequently
751 will surely fail. */
752
Guido van Rossum73624e91994-10-10 17:59:00 +0000753static PyObject *
754BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000755{
Guido van Rossum73624e91994-10-10 17:59:00 +0000756 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000757 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000758 if (s->sock_fd != -1) {
759 Py_BEGIN_ALLOW_THREADS
760 (void) close(s->sock_fd);
761 Py_END_ALLOW_THREADS
762 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000763 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000764 Py_INCREF(Py_None);
765 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000766}
767
Guido van Rossum82a5c661998-07-07 20:45:43 +0000768static char close_doc[] =
769"close()\n\
770\n\
771Close the socket. It cannot be used after this call.";
772
Guido van Rossum30a685f1991-06-27 15:51:29 +0000773
774/* s.connect(sockaddr) method */
775
Guido van Rossum73624e91994-10-10 17:59:00 +0000776static PyObject *
777BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000778{
779 struct sockaddr *addr;
780 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000781 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000782 if (!getsockaddrarg(s, args, &addr, &addrlen))
783 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000784 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000785 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000786 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000787 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000788 return PySocket_Err();
789 Py_INCREF(Py_None);
790 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000791}
792
Guido van Rossum82a5c661998-07-07 20:45:43 +0000793static char connect_doc[] =
794"connect(address)\n\
795\n\
796Connect the socket to a remote address. For IP sockets, the address\n\
797is a pair (host, port).";
798
Guido van Rossum30a685f1991-06-27 15:51:29 +0000799
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000800/* s.connect_ex(sockaddr) method */
801
802static PyObject *
803BUILD_FUNC_DEF_2(PySocketSock_connect_ex,PySocketSockObject *,s, PyObject *,args)
804{
805 struct sockaddr *addr;
806 int addrlen;
807 int res;
808 if (!getsockaddrarg(s, args, &addr, &addrlen))
809 return NULL;
810 Py_BEGIN_ALLOW_THREADS
811 res = connect(s->sock_fd, addr, addrlen);
812 Py_END_ALLOW_THREADS
813 if (res != 0)
814 res = errno;
815 return PyInt_FromLong((long) res);
816}
817
Guido van Rossum82a5c661998-07-07 20:45:43 +0000818static char connect_ex_doc[] =
819"connect_ex(address)\n\
820\n\
821This is like connect(address), but returns an error code (the errno value)\n\
822instead of raising an exception when an error occurs.";
823
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000824
Guido van Rossumed233a51992-06-23 09:07:03 +0000825/* s.fileno() method */
826
Guido van Rossum73624e91994-10-10 17:59:00 +0000827static PyObject *
828BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000829{
Guido van Rossum73624e91994-10-10 17:59:00 +0000830 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000831 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000832 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000833}
834
Guido van Rossum82a5c661998-07-07 20:45:43 +0000835static char fileno_doc[] =
836"fileno() -> integer\n\
837\n\
838Return the integer file descriptor of the socket.";
839
Guido van Rossumed233a51992-06-23 09:07:03 +0000840
Guido van Rossumbe32c891996-06-20 16:25:29 +0000841#ifndef NO_DUP
842/* s.dup() method */
843
844static PyObject *
845BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
846{
847 int newfd;
848 PyObject *sock;
849 if (!PyArg_NoArgs(args))
850 return NULL;
851 newfd = dup(s->sock_fd);
852 if (newfd < 0)
853 return PySocket_Err();
854 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +0000855 s->sock_family,
856 s->sock_type,
857 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +0000858 if (sock == NULL)
859 close(newfd);
860 return sock;
861}
Guido van Rossum82a5c661998-07-07 20:45:43 +0000862
863static char dup_doc[] =
864"dup() -> socket object\n\
865\n\
866Return a new socket object connected to the same system resource.";
867
Guido van Rossumbe32c891996-06-20 16:25:29 +0000868#endif
869
870
Guido van Rossumc89705d1992-11-26 08:54:07 +0000871/* s.getsockname() method */
872
Guido van Rossum73624e91994-10-10 17:59:00 +0000873static PyObject *
874BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000875{
876 char addrbuf[256];
877 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000878 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000879 return NULL;
880 if (!getsockaddrlen(s, &addrlen))
881 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +0000882 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000883 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000884 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000885 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000886 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000887 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000888 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
889}
890
Guido van Rossum82a5c661998-07-07 20:45:43 +0000891static char getsockname_doc[] =
892"getsockname() -> address info\n\
893\n\
894Return the address of the local endpoint. For IP sockets, the address\n\
895info is a pair (hostaddr, port).";
896
Guido van Rossumc89705d1992-11-26 08:54:07 +0000897
Guido van Rossumb6775db1994-08-01 11:34:53 +0000898#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000899/* s.getpeername() method */
900
Guido van Rossum73624e91994-10-10 17:59:00 +0000901static PyObject *
902BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000903{
904 char addrbuf[256];
905 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000906 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000907 return NULL;
908 if (!getsockaddrlen(s, &addrlen))
909 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000910 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000911 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000912 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000913 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000914 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000915 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
916}
Guido van Rossum82a5c661998-07-07 20:45:43 +0000917
918static char getpeername_doc[] =
919"getpeername() -> address info\n\
920\n\
921Return the address of the remote endpoint. For IP sockets, the address\n\
922info is a pair (hostaddr, port).";
923
Guido van Rossumb6775db1994-08-01 11:34:53 +0000924#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000925
926
Guido van Rossum30a685f1991-06-27 15:51:29 +0000927/* s.listen(n) method */
928
Guido van Rossum73624e91994-10-10 17:59:00 +0000929static PyObject *
930BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000931{
932 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000933 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +0000934 if (!PyArg_Parse(args, "i", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000935 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000936 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000937 if (backlog < 1)
938 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000939 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +0000940 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000941 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000942 return PySocket_Err();
943 Py_INCREF(Py_None);
944 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000945}
946
Guido van Rossum82a5c661998-07-07 20:45:43 +0000947static char listen_doc[] =
948"listen(backlog)\n\
949\n\
950Enable a server to accept connections. The backlog argument must be at\n\
951least 1; it specifies the number of unaccepted connection that the system\n\
952will allow before refusing new connections.";
953
954
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000955#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +0000956/* s.makefile(mode) method.
957 Create a new open file object referring to a dupped version of
958 the socket's file descriptor. (The dup() call is necessary so
959 that the open file and socket objects may be closed independent
960 of each other.)
961 The mode argument specifies 'r' or 'w' passed to fdopen(). */
962
Guido van Rossum73624e91994-10-10 17:59:00 +0000963static PyObject *
964BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000965{
Guido van Rossuma597dde1995-01-10 20:56:29 +0000966 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +0000967 char *mode = "r";
968 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000969 int fd;
970 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +0000971 PyObject *f;
972
973 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000974 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +0000975#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +0000976 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
977 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000978#else
Guido van Rossum82a5c661998-07-07 20:45:43 +0000979 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000980#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +0000981 {
Guido van Rossum6b144911995-03-14 15:05:13 +0000982 if (fd >= 0)
983 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000984 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +0000985 }
986 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
987 if (f != NULL)
988 PyFile_SetBufSize(f, bufsize);
989 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000990}
Guido van Rossum82a5c661998-07-07 20:45:43 +0000991
992static char makefile_doc[] =
993"makefile([mode[, buffersize]]) -> file object\n\
994\n\
995Return a regular file object corresponding to the socket.\n\
996The mode and buffersize arguments are as for the built-in open() function.";
997
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000998#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000999
Guido van Rossum82a5c661998-07-07 20:45:43 +00001000
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001001/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001002
Guido van Rossum73624e91994-10-10 17:59:00 +00001003static PyObject *
1004BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001005{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001006 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001007 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001008 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
1009 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001010 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001011 if (buf == NULL)
1012 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001013 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001014 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001015 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001016 if (n < 0) {
1017 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001018 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001019 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001020 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001021 return NULL;
1022 return buf;
1023}
1024
Guido van Rossum82a5c661998-07-07 20:45:43 +00001025static char recv_doc[] =
1026"recv(buffersize[, flags]) -> data\n\
1027\n\
1028Receive up to buffersize bytes from the socket. For the optional flags\n\
1029argument, see the Unix manual. When no data is available, block until\n\
1030at least one byte is available or until the remote end is closed. When\n\
1031the remote end is closed and all data is read, return the empty string.";
1032
Guido van Rossum30a685f1991-06-27 15:51:29 +00001033
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001034/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001035
Guido van Rossum73624e91994-10-10 17:59:00 +00001036static PyObject *
1037BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001038{
1039 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001040 PyObject *buf = NULL;
1041 PyObject *addr = NULL;
1042 PyObject *ret = NULL;
1043
Guido van Rossumbe32c891996-06-20 16:25:29 +00001044 int addrlen, len, n, flags = 0;
1045 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
1046 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001047 if (!getsockaddrlen(s, &addrlen))
1048 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001049 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001050 if (buf == NULL)
1051 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001052 Py_BEGIN_ALLOW_THREADS
1053 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001054#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001055#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001056 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001057#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001058 (ANY *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001059#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001060#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001061 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001062#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001063 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001064 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001065 if (n < 0) {
1066 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001067 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001068 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001069 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001070 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00001071
1072 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
1073 goto finally;
1074
Guido van Rossum73624e91994-10-10 17:59:00 +00001075 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001076 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001077 Py_XDECREF(addr);
1078 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001079 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001080}
1081
Guido van Rossum82a5c661998-07-07 20:45:43 +00001082static char recvfrom_doc[] =
1083"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1084\n\
1085Like recv(buffersize, flags) but also return the sender's address info.";
1086
Guido van Rossum30a685f1991-06-27 15:51:29 +00001087
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001088/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001089
Guido van Rossum73624e91994-10-10 17:59:00 +00001090static PyObject *
1091BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001092{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001093 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001094 int len, n, flags = 0;
1095 if (!PyArg_ParseTuple(args, "s#|i", &buf, &len, &flags))
1096 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001097 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001098 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001099 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001100 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001101 return PySocket_Err();
1102 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001103}
1104
Guido van Rossum82a5c661998-07-07 20:45:43 +00001105static char send_doc[] =
1106"send(data[, flags])\n\
1107\n\
1108Send a data string to the socket. For the optional flags\n\
1109argument, see the Unix manual.";
1110
Guido van Rossum30a685f1991-06-27 15:51:29 +00001111
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001112/* s.sendto(data, [flags,] sockaddr) 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_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001116{
Guido van Rossum73624e91994-10-10 17:59:00 +00001117 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001118 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001119 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001120 int addrlen, len, n, flags;
1121 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001122 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
1123 PyErr_Clear();
1124 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001125 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001126 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001127 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001128 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001129 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001130 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001131 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001132 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001133 return PySocket_Err();
1134 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001135}
1136
Guido van Rossum82a5c661998-07-07 20:45:43 +00001137static char sendto_doc[] =
1138"sendto(data[, flags], address)\n\
1139\n\
1140Like send(data, flags) but allows specifying the destination address.\n\
1141For IP sockets, the address is a pair (hostaddr, port).";
1142
Guido van Rossum30a685f1991-06-27 15:51:29 +00001143
1144/* s.shutdown(how) method */
1145
Guido van Rossum73624e91994-10-10 17:59:00 +00001146static PyObject *
1147BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001148{
1149 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001150 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +00001151 if (!PyArg_Parse(args, "i", &how))
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 Rossumff4949e1992-08-05 19:58:53 +00001154 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001155 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001156 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001157 return PySocket_Err();
1158 Py_INCREF(Py_None);
1159 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001160}
1161
Guido van Rossum82a5c661998-07-07 20:45:43 +00001162static char shutdown_doc[] =
1163"shutdown(flag)\n\
1164\n\
1165Shut down the reading side of the socket (flag == 0), the writing side\n\
1166of the socket (flag == 1), or both ends (flag == 2).";
1167
Guido van Rossum30a685f1991-06-27 15:51:29 +00001168
1169/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001170
Guido van Rossum73624e91994-10-10 17:59:00 +00001171static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum82a5c661998-07-07 20:45:43 +00001172 {"accept", (PyCFunction)PySocketSock_accept, 0,
1173 accept_doc},
1174 {"bind", (PyCFunction)PySocketSock_bind, 0,
1175 bind_doc},
1176 {"close", (PyCFunction)PySocketSock_close, 0,
1177 close_doc},
1178 {"connect", (PyCFunction)PySocketSock_connect, 0,
1179 connect_doc},
1180 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, 0,
1181 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001182#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001183 {"dup", (PyCFunction)PySocketSock_dup, 0,
1184 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001185#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001186 {"fileno", (PyCFunction)PySocketSock_fileno, 0,
1187 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001188#ifdef HAVE_GETPEERNAME
Guido van Rossum82a5c661998-07-07 20:45:43 +00001189 {"getpeername", (PyCFunction)PySocketSock_getpeername, 0,
1190 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001191#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001192 {"getsockname", (PyCFunction)PySocketSock_getsockname, 0,
1193 getsockname_doc},
1194 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1,
1195 getsockopt_doc},
1196 {"listen", (PyCFunction)PySocketSock_listen, 0,
1197 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001198#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001199 {"makefile", (PyCFunction)PySocketSock_makefile, 1,
1200 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001201#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001202 {"recv", (PyCFunction)PySocketSock_recv, 1,
1203 recv_doc},
1204 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1,
1205 recvfrom_doc},
1206 {"send", (PyCFunction)PySocketSock_send, 1,
1207 send_doc},
1208 {"sendto", (PyCFunction)PySocketSock_sendto, 0,
1209 sendto_doc},
1210 {"setblocking", (PyCFunction)PySocketSock_setblocking, 0,
1211 setblocking_doc},
1212 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, 0,
1213 setsockopt_doc},
1214 {"shutdown", (PyCFunction)PySocketSock_shutdown, 0,
1215 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001216 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001217};
1218
Guido van Rossum30a685f1991-06-27 15:51:29 +00001219
Guido van Rossum73624e91994-10-10 17:59:00 +00001220/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001221 First close the file description. */
1222
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001223static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001224BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001225{
1226 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001227 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001228}
1229
Guido van Rossum30a685f1991-06-27 15:51:29 +00001230
1231/* Return a socket object's named attribute. */
1232
Guido van Rossum73624e91994-10-10 17:59:00 +00001233static PyObject *
1234BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001235{
Guido van Rossum73624e91994-10-10 17:59:00 +00001236 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001237}
1238
Guido van Rossum30a685f1991-06-27 15:51:29 +00001239
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001240static PyObject *
1241BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
1242{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001243 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001244 sprintf(buf,
1245 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
1246 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001247 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001248}
1249
1250
Guido van Rossumb6775db1994-08-01 11:34:53 +00001251/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001252
Guido van Rossum73624e91994-10-10 17:59:00 +00001253static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001254 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001255 0,
1256 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001257 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001258 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001259 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001260 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001261 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001262 0, /*tp_setattr*/
1263 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001264 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001265 0, /*tp_as_number*/
1266 0, /*tp_as_sequence*/
1267 0, /*tp_as_mapping*/
1268};
1269
Guido van Rossum30a685f1991-06-27 15:51:29 +00001270
Guido van Rossum81194471991-07-27 21:42:02 +00001271/* Python interface to gethostname(). */
1272
1273/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001274static PyObject *
1275BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001276{
1277 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001278 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001279 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +00001280 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001281 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001282 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001283 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001284 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001285 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001286 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001287 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001288}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001289
Guido van Rossum82a5c661998-07-07 20:45:43 +00001290static char gethostname_doc[] =
1291"gethostname() -> string\n\
1292\n\
1293Return the current host name.";
1294
Guido van Rossumff4949e1992-08-05 19:58:53 +00001295
Guido van Rossum30a685f1991-06-27 15:51:29 +00001296/* Python interface to gethostbyname(name). */
1297
1298/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001299static PyObject *
1300BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001301{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001302 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001303 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +00001304 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001305 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001306 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001307 return NULL;
1308 return makeipaddr(&addrbuf);
1309}
1310
Guido van Rossum82a5c661998-07-07 20:45:43 +00001311static char gethostbyname_doc[] =
1312"gethostbyname(host) -> address\n\
1313\n\
1314Return the IP address (a string of the form '255.255.255.255') for a host.";
1315
1316
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001317/* Python interface to gethostbyaddr(IP). */
1318
1319/*ARGSUSED*/
1320static PyObject *
1321BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1322{
1323 struct sockaddr_in addr;
1324 char *ip_num;
1325 struct hostent *h;
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001326 char **pch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001327 PyObject *rtn_tuple = (PyObject *)NULL;
1328 PyObject *name_list = (PyObject *)NULL;
1329 PyObject *addr_list = (PyObject *)NULL;
1330 PyObject *tmp;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001331#ifdef HAVE_GETHOSTBYNAME_R
1332 struct hostent hp_allocated;
1333 char buf[16384];
1334 int buf_len = (sizeof buf) - 1;
1335 int errnop;
1336#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001337
1338 if (!PyArg_Parse(args, "s", &ip_num))
1339 return NULL;
1340 if (setipaddr(ip_num, &addr) < 0)
1341 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001342 Py_BEGIN_ALLOW_THREADS
1343#ifdef HAVE_GETHOSTBYNAME_R
1344 h = gethostbyaddr_r((char *)&addr.sin_addr,
1345 sizeof(addr.sin_addr),
1346 AF_INET,
1347 &hp_allocated, buf, buf_len, &errnop);
1348#else /* not HAVE_GETHOSTBYNAME_R */
1349#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
1350 acquire_lock(gethostbyname_lock,1);
1351#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001352 h = gethostbyaddr((char *)&addr.sin_addr,
1353 sizeof(addr.sin_addr),
1354 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001355#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
1356 release_lock(gethostbyname_lock);
1357#endif
1358#endif /* HAVE_GETHOSTBYNAME_R */
1359 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001360 if (h == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +00001361#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001362 /* Let's get real error message to return */
1363 extern int h_errno;
1364 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1365#else
1366 PyErr_SetString(PySocket_Error, "host not found");
1367#endif
1368 return NULL;
1369 }
1370 if ((name_list = PyList_New(0)) == NULL)
1371 goto err;
1372 if ((addr_list = PyList_New(0)) == NULL)
1373 goto err;
1374 for (pch = h->h_aliases; *pch != NULL; pch++) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001375 int status;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001376 tmp = PyString_FromString(*pch);
1377 if (tmp == NULL)
1378 goto err;
Barry Warsaw752300b1997-01-03 17:18:10 +00001379 status = PyList_Append(name_list, tmp);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001380 Py_DECREF(tmp);
Barry Warsaw752300b1997-01-03 17:18:10 +00001381 if (status)
1382 goto err;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001383 }
1384 for (pch = h->h_addr_list; *pch != NULL; pch++) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001385 int status;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001386 memcpy((char *) &addr.sin_addr, *pch, h->h_length);
1387 tmp = makeipaddr(&addr);
1388 if (tmp == NULL)
1389 goto err;
Barry Warsaw752300b1997-01-03 17:18:10 +00001390 status = PyList_Append(addr_list, tmp);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001391 Py_DECREF(tmp);
Barry Warsaw752300b1997-01-03 17:18:10 +00001392 if (status)
1393 goto err;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001394 }
1395 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1396 err:
1397 Py_XDECREF(name_list);
1398 Py_XDECREF(addr_list);
1399 return rtn_tuple;
1400}
1401
Guido van Rossum82a5c661998-07-07 20:45:43 +00001402static char gethostbyaddr_doc[] =
1403"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1404\n\
1405Return the true host name, a list of aliases, and a list of IP addresses,\n\
1406for a host. The host argument is a string giving a host name or IP number.";
1407
Guido van Rossum30a685f1991-06-27 15:51:29 +00001408
1409/* Python interface to getservbyname(name).
1410 This only returns the port number, since the other info is already
1411 known or not useful (like the list of aliases). */
1412
1413/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001414static PyObject *
1415BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001416{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001417 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001418 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001419 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001420 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001421 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001422 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001423 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001424 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001425 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001426 return NULL;
1427 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001428 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001429}
1430
Guido van Rossum82a5c661998-07-07 20:45:43 +00001431static char getservbyname_doc[] =
1432"getservbyname(servicename, protocolname) -> integer\n\
1433\n\
1434Return a port number from a service name and protocol name.\n\
1435The protocol name should be 'tcp' or 'udp'.";
1436
Guido van Rossum30a685f1991-06-27 15:51:29 +00001437
Guido van Rossum3901d851996-12-19 16:35:04 +00001438/* Python interface to getprotobyname(name).
1439 This only returns the protocol number, since the other info is
1440 already known or not useful (like the list of aliases). */
1441
1442/*ARGSUSED*/
1443static PyObject *
1444BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1445{
1446 char *name;
1447 struct protoent *sp;
1448 if (!PyArg_Parse(args, "s", &name))
1449 return NULL;
1450 Py_BEGIN_ALLOW_THREADS
1451 sp = getprotobyname(name);
1452 Py_END_ALLOW_THREADS
1453 if (sp == NULL) {
1454 PyErr_SetString(PySocket_Error, "protocol not found");
1455 return NULL;
1456 }
1457 return PyInt_FromLong((long) sp->p_proto);
1458}
1459
Guido van Rossum82a5c661998-07-07 20:45:43 +00001460static char getprotobyname_doc[] =
1461"getprotobyname(name) -> integer\n\
1462\n\
1463Return the protocol number for the named protocol. (Rarely used.)";
1464
Guido van Rossum3901d851996-12-19 16:35:04 +00001465
Guido van Rossum30a685f1991-06-27 15:51:29 +00001466/* Python interface to socket(family, type, proto).
1467 The third (protocol) argument is optional.
1468 Return a new socket object. */
1469
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001470/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001471static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001472BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001473{
Guido van Rossum73624e91994-10-10 17:59:00 +00001474 PySocketSockObject *s;
Guido van Rossum6f489d91996-06-28 20:15:15 +00001475#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001476 SOCKET fd;
1477#else
1478 int fd;
1479#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001480 int family, type, proto = 0;
1481 if (!PyArg_ParseTuple(args, "ii|i", &family, &type, &proto))
1482 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001483 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001484 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001485 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001486#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001487 if (fd == INVALID_SOCKET)
1488#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001489 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001490#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001491 return PySocket_Err();
1492 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001493 /* If the object can't be created, don't forget to close the
1494 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001495 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001496 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001497 /* From now on, ignore SIGPIPE and let the error checking
1498 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001499#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001500 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001501#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001502 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001503}
1504
Guido van Rossum82a5c661998-07-07 20:45:43 +00001505static char socket_doc[] =
1506"socket(family, type[, proto]) -> socket object\n\
1507\n\
1508Open a socket of the given type. The family argument specifies the\n\
1509address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1510The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1511or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1512specifying the default protocol.";
1513
1514
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001515#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001516/* Create a socket object from a numeric file description.
1517 Useful e.g. if stdin is a socket.
1518 Additional arguments as for socket(). */
1519
1520/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001521static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001522BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001523{
Guido van Rossum73624e91994-10-10 17:59:00 +00001524 PySocketSockObject *s;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001525 int fd, family, type, proto = 0;
1526 if (!PyArg_ParseTuple(args, "iii|i", &fd, &family, &type, &proto))
1527 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001528 /* Dup the fd so it and the socket can be closed independently */
1529 fd = dup(fd);
1530 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001531 return PySocket_Err();
1532 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001533 /* From now on, ignore SIGPIPE and let the error checking
1534 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001535#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001536 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001537#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001538 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001539}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001540
1541static char fromfd_doc[] =
1542"fromfd(fd, family, type[, proto]) -> socket object\n\
1543\n\
1544Create a socket object from the given file descriptor.\n\
1545The remaining arguments are the same as for socket().";
1546
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001547#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001548
Guido van Rossum82a5c661998-07-07 20:45:43 +00001549
Guido van Rossum006bf911996-06-12 04:04:55 +00001550static PyObject *
1551BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1552{
1553 int x1, x2;
1554
1555 if (!PyArg_Parse(args, "i", &x1)) {
1556 return NULL;
1557 }
1558 x2 = (int)ntohs((short)x1);
1559 return PyInt_FromLong(x2);
1560}
1561
Guido van Rossum82a5c661998-07-07 20:45:43 +00001562static char ntohs_doc[] =
1563"ntohs(integer) -> integer\n\
1564\n\
1565Convert a 16-bit integer from network to host byte order.";
1566
1567
Guido van Rossum006bf911996-06-12 04:04:55 +00001568static PyObject *
1569BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1570{
1571 int x1, x2;
1572
1573 if (!PyArg_Parse(args, "i", &x1)) {
1574 return NULL;
1575 }
1576 x2 = ntohl(x1);
1577 return PyInt_FromLong(x2);
1578}
1579
Guido van Rossum82a5c661998-07-07 20:45:43 +00001580static char ntohl_doc[] =
1581"ntohl(integer) -> integer\n\
1582\n\
1583Convert a 32-bit integer from network to host byte order.";
1584
1585
Guido van Rossum006bf911996-06-12 04:04:55 +00001586static PyObject *
1587BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1588{
1589 int x1, x2;
1590
1591 if (!PyArg_Parse(args, "i", &x1)) {
1592 return NULL;
1593 }
1594 x2 = (int)htons((short)x1);
1595 return PyInt_FromLong(x2);
1596}
1597
Guido van Rossum82a5c661998-07-07 20:45:43 +00001598static char htons_doc[] =
1599"htons(integer) -> integer\n\
1600\n\
1601Convert a 16-bit integer from host to network byte order.";
1602
1603
Guido van Rossum006bf911996-06-12 04:04:55 +00001604static PyObject *
1605BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1606{
1607 int x1, x2;
1608
1609 if (!PyArg_Parse(args, "i", &x1)) {
1610 return NULL;
1611 }
1612 x2 = htonl(x1);
1613 return PyInt_FromLong(x2);
1614}
1615
Guido van Rossum82a5c661998-07-07 20:45:43 +00001616static char htonl_doc[] =
1617"htonl(integer) -> integer\n\
1618\n\
1619Convert a 32-bit integer from host to network byte order.";
1620
1621
Guido van Rossum30a685f1991-06-27 15:51:29 +00001622/* List of functions exported by this module. */
1623
Guido van Rossum73624e91994-10-10 17:59:00 +00001624static PyMethodDef PySocket_methods[] = {
Guido van Rossum82a5c661998-07-07 20:45:43 +00001625 {"gethostbyname", PySocket_gethostbyname, 0, gethostbyname_doc},
1626 {"gethostbyaddr", PySocket_gethostbyaddr, 0, gethostbyaddr_doc},
1627 {"gethostname", PySocket_gethostname, 0, gethostname_doc},
1628 {"getservbyname", PySocket_getservbyname, 0, getservbyname_doc},
1629 {"getprotobyname", PySocket_getprotobyname, 0,getprotobyname_doc},
1630 {"socket", PySocket_socket, 1, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001631#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001632 {"fromfd", PySocket_fromfd, 1, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001633#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001634 {"ntohs", PySocket_ntohs, 0, ntohs_doc},
1635 {"ntohl", PySocket_ntohl, 0, ntohl_doc},
1636 {"htons", PySocket_htons, 0, htons_doc},
1637 {"htonl", PySocket_htonl, 0, htonl_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001638 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001639};
1640
Guido van Rossum30a685f1991-06-27 15:51:29 +00001641
1642/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00001643 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001644 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00001645 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001646static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001647BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001648{
Guido van Rossum73624e91994-10-10 17:59:00 +00001649 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00001650 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001651 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00001652
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001653 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001654}
1655
Guido van Rossum30a685f1991-06-27 15:51:29 +00001656
Guido van Rossum8d665e61996-06-26 18:22:49 +00001657#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001658
1659/* Additional initialization and cleanup for NT/Windows */
1660
1661static void
1662NTcleanup()
1663{
1664 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00001665}
1666
1667static int
1668NTinit()
1669{
1670 WSADATA WSAData;
1671 int ret;
1672 char buf[100];
1673 ret = WSAStartup(0x0101, &WSAData);
1674 switch (ret) {
1675 case 0: /* no error */
1676 atexit(NTcleanup);
1677 return 1;
1678 case WSASYSNOTREADY:
1679 PyErr_SetString(PyExc_ImportError,
1680 "WSAStartup failed: network not ready");
1681 break;
1682 case WSAVERNOTSUPPORTED:
1683 case WSAEINVAL:
1684 PyErr_SetString(PyExc_ImportError,
1685 "WSAStartup failed: requested version not supported");
1686 break;
1687 default:
1688 sprintf(buf, "WSAStartup failed: error code %d", ret);
1689 PyErr_SetString(PyExc_ImportError, buf);
1690 break;
1691 }
1692 return 0;
1693}
1694
Guido van Rossum8d665e61996-06-26 18:22:49 +00001695#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00001696
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001697#if defined(PYOS_OS2)
1698
1699/* Additional initialization and cleanup for OS/2 */
1700
1701static void
1702OS2cleanup()
1703{
1704 /* No cleanup is necessary for OS/2 Sockets */
1705}
1706
1707static int
1708OS2init()
1709{
1710 char reason[64];
1711 int rc = sock_init();
1712
1713 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00001714 atexit(OS2cleanup);
1715 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001716 }
1717
1718 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
1719 PyErr_SetString(PyExc_ImportError, reason);
1720
Guido van Rossum32c575d1997-12-02 20:37:32 +00001721 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001722}
1723
1724#endif /* PYOS_OS2 */
1725
Guido van Rossumbe32c891996-06-20 16:25:29 +00001726
Guido van Rossum30a685f1991-06-27 15:51:29 +00001727/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001728 * This is called when the first 'import socket' is done,
1729 * via a table in config.c, if config.c is compiled with USE_SOCKET
1730 * defined.
1731 *
1732 * For MS_WINDOWS (which means any Windows variant), this module
1733 * is actually called "_socket", and there's a wrapper "socket.py"
1734 * which implements some missing functionality (such as makefile(),
1735 * dup() and fromfd()). The import of "_socket" may fail with an
1736 * ImportError exception if initialization of WINSOCK fails. When
1737 * WINSOCK is initialized succesfully, a call to WSACleanup() is
1738 * scheduled to be made at exit time.
1739 *
1740 * For OS/2, this module is also called "_socket" and uses a wrapper
1741 * "socket.py" which implements that functionality that is missing
1742 * when PC operating systems don't put socket descriptors in the
1743 * operating system's filesystem layer.
1744 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001745
Guido van Rossum82a5c661998-07-07 20:45:43 +00001746static char module_doc[] =
1747"This module provides socket operations and some related functions.\n\
1748On Unix, it supports IP (Internet Protocol) and Unix domain sockets.\n\
1749On other systems, it only supports IP.\n\
1750\n\
1751Functions:\n\
1752\n\
1753socket() -- create a new socket object\n\
1754fromfd() -- create a socket object from an open file descriptor (*)\n\
1755gethostname() -- return the current hostname\n\
1756gethostbyname() -- map a hostname to its IP number\n\
1757gethostbyaddr() -- map an IP number or hostname to DNS info\n\
1758getservbyname() -- map a service name and a protocol name to a port number\n\
1759getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\
1760ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\
1761htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\
1762\n\
1763(*) not available on all platforms!)\n\
1764\n\
1765Special objects:\n\
1766\n\
1767SocketType -- type object for socket objects\n\
1768error -- exception raised for I/O errors\n\
1769\n\
1770Integer constants:\n\
1771\n\
1772AF_INET, AF_UNIX -- socket domains (first argument to socket() call)\n\
1773SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)\n\
1774\n\
1775Many other constants may be defined; these may be used in calls to\n\
1776the setsockopt() and getsockopt() methods.\n\
1777";
1778
1779static char sockettype_doc[] =
1780"A socket represents one endpoint of a network connection.\n\
1781\n\
1782Methods:\n\
1783\n\
1784accept() -- accept a connection, returning new socket and client address\n\
1785bind() -- bind the socket to a local address\n\
1786close() -- close the socket\n\
1787connect() -- connect the socket to a remote address\n\
1788connect_ex() -- connect, return an error code instead of an exception \n\
1789dup() -- return a new socket object identical to the current one (*)\n\
1790fileno() -- return underlying file descriptor\n\
1791getpeername() -- return remote address (*)\n\
1792getsockname() -- return local address\n\
1793getsockopt() -- get socket options\n\
1794listen() -- start listening for incoming connections\n\
1795makefile() -- return a file object corresponding tot the socket (*)\n\
1796recv() -- receive data\n\
1797recvfrom() -- receive data and sender's address\n\
1798send() -- send data\n\
1799sendto() -- send data to a given address\n\
1800setblocking() -- set or clear the blocking I/O flag\n\
1801setsockopt() -- set socket options\n\
1802shutdown() -- shut down traffic in one or both directions\n\
1803\n\
1804(*) not available on all platforms!)";
1805
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001806void
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001807#if defined(MS_WINDOWS) || defined(PYOS_OS2)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001808init_socket()
1809#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001810initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00001811#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001812{
Guido van Rossum73624e91994-10-10 17:59:00 +00001813 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001814#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001815 if (!NTinit())
1816 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00001817 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001818#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00001819#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001820 if (!OS2init())
1821 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00001822 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum32c575d1997-12-02 20:37:32 +00001823#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001824 m = Py_InitModule3("socket", PySocket_methods, module_doc);
Guido van Rossum32c575d1997-12-02 20:37:32 +00001825#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001826#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001827 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001828 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
1829 if (PySocket_Error == NULL)
1830 return;
1831 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00001832 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00001833 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00001834 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00001835 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00001836 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001837 return;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001838 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001839#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001840 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001841#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001842 insint(d, "SOCK_STREAM", SOCK_STREAM);
1843 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
1844 insint(d, "SOCK_RAW", SOCK_RAW);
1845 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1846 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001847
1848#ifdef SO_DEBUG
1849 insint(d, "SO_DEBUG", SO_DEBUG);
1850#endif
1851#ifdef SO_ACCEPTCONN
1852 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
1853#endif
1854#ifdef SO_REUSEADDR
1855 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
1856#endif
1857#ifdef SO_KEEPALIVE
1858 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
1859#endif
1860#ifdef SO_DONTROUTE
1861 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
1862#endif
1863#ifdef SO_BROADCAST
1864 insint(d, "SO_BROADCAST", SO_BROADCAST);
1865#endif
1866#ifdef SO_USELOOPBACK
1867 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
1868#endif
1869#ifdef SO_LINGER
1870 insint(d, "SO_LINGER", SO_LINGER);
1871#endif
1872#ifdef SO_OOBINLINE
1873 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
1874#endif
1875#ifdef SO_REUSEPORT
1876 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
1877#endif
1878
1879#ifdef SO_SNDBUF
1880 insint(d, "SO_SNDBUF", SO_SNDBUF);
1881#endif
1882#ifdef SO_RCVBUF
1883 insint(d, "SO_RCVBUF", SO_RCVBUF);
1884#endif
1885#ifdef SO_SNDLOWAT
1886 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
1887#endif
1888#ifdef SO_RCVLOWAT
1889 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
1890#endif
1891#ifdef SO_SNDTIMEO
1892 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
1893#endif
1894#ifdef SO_RCVTIMEO
1895 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
1896#endif
1897#ifdef SO_ERROR
1898 insint(d, "SO_ERROR", SO_ERROR);
1899#endif
1900#ifdef SO_TYPE
1901 insint(d, "SO_TYPE", SO_TYPE);
1902#endif
1903
1904 /* Maximum number of connections for "listen" */
1905#ifdef SOMAXCONN
1906 insint(d, "SOMAXCONN", SOMAXCONN);
1907#else
1908 insint(d, "SOMAXCONN", 5); /* Common value */
1909#endif
1910
1911 /* Flags for send, recv */
1912#ifdef MSG_OOB
1913 insint(d, "MSG_OOB", MSG_OOB);
1914#endif
1915#ifdef MSG_PEEK
1916 insint(d, "MSG_PEEK", MSG_PEEK);
1917#endif
1918#ifdef MSG_DONTROUTE
1919 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
1920#endif
1921#ifdef MSG_EOR
1922 insint(d, "MSG_EOR", MSG_EOR);
1923#endif
1924#ifdef MSG_TRUNC
1925 insint(d, "MSG_TRUNC", MSG_TRUNC);
1926#endif
1927#ifdef MSG_CTRUNC
1928 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
1929#endif
1930#ifdef MSG_WAITALL
1931 insint(d, "MSG_WAITALL", MSG_WAITALL);
1932#endif
1933#ifdef MSG_BTAG
1934 insint(d, "MSG_BTAG", MSG_BTAG);
1935#endif
1936#ifdef MSG_ETAG
1937 insint(d, "MSG_ETAG", MSG_ETAG);
1938#endif
1939
1940 /* Protocol level and numbers, usable for [gs]etsockopt */
Guido van Rossum578de301998-05-28 20:18:18 +00001941/* Sigh -- some systems (e.g. Linux) use enums for these. */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001942#ifdef SOL_SOCKET
1943 insint(d, "SOL_SOCKET", SOL_SOCKET);
1944#endif
1945#ifdef IPPROTO_IP
1946 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00001947#else
1948 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001949#endif
1950#ifdef IPPROTO_ICMP
1951 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00001952#else
1953 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001954#endif
1955#ifdef IPPROTO_IGMP
1956 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
1957#endif
1958#ifdef IPPROTO_GGP
1959 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
1960#endif
1961#ifdef IPPROTO_TCP
1962 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00001963#else
1964 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001965#endif
1966#ifdef IPPROTO_EGP
1967 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
1968#endif
1969#ifdef IPPROTO_PUP
1970 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
1971#endif
1972#ifdef IPPROTO_UDP
1973 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00001974#else
1975 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001976#endif
1977#ifdef IPPROTO_IDP
1978 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
1979#endif
1980#ifdef IPPROTO_HELLO
1981 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
1982#endif
1983#ifdef IPPROTO_ND
1984 insint(d, "IPPROTO_ND", IPPROTO_ND);
1985#endif
1986#ifdef IPPROTO_TP
1987 insint(d, "IPPROTO_TP", IPPROTO_TP);
1988#endif
1989#ifdef IPPROTO_XTP
1990 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
1991#endif
1992#ifdef IPPROTO_EON
1993 insint(d, "IPPROTO_EON", IPPROTO_EON);
1994#endif
1995#ifdef IPPROTO_BIP
1996 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
1997#endif
1998/**/
1999#ifdef IPPROTO_RAW
2000 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002001#else
2002 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002003#endif
2004#ifdef IPPROTO_MAX
2005 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2006#endif
2007
2008 /* Some port configuration */
2009#ifdef IPPORT_RESERVED
2010 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2011#else
2012 insint(d, "IPPORT_RESERVED", 1024);
2013#endif
2014#ifdef IPPORT_USERRESERVED
2015 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2016#else
2017 insint(d, "IPPORT_USERRESERVED", 5000);
2018#endif
2019
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002020 /* Some reserved IP v.4 addresses */
2021#ifdef INADDR_ANY
2022 insint(d, "INADDR_ANY", INADDR_ANY);
2023#else
2024 insint(d, "INADDR_ANY", 0x00000000);
2025#endif
2026#ifdef INADDR_BROADCAST
2027 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2028#else
2029 insint(d, "INADDR_BROADCAST", 0xffffffff);
2030#endif
2031#ifdef INADDR_LOOPBACK
2032 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2033#else
2034 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2035#endif
2036#ifdef INADDR_UNSPEC_GROUP
2037 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2038#else
2039 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2040#endif
2041#ifdef INADDR_ALLHOSTS_GROUP
2042 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2043#else
2044 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2045#endif
2046#ifdef INADDR_MAX_LOCAL_GROUP
2047 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2048#else
2049 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2050#endif
2051#ifdef INADDR_NONE
2052 insint(d, "INADDR_NONE", INADDR_NONE);
2053#else
2054 insint(d, "INADDR_NONE", 0xffffffff);
2055#endif
2056
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002057 /* IP [gs]etsockopt options */
2058#ifdef IP_OPTIONS
2059 insint(d, "IP_OPTIONS", IP_OPTIONS);
2060#endif
2061#ifdef IP_HDRINCL
2062 insint(d, "IP_HDRINCL", IP_HDRINCL);
2063#endif
2064#ifdef IP_TOS
2065 insint(d, "IP_TOS", IP_TOS);
2066#endif
2067#ifdef IP_TTL
2068 insint(d, "IP_TTL", IP_TTL);
2069#endif
2070#ifdef IP_RECVOPTS
2071 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2072#endif
2073#ifdef IP_RECVRETOPTS
2074 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2075#endif
2076#ifdef IP_RECVDSTADDR
2077 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2078#endif
2079#ifdef IP_RETOPTS
2080 insint(d, "IP_RETOPTS", IP_RETOPTS);
2081#endif
2082#ifdef IP_MULTICAST_IF
2083 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2084#endif
2085#ifdef IP_MULTICAST_TTL
2086 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2087#endif
2088#ifdef IP_MULTICAST_LOOP
2089 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2090#endif
2091#ifdef IP_ADD_MEMBERSHIP
2092 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2093#endif
2094#ifdef IP_DROP_MEMBERSHIP
2095 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2096#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002097
2098 /* Initialize gethostbyname lock */
2099#if defined(WITH_THREAD) && !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
2100 gethostbyname_lock = allocate_lock();
2101#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002102}