blob: 914931fd5f38e0714d74f9b4b19621703555d379 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossum6574b3e1991-06-25 21:36:08 +00009******************************************************************/
10
11/* Socket module */
12
Guido van Rossum09c8b6c1999-12-07 21:37:17 +000013/* SSL support based on patches by Brian E Gallew and Laszlo Kovacs */
14
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015/*
16This module provides an interface to Berkeley socket IPC.
17
18Limitations:
19
Guido van Rossum30a685f1991-06-27 15:51:29 +000020- only AF_INET and AF_UNIX address families are supported
Guido van Rossum81194471991-07-27 21:42:02 +000021- no read/write operations (use send/recv or makefile instead)
Guido van Rossumbe32c891996-06-20 16:25:29 +000022- additional restrictions apply on Windows
Guido van Rossum6574b3e1991-06-25 21:36:08 +000023
Guido van Rossum27e177d1995-03-16 15:43:47 +000024Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000025
Guido van Rossum27e177d1995-03-16 15:43:47 +000026- socket.error: exception raised for socket specific errors
Guido van Rossum30a685f1991-06-27 15:51:29 +000027- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000028- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000029- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000030- socket.getprotobyname(protocolname) --> protocol number
Guido van Rossum27e177d1995-03-16 15:43:47 +000031- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000032- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum006bf911996-06-12 04:04:55 +000033- socket.ntohs(16 bit value) --> new int object
34- socket.ntohl(32 bit value) --> new int object
35- socket.htons(16 bit value) --> new int object
36- socket.htonl(32 bit value) --> new int object
Guido van Rossum27e177d1995-03-16 15:43:47 +000037- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +000038- socket.inet_aton(IP address) -> 32-bit packed IP representation
39- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum09c8b6c1999-12-07 21:37:17 +000040- socket.ssl(socket, keyfile, certfile) -> new ssl object
Guido van Rossum6574b3e1991-06-25 21:36:08 +000041- an Internet socket address is a pair (hostname, port)
42 where hostname can be anything recognized by gethostbyname()
43 (including the dd.dd.dd.dd notation) and port is in host byte order
44- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000045- a UNIX domain socket address is a string specifying the pathname
Guido van Rossum6574b3e1991-06-25 21:36:08 +000046
Guido van Rossum30a685f1991-06-27 15:51:29 +000047Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048
Guido van Rossum81194471991-07-27 21:42:02 +000049- s.accept() --> new socket object, sockaddr
Fred Drake728819a2000-07-01 03:40:12 +000050- s.bind(sockaddr) --> None
Guido van Rossum27e177d1995-03-16 15:43:47 +000051- s.close() --> None
Fred Drake728819a2000-07-01 03:40:12 +000052- s.connect(sockaddr) --> None
53- s.connect_ex(sockaddr) --> 0 or errno (handy for e.g. async connect)
Guido van Rossum27e177d1995-03-16 15:43:47 +000054- s.fileno() --> file descriptor
Guido van Rossumbe32c891996-06-20 16:25:29 +000055- s.dup() --> same as socket.fromfd(os.dup(s.fileno(), ...)
Guido van Rossumc89705d1992-11-26 08:54:07 +000056- s.getpeername() --> sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000057- s.getsockname() --> sockaddr
58- s.getsockopt(level, optname[, buflen]) --> int or string
59- s.listen(backlog) --> None
Guido van Rossum6b144911995-03-14 15:05:13 +000060- s.makefile([mode[, bufsize]]) --> file object
Guido van Rossum27e177d1995-03-16 15:43:47 +000061- s.recv(buflen [,flags]) --> string
62- s.recvfrom(buflen [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000063- s.send(string [,flags]) --> nbytes
64- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum27e177d1995-03-16 15:43:47 +000065- s.setblocking(0 | 1) --> None
66- s.setsockopt(level, optname, value) --> None
67- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000068- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000069
Guido van Rossum6574b3e1991-06-25 21:36:08 +000070*/
71
Guido van Rossum73624e91994-10-10 17:59:00 +000072#include "Python.h"
Guido van Rossum3baaa131999-03-22 21:44:51 +000073
Guido van Rossum9376b741999-09-15 22:01:40 +000074/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
75 script doesn't get this right, so we hardcode some platform checks below.
76 On the other hand, not all Linux versions agree, so there the settings
77 computed by the configure script are needed! */
78
79#ifndef linux
Guido van Rossume7de2061999-03-24 17:24:33 +000080#undef HAVE_GETHOSTBYNAME_R_3_ARG
81#undef HAVE_GETHOSTBYNAME_R_5_ARG
82#undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +000083#endif
Guido van Rossume7de2061999-03-24 17:24:33 +000084
Guido van Rossum7a122991999-04-13 04:07:32 +000085#ifndef WITH_THREAD
86#undef HAVE_GETHOSTBYNAME_R
87#endif
88
Guido van Rossume7de2061999-03-24 17:24:33 +000089#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +000090#if defined(_AIX) || defined(__osf__)
Guido van Rossume7de2061999-03-24 17:24:33 +000091#define HAVE_GETHOSTBYNAME_R_3_ARG
92#elif defined(__sun__) || defined(__sgi)
93#define HAVE_GETHOSTBYNAME_R_5_ARG
94#elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +000095/* Rely on the configure script */
Guido van Rossume7de2061999-03-24 17:24:33 +000096#else
97#undef HAVE_GETHOSTBYNAME_R
98#endif
99#endif
100
Guido van Rossum3baaa131999-03-22 21:44:51 +0000101#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && !defined(MS_WINDOWS)
102#define USE_GETHOSTBYNAME_LOCK
103#endif
104
105#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum49b56061998-10-01 20:42:43 +0000106#include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000107#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000108
Guido van Rossuma376cc51996-12-05 23:43:35 +0000109#ifdef HAVE_UNISTD_H
110#include <unistd.h>
111#endif
112
Guido van Rossumbcc20741998-08-04 22:53:56 +0000113#if !defined(MS_WINDOWS) && !defined(PYOS_OS2) && !defined(__BEOS__)
Thomas Woutersbd4bc4e2000-07-22 23:57:55 +0000114extern int gethostname(char *, size_t); /* For Solaris, at least */
Guido van Rossumfb4130d1996-12-10 15:17:08 +0000115#endif
116
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000117#if defined(PYCC_VACPP)
118#include <types.h>
119#include <io.h>
120#include <sys/ioctl.h>
121#include <utils.h>
122#include <ctype.h>
123#endif
124
125#if defined(PYOS_OS2)
126#define INCL_DOS
127#define INCL_DOSERRORS
128#define INCL_NOPMAPI
129#include <os2.h>
130#endif
131
Guido van Rossumbcc20741998-08-04 22:53:56 +0000132#if defined(__BEOS__)
133/* It's in the libs, but not the headers... - [cjh] */
134int shutdown( int, int );
135#endif
136
Guido van Rossumb6775db1994-08-01 11:34:53 +0000137#include <sys/types.h>
138#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +0000139
Guido van Rossum81194471991-07-27 21:42:02 +0000140#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000141#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000142#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000143#include <sys/socket.h>
144#include <netinet/in.h>
Fred Drake11b09362000-05-16 13:30:12 +0000145#ifndef __BEOS__
Andrew M. Kuchling52a644c2000-03-31 17:24:30 +0000146#include <netinet/tcp.h>
Fred Drake11b09362000-05-16 13:30:12 +0000147#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000148
Guido van Rossum9376b741999-09-15 22:01:40 +0000149/* Headers needed for inet_ntoa() and inet_addr() */
150#ifdef __BEOS__
151#include <net/netdb.h>
152#else
Guido van Rossumff3ab422000-04-24 15:16:03 +0000153#ifndef USE_GUSI1
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000154#include <arpa/inet.h>
Guido van Rossum9376b741999-09-15 22:01:40 +0000155#endif
Guido van Rossum1b6e4631999-11-04 18:22:29 +0000156#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000157
Guido van Rossume4485b01994-09-07 14:32:49 +0000158#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000159#else
160#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000161#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000162#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000163#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000164#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000165#else
166#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000167#endif
168
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000169#ifndef O_NDELAY
170#define O_NDELAY O_NONBLOCK /* For QNX only? */
171#endif
172
Guido van Rossumff3ab422000-04-24 15:16:03 +0000173#ifdef USE_GUSI1
Jack Jansen508537b1996-02-14 15:57:45 +0000174/* fdopen() isn't declared in stdio.h (sigh) */
175#include <GUSI.h>
176#endif
177
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000178#ifdef USE_SSL
179#include "rsa.h"
180#include "crypto.h"
181#include "x509.h"
182#include "pem.h"
183#include "ssl.h"
184#include "err.h"
185#endif /* USE_SSL */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000186
Guido van Rossumbcc20741998-08-04 22:53:56 +0000187#if defined(MS_WINDOWS) || defined(__BEOS__)
188/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000189/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000190#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000191#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000192#endif
193
Fred Drakea04eaad2000-06-30 02:46:07 +0000194/* abstract the socket file descriptor type */
195#ifdef MS_WINDOWS
196typedef SOCKET SOCKET_T;
197# ifdef MS_WIN64
198# define SIZEOF_SOCKET_T 8
199# else
200# define SIZEOF_SOCKET_T 4
201# endif
202#else
203typedef int SOCKET_T;
204# define SIZEOF_SOCKET_T SIZEOF_INT
205#endif
206
207
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000208#if defined(PYOS_OS2)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000209#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000210#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000211#endif
212
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000213#ifndef SOCKETCLOSE
214#define SOCKETCLOSE close
215#endif
216
Guido van Rossum30a685f1991-06-27 15:51:29 +0000217/* Global variable holding the exception type for errors detected
218 by this module (but not argument type or memory errors, etc.). */
219
Guido van Rossum73624e91994-10-10 17:59:00 +0000220static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000221
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000222#ifdef USE_SSL
223static PyObject *SSLErrorObject;
224#endif /* USE_SSL */
225
Guido van Rossum30a685f1991-06-27 15:51:29 +0000226
227/* Convenience function to raise an error according to errno
228 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000229
Guido van Rossum73624e91994-10-10 17:59:00 +0000230static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000231PySocket_Err(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000232{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000233#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000234 int err_no = WSAGetLastError();
235 if (err_no) {
236 static struct { int no; const char *msg; } *msgp, msgs[] = {
237 { WSAEINTR, "Interrupted system call" },
238 { WSAEBADF, "Bad file descriptor" },
239 { WSAEACCES, "Permission denied" },
240 { WSAEFAULT, "Bad address" },
241 { WSAEINVAL, "Invalid argument" },
242 { WSAEMFILE, "Too many open files" },
243 { WSAEWOULDBLOCK,
244 "The socket operation could not complete "
245 "without blocking" },
246 { WSAEINPROGRESS, "Operation now in progress" },
247 { WSAEALREADY, "Operation already in progress" },
248 { WSAENOTSOCK, "Socket operation on non-socket" },
249 { WSAEDESTADDRREQ, "Destination address required" },
250 { WSAEMSGSIZE, "Message too long" },
251 { WSAEPROTOTYPE, "Protocol wrong type for socket" },
252 { WSAENOPROTOOPT, "Protocol not available" },
253 { WSAEPROTONOSUPPORT, "Protocol not supported" },
254 { WSAESOCKTNOSUPPORT, "Socket type not supported" },
255 { WSAEOPNOTSUPP, "Operation not supported" },
256 { WSAEPFNOSUPPORT, "Protocol family not supported" },
257 { WSAEAFNOSUPPORT, "Address family not supported" },
258 { WSAEADDRINUSE, "Address already in use" },
259 { WSAEADDRNOTAVAIL,
260 "Can't assign requested address" },
261 { WSAENETDOWN, "Network is down" },
262 { WSAENETUNREACH, "Network is unreachable" },
263 { WSAENETRESET,
264 "Network dropped connection on reset" },
265 { WSAECONNABORTED,
266 "Software caused connection abort" },
267 { WSAECONNRESET, "Connection reset by peer" },
268 { WSAENOBUFS, "No buffer space available" },
269 { WSAEISCONN, "Socket is already connected" },
270 { WSAENOTCONN, "Socket is not connected" },
271 { WSAESHUTDOWN, "Can't send after socket shutdown" },
272 { WSAETOOMANYREFS,
273 "Too many references: can't splice" },
274 { WSAETIMEDOUT, "Operation timed out" },
275 { WSAECONNREFUSED, "Connection refused" },
276 { WSAELOOP, "Too many levels of symbolic links" },
277 { WSAENAMETOOLONG, "File name too long" },
278 { WSAEHOSTDOWN, "Host is down" },
279 { WSAEHOSTUNREACH, "No route to host" },
280 { WSAENOTEMPTY, "Directory not empty" },
281 { WSAEPROCLIM, "Too many processes" },
282 { WSAEUSERS, "Too many users" },
283 { WSAEDQUOT, "Disc quota exceeded" },
284 { WSAESTALE, "Stale NFS file handle" },
285 { WSAEREMOTE, "Too many levels of remote in path" },
286 { WSASYSNOTREADY,
287 "Network subsystem is unvailable" },
288 { WSAVERNOTSUPPORTED,
289 "WinSock version is not supported" },
290 { WSANOTINITIALISED,
291 "Successful WSAStartup() not yet performed" },
292 { WSAEDISCON, "Graceful shutdown in progress" },
293 /* Resolver errors */
294 { WSAHOST_NOT_FOUND, "No such host is known" },
295 { WSATRY_AGAIN, "Host not found, or server failed" },
296 { WSANO_RECOVERY,
297 "Unexpected server error encountered" },
298 { WSANO_DATA, "Valid name without requested data" },
299 { WSANO_ADDRESS, "No address, look for MX record" },
300 { 0, NULL }
301 };
Guido van Rossum73624e91994-10-10 17:59:00 +0000302 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000303 const char *msg = "winsock error";
304
305 for (msgp = msgs; msgp->msg; msgp++) {
306 if (err_no == msgp->no) {
307 msg = msgp->msg;
308 break;
309 }
310 }
311
312 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000313 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000314 PyErr_SetObject(PySocket_Error, v);
315 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000316 }
317 return NULL;
318 }
319 else
320#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000321
322#if defined(PYOS_OS2)
323 if (sock_errno() != NO_ERROR) {
324 APIRET rc;
325 ULONG msglen;
326 char outbuf[100];
327 int myerrorcode = sock_errno();
328
329 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
330 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
331 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
332 if (rc == NO_ERROR) {
333 PyObject *v;
334
335 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
336 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
337 char *lastc = &outbuf[ strlen(outbuf)-1 ];
338 while (lastc > outbuf && isspace(*lastc))
339 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
340 }
341 v = Py_BuildValue("(is)", myerrorcode, outbuf);
342 if (v != NULL) {
343 PyErr_SetObject(PySocket_Error, v);
344 Py_DECREF(v);
345 }
346 return NULL;
347 }
348 }
349#endif
350
Guido van Rossum73624e91994-10-10 17:59:00 +0000351 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000352}
353
Guido van Rossum30a685f1991-06-27 15:51:29 +0000354
355/* The object holding a socket. It holds some extra information,
356 like the address family, which is used to decode socket address
357 arguments properly. */
358
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000359typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000360 PyObject_HEAD
Fred Drakea04eaad2000-06-30 02:46:07 +0000361 SOCKET_T sock_fd; /* Socket file descriptor */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000362 int sock_family; /* Address family, e.g., AF_INET */
363 int sock_type; /* Socket type, e.g., SOCK_STREAM */
364 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000365 union sock_addr {
366 struct sockaddr_in in;
367#ifdef AF_UNIX
368 struct sockaddr_un un;
369#endif
370 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000371} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000372
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000373#ifdef USE_SSL
Guido van Rossum30a685f1991-06-27 15:51:29 +0000374
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000375typedef struct {
376 PyObject_HEAD
377 PySocketSockObject *Socket; /* Socket on which we're layered */
378 PyObject *x_attr; /* Attributes dictionary */
379 SSL_CTX* ctx;
380 SSL* ssl;
381 X509* server_cert;
382 BIO* sbio;
383 char server[256];
384 char issuer[256];
385
386} SSLObject;
387
388staticforward PyTypeObject SSL_Type;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000389staticforward PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args);
390staticforward PyObject *SSL_SSLread(SSLObject *self, PyObject *args);
391
392#define SSLObject_Check(v) ((v)->ob_type == &SSL_Type)
393
394#endif /* USE_SSL */
395
Guido van Rossum30a685f1991-06-27 15:51:29 +0000396/* A forward reference to the Socktype type object.
397 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000398 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000399 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000400
Guido van Rossum73624e91994-10-10 17:59:00 +0000401staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000402
Guido van Rossum30a685f1991-06-27 15:51:29 +0000403
404/* Create a new socket object.
405 This just creates the object and initializes it.
406 If the creation fails, return NULL and set an exception (implicit
407 in NEWOBJ()). */
408
Guido van Rossum73624e91994-10-10 17:59:00 +0000409static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000410PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000411{
Guido van Rossum73624e91994-10-10 17:59:00 +0000412 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000413 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000414 s = PyObject_New(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000415 if (s != NULL) {
416 s->sock_fd = fd;
417 s->sock_family = family;
418 s->sock_type = type;
419 s->sock_proto = proto;
420 }
421 return s;
422}
423
Guido van Rossum30a685f1991-06-27 15:51:29 +0000424
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000425/* Lock to allow python interpreter to continue, but only allow one
426 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000427#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000428PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000429#endif
430
431
Guido van Rossum30a685f1991-06-27 15:51:29 +0000432/* Convert a string specifying a host name or one of a few symbolic
433 names to a numeric IP address. This usually calls gethostbyname()
434 to do the work; the names "" and "<broadcast>" are special.
435 Return the length (should always be 4 bytes), or negative if
436 an error occurred; then an exception is raised. */
437
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000438static int
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000439setipaddr(char* name, struct sockaddr_in * addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000440{
441 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000442 int d1, d2, d3, d4;
Guido van Rossum955becc1999-03-22 20:14:53 +0000443 int h_length;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000444 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000445#ifdef HAVE_GETHOSTBYNAME_R
446 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000447#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
448 struct hostent_data data;
449#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000450 char buf[1001];
451 int buf_len = (sizeof buf) - 1;
452 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000453#endif
454#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000455 int result;
456#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000457#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000458
Guido van Rossuma376cc51996-12-05 23:43:35 +0000459 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000460 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000461 addr_ret->sin_addr.s_addr = INADDR_ANY;
462 return 4;
463 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000464 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000465 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
466 return 4;
467 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000468 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
469 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
470 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
471 addr_ret->sin_addr.s_addr = htonl(
472 ((long) d1 << 24) | ((long) d2 << 16) |
473 ((long) d3 << 8) | ((long) d4 << 0));
474 return 4;
475 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000476 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000477#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000478#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000479 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &hp, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000480#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000481 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000482#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +0000483 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000484 result = gethostbyname_r(name, &hp_allocated, &data);
485 hp = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000486#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000487#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000488#ifdef USE_GETHOSTBYNAME_LOCK
489 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000490#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000491 hp = gethostbyname(name);
492#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000493 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000494
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000495 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000496#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000497 /* Let's get real error message to return */
498 extern int h_errno;
499 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
500#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000501 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000502#endif
Guido van Rossum3baaa131999-03-22 21:44:51 +0000503#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000504 PyThread_release_lock(gethostbyname_lock);
505#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000506 return -1;
507 }
508 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
Guido van Rossum955becc1999-03-22 20:14:53 +0000509 h_length = hp->h_length;
Guido van Rossum3baaa131999-03-22 21:44:51 +0000510#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000511 PyThread_release_lock(gethostbyname_lock);
512#endif
513 return h_length;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000514}
515
Guido van Rossum30a685f1991-06-27 15:51:29 +0000516
Guido van Rossum30a685f1991-06-27 15:51:29 +0000517/* Create a string object representing an IP address.
518 This is always a string of the form 'dd.dd.dd.dd' (with variable
519 size numbers). */
520
Guido van Rossum73624e91994-10-10 17:59:00 +0000521static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000522makeipaddr(struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000523{
524 long x = ntohl(addr->sin_addr.s_addr);
525 char buf[100];
526 sprintf(buf, "%d.%d.%d.%d",
527 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
528 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000529 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000530}
531
532
533/* Create an object representing the given socket address,
534 suitable for passing it back to bind(), connect() etc.
535 The family field of the sockaddr structure is inspected
536 to determine what kind of address it really is. */
537
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000538/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000539static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000540makesockaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000541{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000542 if (addrlen == 0) {
543 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000544 Py_INCREF(Py_None);
545 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000546 }
547
Guido van Rossumbcc20741998-08-04 22:53:56 +0000548#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000549 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000550 addr->sa_family = AF_INET;
551#endif
552
Guido van Rossum30a685f1991-06-27 15:51:29 +0000553 switch (addr->sa_family) {
554
555 case AF_INET:
556 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000557 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000558 PyObject *addrobj = makeipaddr(a);
559 PyObject *ret = NULL;
560 if (addrobj) {
561 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
562 Py_DECREF(addrobj);
563 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000564 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000565 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000566
Guido van Rossumb6775db1994-08-01 11:34:53 +0000567#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000568 case AF_UNIX:
569 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000570 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000571 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000572 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000573#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000574
575 /* More cases here... */
576
577 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000578 /* If we don't know the address family, don't raise an
579 exception -- return it as a tuple. */
580 return Py_BuildValue("is#",
581 addr->sa_family,
582 addr->sa_data,
583 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000584
Guido van Rossum30a685f1991-06-27 15:51:29 +0000585 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000586}
587
Guido van Rossum30a685f1991-06-27 15:51:29 +0000588
589/* Parse a socket address argument according to the socket object's
590 address family. Return 1 if the address was in the proper format,
591 0 of not. The address is returned through addr_ret, its length
592 through len_ret. */
593
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000594static int
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000595getsockaddrarg(PySocketSockObject *s, PyObject *args, struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000596{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000597 switch (s->sock_family) {
598
Guido van Rossumb6775db1994-08-01 11:34:53 +0000599#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000600 case AF_UNIX:
601 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000602 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000603 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000604 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000605 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000606 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000607 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000608 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000609 PyErr_SetString(PySocket_Error,
610 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000611 return 0;
612 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000613 addr->sun_family = AF_UNIX;
614 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000615 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000616 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000617 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000618 return 1;
619 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000620#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000621
Guido van Rossum30a685f1991-06-27 15:51:29 +0000622 case AF_INET:
623 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000624 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000625 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000626 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000627 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000628 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000629 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000630 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000631 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000632 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000633 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000634 *addr_ret = (struct sockaddr *) addr;
635 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000636 return 1;
637 }
638
Guido van Rossum30a685f1991-06-27 15:51:29 +0000639 /* More cases here... */
640
641 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000642 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000643 return 0;
644
645 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000646}
647
Guido van Rossum30a685f1991-06-27 15:51:29 +0000648
Guido van Rossum710e1df1992-06-12 10:39:36 +0000649/* Get the address length according to the socket object's address family.
650 Return 1 if the family is known, 0 otherwise. The length is returned
651 through len_ret. */
652
653static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000654getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000655{
656 switch (s->sock_family) {
657
Guido van Rossumb6775db1994-08-01 11:34:53 +0000658#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000659 case AF_UNIX:
660 {
661 *len_ret = sizeof (struct sockaddr_un);
662 return 1;
663 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000664#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000665
666 case AF_INET:
667 {
668 *len_ret = sizeof (struct sockaddr_in);
669 return 1;
670 }
671
672 /* More cases here... */
673
674 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000675 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000676 return 0;
677
678 }
679}
680
681
Guido van Rossum30a685f1991-06-27 15:51:29 +0000682/* s.accept() method */
683
Guido van Rossum73624e91994-10-10 17:59:00 +0000684static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000685PySocketSock_accept(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000686{
687 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000688 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000689 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000690 PyObject *sock = NULL;
691 PyObject *addr = NULL;
692 PyObject *res = NULL;
693
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000694 if (!PyArg_ParseTuple(args, ":accept"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000695 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000696 if (!getsockaddrlen(s, &addrlen))
697 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000698 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000699 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000700 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000701#ifdef MS_WINDOWS
702 if (newfd == INVALID_SOCKET)
703#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000704 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000705#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000706 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000707
Guido van Rossum30a685f1991-06-27 15:51:29 +0000708 /* Create the new object with unspecified family,
709 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000710 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000711 s->sock_family,
712 s->sock_type,
713 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000714 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000715 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000716 goto finally;
717 }
718 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
719 goto finally;
720
721 if (!(res = Py_BuildValue("OO", sock, addr)))
722 goto finally;
723
724 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000725 Py_XDECREF(sock);
726 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000727 return res;
728}
729
Guido van Rossum82a5c661998-07-07 20:45:43 +0000730static char accept_doc[] =
731"accept() -> (socket object, address info)\n\
732\n\
733Wait for an incoming connection. Return a new socket representing the\n\
734connection, and the address of the client. For IP sockets, the address\n\
735info is a pair (hostaddr, port).";
736
Guido van Rossum30a685f1991-06-27 15:51:29 +0000737
Guido van Rossume4485b01994-09-07 14:32:49 +0000738/* s.setblocking(1 | 0) method */
739
Guido van Rossum73624e91994-10-10 17:59:00 +0000740static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000741PySocketSock_setblocking(PySocketSockObject *s, PyObject *args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000742{
743 int block;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000744#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000745 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000746#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000747 if (!PyArg_ParseTuple(args, "i:setblocking", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000748 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000749 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000750#ifdef __BEOS__
751 block = !block;
752 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
753 (void *)(&block), sizeof( int ) );
754#else
Guido van Rossum6f489d91996-06-28 20:15:15 +0000755#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000756#ifdef PYOS_OS2
757 block = !block;
758 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
759#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000760 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
761 if (block)
762 delay_flag &= (~O_NDELAY);
763 else
764 delay_flag |= O_NDELAY;
765 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000766#endif /* !PYOS_OS2 */
767#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000768 block = !block;
769 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000770#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000771#endif /* __BEOS__ */
Guido van Rossum73624e91994-10-10 17:59:00 +0000772 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000773
Guido van Rossum73624e91994-10-10 17:59:00 +0000774 Py_INCREF(Py_None);
775 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000776}
Guido van Rossume4485b01994-09-07 14:32:49 +0000777
Guido van Rossum82a5c661998-07-07 20:45:43 +0000778static char setblocking_doc[] =
779"setblocking(flag)\n\
780\n\
781Set the socket to blocking (flag is true) or non-blocking (false).\n\
782This uses the FIONBIO ioctl with the O_NDELAY flag.";
783
Guido van Rossume4485b01994-09-07 14:32:49 +0000784
Guido van Rossumaee08791992-09-08 09:05:33 +0000785/* s.setsockopt() method.
786 With an integer third argument, sets an integer option.
787 With a string third argument, sets an option from a buffer;
788 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000789
Guido van Rossum73624e91994-10-10 17:59:00 +0000790static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000791PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000792{
793 int level;
794 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000795 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000796 char *buf;
797 int buflen;
798 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000799
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000800 if (PyArg_ParseTuple(args, "iii:setsockopt",
801 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000802 buf = (char *) &flag;
803 buflen = sizeof flag;
804 }
805 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000806 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000807 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
808 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000809 return NULL;
810 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000811 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000812 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000813 return PySocket_Err();
814 Py_INCREF(Py_None);
815 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000816}
817
Guido van Rossum82a5c661998-07-07 20:45:43 +0000818static char setsockopt_doc[] =
819"setsockopt(level, option, value)\n\
820\n\
821Set a socket option. See the Unix manual for level and option.\n\
822The value argument can either be an integer or a string.";
823
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000824
Guido van Rossumaee08791992-09-08 09:05:33 +0000825/* s.getsockopt() method.
826 With two arguments, retrieves an integer option.
827 With a third integer argument, retrieves a string buffer of that size;
828 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000829
Guido van Rossum73624e91994-10-10 17:59:00 +0000830static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000831PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000832{
833 int level;
834 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000835 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000836 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000837 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000838
Guido van Rossumbcc20741998-08-04 22:53:56 +0000839#ifdef __BEOS__
840/* We have incomplete socket support. */
841 PyErr_SetString( PySocket_Error, "getsockopt not supported" );
842 return NULL;
843#else
844
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000845 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
846 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +0000847 return NULL;
848
849 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000850 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000851 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000852 res = getsockopt(s->sock_fd, level, optname,
853 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000854 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000855 return PySocket_Err();
856 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000857 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000858 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000859 PyErr_SetString(PySocket_Error,
860 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000861 return NULL;
862 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000863 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000864 if (buf == NULL)
865 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000866 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000867 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000868 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000869 Py_DECREF(buf);
870 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000871 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000872 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000873 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000874#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000875}
876
Guido van Rossum82a5c661998-07-07 20:45:43 +0000877static char getsockopt_doc[] =
878"getsockopt(level, option[, buffersize]) -> value\n\
879\n\
880Get a socket option. See the Unix manual for level and option.\n\
881If a nonzero buffersize argument is given, the return value is a\n\
882string of that length; otherwise it is an integer.";
883
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000884
Fred Drake728819a2000-07-01 03:40:12 +0000885/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000886
Guido van Rossum73624e91994-10-10 17:59:00 +0000887static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000888PySocketSock_bind(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000889{
890 struct sockaddr *addr;
891 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000892 int res;
Fred Drake728819a2000-07-01 03:40:12 +0000893 PyObject *addro;
894 if (!PyArg_ParseTuple(args, "O:bind", &addro))
895 return NULL;
896 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000897 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000898 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000899 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000900 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000901 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000902 return PySocket_Err();
903 Py_INCREF(Py_None);
904 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000905}
906
Guido van Rossum82a5c661998-07-07 20:45:43 +0000907static char bind_doc[] =
908"bind(address)\n\
909\n\
910Bind the socket to a local address. For IP sockets, the address is a\n\
911pair (host, port); the host must refer to the local host.";
912
Guido van Rossum30a685f1991-06-27 15:51:29 +0000913
914/* s.close() method.
915 Set the file descriptor to -1 so operations tried subsequently
916 will surely fail. */
917
Guido van Rossum73624e91994-10-10 17:59:00 +0000918static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000919PySocketSock_close(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000920{
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000921 if (!PyArg_ParseTuple(args, ":close"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000922 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000923 if (s->sock_fd != -1) {
924 Py_BEGIN_ALLOW_THREADS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000925 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum08481461996-10-12 14:07:22 +0000926 Py_END_ALLOW_THREADS
927 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000928 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000929 Py_INCREF(Py_None);
930 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000931}
932
Guido van Rossum82a5c661998-07-07 20:45:43 +0000933static char close_doc[] =
934"close()\n\
935\n\
936Close the socket. It cannot be used after this call.";
937
Guido van Rossum30a685f1991-06-27 15:51:29 +0000938
Fred Drake728819a2000-07-01 03:40:12 +0000939/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000940
Guido van Rossum73624e91994-10-10 17:59:00 +0000941static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000942PySocketSock_connect(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000943{
944 struct sockaddr *addr;
945 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000946 int res;
Fred Drake728819a2000-07-01 03:40:12 +0000947 PyObject *addro;
948 if (!PyArg_ParseTuple(args, "O:connect", &addro))
949 return NULL;
950 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000951 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000952 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000953 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000954 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000955 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000956 return PySocket_Err();
957 Py_INCREF(Py_None);
958 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000959}
960
Guido van Rossum82a5c661998-07-07 20:45:43 +0000961static char connect_doc[] =
962"connect(address)\n\
963\n\
964Connect the socket to a remote address. For IP sockets, the address\n\
965is a pair (host, port).";
966
Guido van Rossum30a685f1991-06-27 15:51:29 +0000967
Fred Drake728819a2000-07-01 03:40:12 +0000968/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000969
970static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000971PySocketSock_connect_ex(PySocketSockObject *s, PyObject *args)
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000972{
973 struct sockaddr *addr;
974 int addrlen;
975 int res;
Fred Drake728819a2000-07-01 03:40:12 +0000976 PyObject *addro;
977 if (!PyArg_ParseTuple(args, "O:connect_ex", &addro))
978 return NULL;
979 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000980 return NULL;
981 Py_BEGIN_ALLOW_THREADS
982 res = connect(s->sock_fd, addr, addrlen);
983 Py_END_ALLOW_THREADS
984 if (res != 0)
985 res = errno;
986 return PyInt_FromLong((long) res);
987}
988
Guido van Rossum82a5c661998-07-07 20:45:43 +0000989static char connect_ex_doc[] =
990"connect_ex(address)\n\
991\n\
992This is like connect(address), but returns an error code (the errno value)\n\
993instead of raising an exception when an error occurs.";
994
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000995
Guido van Rossumed233a51992-06-23 09:07:03 +0000996/* s.fileno() method */
997
Guido van Rossum73624e91994-10-10 17:59:00 +0000998static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000999PySocketSock_fileno(PySocketSockObject *s, PyObject *args)
Guido van Rossumed233a51992-06-23 09:07:03 +00001000{
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001001 if (!PyArg_ParseTuple(args, ":fileno"))
Guido van Rossumed233a51992-06-23 09:07:03 +00001002 return NULL;
Fred Drakea04eaad2000-06-30 02:46:07 +00001003#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001004 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001005#else
1006 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1007#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001008}
1009
Guido van Rossum82a5c661998-07-07 20:45:43 +00001010static char fileno_doc[] =
1011"fileno() -> integer\n\
1012\n\
1013Return the integer file descriptor of the socket.";
1014
Guido van Rossumed233a51992-06-23 09:07:03 +00001015
Guido van Rossumbe32c891996-06-20 16:25:29 +00001016#ifndef NO_DUP
1017/* s.dup() method */
1018
1019static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001020PySocketSock_dup(PySocketSockObject *s, PyObject *args)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001021{
Fred Drakea04eaad2000-06-30 02:46:07 +00001022 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001023 PyObject *sock;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001024 if (!PyArg_ParseTuple(args, ":dup"))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001025 return NULL;
1026 newfd = dup(s->sock_fd);
1027 if (newfd < 0)
1028 return PySocket_Err();
1029 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001030 s->sock_family,
1031 s->sock_type,
1032 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001033 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001034 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001035 return sock;
1036}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001037
1038static char dup_doc[] =
1039"dup() -> socket object\n\
1040\n\
1041Return a new socket object connected to the same system resource.";
1042
Guido van Rossumbe32c891996-06-20 16:25:29 +00001043#endif
1044
1045
Guido van Rossumc89705d1992-11-26 08:54:07 +00001046/* s.getsockname() method */
1047
Guido van Rossum73624e91994-10-10 17:59:00 +00001048static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001049PySocketSock_getsockname(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001050{
1051 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001052 int res;
1053 socklen_t addrlen;
1054
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001055 if (!PyArg_ParseTuple(args, ":getsockname"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001056 return NULL;
1057 if (!getsockaddrlen(s, &addrlen))
1058 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001059 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001060 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001061 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001062 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001063 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001064 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001065 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1066}
1067
Guido van Rossum82a5c661998-07-07 20:45:43 +00001068static char getsockname_doc[] =
1069"getsockname() -> address info\n\
1070\n\
1071Return the address of the local endpoint. For IP sockets, the address\n\
1072info is a pair (hostaddr, port).";
1073
Guido van Rossumc89705d1992-11-26 08:54:07 +00001074
Guido van Rossumb6775db1994-08-01 11:34:53 +00001075#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001076/* s.getpeername() method */
1077
Guido van Rossum73624e91994-10-10 17:59:00 +00001078static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001079PySocketSock_getpeername(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001080{
1081 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001082 int res;
1083 socklen_t addrlen;
1084
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001085 if (!PyArg_ParseTuple(args, ":getpeername"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001086 return NULL;
1087 if (!getsockaddrlen(s, &addrlen))
1088 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001089 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001090 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001091 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001092 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001093 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001094 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1095}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001096
1097static char getpeername_doc[] =
1098"getpeername() -> address info\n\
1099\n\
1100Return the address of the remote endpoint. For IP sockets, the address\n\
1101info is a pair (hostaddr, port).";
1102
Guido van Rossumb6775db1994-08-01 11:34:53 +00001103#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001104
1105
Guido van Rossum30a685f1991-06-27 15:51:29 +00001106/* s.listen(n) method */
1107
Guido van Rossum73624e91994-10-10 17:59:00 +00001108static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001109PySocketSock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001110{
1111 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001112 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001113 if (!PyArg_ParseTuple(args, "i:listen", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001114 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001115 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001116 if (backlog < 1)
1117 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001118 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001119 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001120 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001121 return PySocket_Err();
1122 Py_INCREF(Py_None);
1123 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001124}
1125
Guido van Rossum82a5c661998-07-07 20:45:43 +00001126static char listen_doc[] =
1127"listen(backlog)\n\
1128\n\
1129Enable a server to accept connections. The backlog argument must be at\n\
1130least 1; it specifies the number of unaccepted connection that the system\n\
1131will allow before refusing new connections.";
1132
1133
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001134#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001135/* s.makefile(mode) method.
1136 Create a new open file object referring to a dupped version of
1137 the socket's file descriptor. (The dup() call is necessary so
1138 that the open file and socket objects may be closed independent
1139 of each other.)
1140 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1141
Guido van Rossum73624e91994-10-10 17:59:00 +00001142static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001143PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001144{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001145 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001146 char *mode = "r";
1147 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001148#ifdef MS_WIN32
1149 intptr_t fd;
1150#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001151 int fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001152#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001153 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001154 PyObject *f;
1155
Guido van Rossum43713e52000-02-29 13:59:29 +00001156 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001157 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001158#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001159 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1160 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001161#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001162 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001163#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001164 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001165 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001166 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001167 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001168 }
1169 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1170 if (f != NULL)
1171 PyFile_SetBufSize(f, bufsize);
1172 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001173}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001174
1175static char makefile_doc[] =
1176"makefile([mode[, buffersize]]) -> file object\n\
1177\n\
1178Return a regular file object corresponding to the socket.\n\
1179The mode and buffersize arguments are as for the built-in open() function.";
1180
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001181#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001182
Guido van Rossum82a5c661998-07-07 20:45:43 +00001183
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001184/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001185
Guido van Rossum73624e91994-10-10 17:59:00 +00001186static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001187PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001188{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001189 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001190 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001191 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001192 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001193 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001194 if (buf == NULL)
1195 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001196 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001197 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001198 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001199 if (n < 0) {
1200 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001201 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001202 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001203 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001204 return NULL;
1205 return buf;
1206}
1207
Guido van Rossum82a5c661998-07-07 20:45:43 +00001208static char recv_doc[] =
1209"recv(buffersize[, flags]) -> data\n\
1210\n\
1211Receive up to buffersize bytes from the socket. For the optional flags\n\
1212argument, see the Unix manual. When no data is available, block until\n\
1213at least one byte is available or until the remote end is closed. When\n\
1214the remote end is closed and all data is read, return the empty string.";
1215
Guido van Rossum30a685f1991-06-27 15:51:29 +00001216
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001217/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001218
Guido van Rossum73624e91994-10-10 17:59:00 +00001219static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001220PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001221{
1222 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001223 PyObject *buf = NULL;
1224 PyObject *addr = NULL;
1225 PyObject *ret = NULL;
1226
Guido van Rossumff3ab422000-04-24 15:16:03 +00001227 int len, n, flags = 0;
1228 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001229 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001230 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001231 if (!getsockaddrlen(s, &addrlen))
1232 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001233 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001234 if (buf == NULL)
1235 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001236 Py_BEGIN_ALLOW_THREADS
1237 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001238#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001239#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001240 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001241#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001242 (ANY *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001243#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001244#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001245 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001246#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001247 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001248 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001249 if (n < 0) {
1250 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001251 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001252 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001253 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001254 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00001255
1256 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
1257 goto finally;
1258
Guido van Rossum73624e91994-10-10 17:59:00 +00001259 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001260 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001261 Py_XDECREF(addr);
1262 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001263 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001264}
1265
Guido van Rossum82a5c661998-07-07 20:45:43 +00001266static char recvfrom_doc[] =
1267"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1268\n\
1269Like recv(buffersize, flags) but also return the sender's address info.";
1270
Guido van Rossum30a685f1991-06-27 15:51:29 +00001271
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001272/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001273
Guido van Rossum73624e91994-10-10 17:59:00 +00001274static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001275PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001276{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001277 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001278 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001279 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +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 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001283 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001284 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001285 return PySocket_Err();
1286 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001287}
1288
Guido van Rossum82a5c661998-07-07 20:45:43 +00001289static char send_doc[] =
1290"send(data[, flags])\n\
1291\n\
1292Send a data string to the socket. For the optional flags\n\
1293argument, see the Unix manual.";
1294
Guido van Rossum30a685f1991-06-27 15:51:29 +00001295
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001296/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001297
Guido van Rossum73624e91994-10-10 17:59:00 +00001298static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001299PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001300{
Guido van Rossum73624e91994-10-10 17:59:00 +00001301 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001302 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001303 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001304 int addrlen, len, n, flags;
1305 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001306 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001307 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001308 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1309 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001310 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001311 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001312 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001313 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001314 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001315 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001316 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001317 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001318 return PySocket_Err();
1319 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001320}
1321
Guido van Rossum82a5c661998-07-07 20:45:43 +00001322static char sendto_doc[] =
1323"sendto(data[, flags], address)\n\
1324\n\
1325Like send(data, flags) but allows specifying the destination address.\n\
1326For IP sockets, the address is a pair (hostaddr, port).";
1327
Guido van Rossum30a685f1991-06-27 15:51:29 +00001328
1329/* s.shutdown(how) method */
1330
Guido van Rossum73624e91994-10-10 17:59:00 +00001331static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001332PySocketSock_shutdown(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001333{
1334 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001335 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001336 if (!PyArg_ParseTuple(args, "i:shutdown", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001337 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001338 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001339 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001340 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001341 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001342 return PySocket_Err();
1343 Py_INCREF(Py_None);
1344 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001345}
1346
Guido van Rossum82a5c661998-07-07 20:45:43 +00001347static char shutdown_doc[] =
1348"shutdown(flag)\n\
1349\n\
1350Shut down the reading side of the socket (flag == 0), the writing side\n\
1351of the socket (flag == 1), or both ends (flag == 2).";
1352
Guido van Rossum30a685f1991-06-27 15:51:29 +00001353
1354/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001355
Guido van Rossum73624e91994-10-10 17:59:00 +00001356static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001357 {"accept", (PyCFunction)PySocketSock_accept, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001358 accept_doc},
Fred Drake728819a2000-07-01 03:40:12 +00001359 {"bind", (PyCFunction)PySocketSock_bind, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001360 bind_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001361 {"close", (PyCFunction)PySocketSock_close, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001362 close_doc},
Fred Drake728819a2000-07-01 03:40:12 +00001363 {"connect", (PyCFunction)PySocketSock_connect, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001364 connect_doc},
Fred Drake728819a2000-07-01 03:40:12 +00001365 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001366 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001367#ifndef NO_DUP
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001368 {"dup", (PyCFunction)PySocketSock_dup, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001369 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001370#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001371 {"fileno", (PyCFunction)PySocketSock_fileno, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001372 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001373#ifdef HAVE_GETPEERNAME
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001374 {"getpeername", (PyCFunction)PySocketSock_getpeername, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001375 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001376#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001377 {"getsockname", (PyCFunction)PySocketSock_getsockname, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001378 getsockname_doc},
1379 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1,
1380 getsockopt_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001381 {"listen", (PyCFunction)PySocketSock_listen, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001382 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001383#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001384 {"makefile", (PyCFunction)PySocketSock_makefile, 1,
1385 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001386#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001387 {"recv", (PyCFunction)PySocketSock_recv, 1,
1388 recv_doc},
1389 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1,
1390 recvfrom_doc},
1391 {"send", (PyCFunction)PySocketSock_send, 1,
1392 send_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001393 {"sendto", (PyCFunction)PySocketSock_sendto, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001394 sendto_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001395 {"setblocking", (PyCFunction)PySocketSock_setblocking, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001396 setblocking_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001397 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001398 setsockopt_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001399 {"shutdown", (PyCFunction)PySocketSock_shutdown, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001400 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001401 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001402};
1403
Guido van Rossum30a685f1991-06-27 15:51:29 +00001404
Guido van Rossum73624e91994-10-10 17:59:00 +00001405/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001406 First close the file description. */
1407
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001408static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001409PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001410{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001411 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001412 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001413 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001414}
1415
Guido van Rossum30a685f1991-06-27 15:51:29 +00001416
1417/* Return a socket object's named attribute. */
1418
Guido van Rossum73624e91994-10-10 17:59:00 +00001419static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001420PySocketSock_getattr(PySocketSockObject *s, char *name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001421{
Guido van Rossum73624e91994-10-10 17:59:00 +00001422 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001423}
1424
Guido van Rossum30a685f1991-06-27 15:51:29 +00001425
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001426static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001427PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001428{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001429 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001430#if SIZEOF_SOCKET_T > SIZEOF_LONG
1431 if (s->sock_fd > LONG_MAX) {
1432 /* this can occur on Win64, and actually there is a special
1433 ugly printf formatter for decimal pointer length integer
1434 printing, only bother if necessary*/
1435 PyErr_SetString(PyExc_OverflowError,
1436 "no printf formatter to display the socket descriptor in decimal");
1437 return NULL;
1438 }
1439#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001440 sprintf(buf,
Fred Drakea04eaad2000-06-30 02:46:07 +00001441 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
1442 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001443 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001444}
1445
1446
Guido van Rossumb6775db1994-08-01 11:34:53 +00001447/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001448
Guido van Rossum73624e91994-10-10 17:59:00 +00001449static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001450 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001451 0,
1452 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001453 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001454 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001455 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001456 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001457 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001458 0, /*tp_setattr*/
1459 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001460 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001461 0, /*tp_as_number*/
1462 0, /*tp_as_sequence*/
1463 0, /*tp_as_mapping*/
1464};
1465
Guido van Rossum30a685f1991-06-27 15:51:29 +00001466
Guido van Rossum81194471991-07-27 21:42:02 +00001467/* Python interface to gethostname(). */
1468
1469/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001470static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001471PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001472{
1473 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001474 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001475 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001476 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001477 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001478 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001479 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001480 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001481 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001482 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001483 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001484}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001485
Guido van Rossum82a5c661998-07-07 20:45:43 +00001486static char gethostname_doc[] =
1487"gethostname() -> string\n\
1488\n\
1489Return the current host name.";
1490
Guido van Rossumff4949e1992-08-05 19:58:53 +00001491
Guido van Rossum30a685f1991-06-27 15:51:29 +00001492/* Python interface to gethostbyname(name). */
1493
1494/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001495static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001496PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001497{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001498 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001499 struct sockaddr_in addrbuf;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001500 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001501 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001502 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001503 return NULL;
1504 return makeipaddr(&addrbuf);
1505}
1506
Guido van Rossum82a5c661998-07-07 20:45:43 +00001507static char gethostbyname_doc[] =
1508"gethostbyname(host) -> address\n\
1509\n\
1510Return the IP address (a string of the form '255.255.255.255') for a host.";
1511
1512
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001513/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1514
1515static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001516gethost_common(struct hostent *h, struct sockaddr_in *addr)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001517{
1518 char **pch;
1519 PyObject *rtn_tuple = (PyObject *)NULL;
1520 PyObject *name_list = (PyObject *)NULL;
1521 PyObject *addr_list = (PyObject *)NULL;
1522 PyObject *tmp;
1523 if (h == NULL) {
1524#ifdef HAVE_HSTRERROR
1525 /* Let's get real error message to return */
1526 extern int h_errno;
1527 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1528#else
1529 PyErr_SetString(PySocket_Error, "host not found");
1530#endif
1531 return NULL;
1532 }
1533 if ((name_list = PyList_New(0)) == NULL)
1534 goto err;
1535 if ((addr_list = PyList_New(0)) == NULL)
1536 goto err;
1537 for (pch = h->h_aliases; *pch != NULL; pch++) {
1538 int status;
1539 tmp = PyString_FromString(*pch);
1540 if (tmp == NULL)
1541 goto err;
1542 status = PyList_Append(name_list, tmp);
1543 Py_DECREF(tmp);
1544 if (status)
1545 goto err;
1546 }
1547 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1548 int status;
1549 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1550 tmp = makeipaddr(addr);
1551 if (tmp == NULL)
1552 goto err;
1553 status = PyList_Append(addr_list, tmp);
1554 Py_DECREF(tmp);
1555 if (status)
1556 goto err;
1557 }
1558 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1559 err:
1560 Py_XDECREF(name_list);
1561 Py_XDECREF(addr_list);
1562 return rtn_tuple;
1563}
1564
1565
1566/* Python interface to gethostbyname_ex(name). */
1567
1568/*ARGSUSED*/
1569static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001570PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001571{
1572 char *name;
1573 struct hostent *h;
1574 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001575 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001576#ifdef HAVE_GETHOSTBYNAME_R
1577 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001578#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1579 struct hostent_data data;
1580#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001581 char buf[16384];
1582 int buf_len = (sizeof buf) - 1;
1583 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001584#endif
1585#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001586 int result;
1587#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001588#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001589 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001590 return NULL;
1591 if (setipaddr(name, &addr) < 0)
1592 return NULL;
1593 Py_BEGIN_ALLOW_THREADS
1594#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001595#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001596 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001597#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001598 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001599#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001600 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001601 result = gethostbyname_r(name, &hp_allocated, &data);
1602 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001603#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001604#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001605#ifdef USE_GETHOSTBYNAME_LOCK
1606 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001607#endif
1608 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001609#endif /* HAVE_GETHOSTBYNAME_R */
1610 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001611 ret = gethost_common(h, &addr);
1612#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001613 PyThread_release_lock(gethostbyname_lock);
1614#endif
1615 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001616}
1617
1618static char ghbn_ex_doc[] =
1619"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1620\n\
1621Return the true host name, a list of aliases, and a list of IP addresses,\n\
1622for a host. The host argument is a string giving a host name or IP number.";
1623
1624
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001625/* Python interface to gethostbyaddr(IP). */
1626
1627/*ARGSUSED*/
1628static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001629PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001630{
1631 struct sockaddr_in addr;
1632 char *ip_num;
1633 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001634 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001635#ifdef HAVE_GETHOSTBYNAME_R
1636 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001637#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1638 struct hostent_data data;
1639#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001640 char buf[16384];
1641 int buf_len = (sizeof buf) - 1;
1642 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001643#endif
1644#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001645 int result;
1646#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001647#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001648
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001649 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001650 return NULL;
1651 if (setipaddr(ip_num, &addr) < 0)
1652 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001653 Py_BEGIN_ALLOW_THREADS
1654#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001655#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001656 result = gethostbyaddr_r((char *)&addr.sin_addr,
1657 sizeof(addr.sin_addr),
1658 AF_INET, &hp_allocated, buf, buf_len,
1659 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001660#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001661 h = gethostbyaddr_r((char *)&addr.sin_addr,
1662 sizeof(addr.sin_addr),
1663 AF_INET,
1664 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001665#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001666 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001667 result = gethostbyaddr_r((char *)&addr.sin_addr,
1668 sizeof(addr.sin_addr),
1669 AF_INET, &hp_allocated, &data);
1670 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001671#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001672#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001673#ifdef USE_GETHOSTBYNAME_LOCK
1674 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001675#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001676 h = gethostbyaddr((char *)&addr.sin_addr,
1677 sizeof(addr.sin_addr),
1678 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001679#endif /* HAVE_GETHOSTBYNAME_R */
1680 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001681 ret = gethost_common(h, &addr);
1682#ifdef USE_GETHOSTBYNAME_LOCK
1683 PyThread_release_lock(gethostbyname_lock);
1684#endif
1685 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001686}
1687
Guido van Rossum82a5c661998-07-07 20:45:43 +00001688static char gethostbyaddr_doc[] =
1689"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1690\n\
1691Return the true host name, a list of aliases, and a list of IP addresses,\n\
1692for a host. The host argument is a string giving a host name or IP number.";
1693
Guido van Rossum30a685f1991-06-27 15:51:29 +00001694
1695/* Python interface to getservbyname(name).
1696 This only returns the port number, since the other info is already
1697 known or not useful (like the list of aliases). */
1698
1699/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001700static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001701PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001702{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001703 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001704 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001705 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001706 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001707 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001708 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001709 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001710 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001711 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001712 return NULL;
1713 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001714 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001715}
1716
Guido van Rossum82a5c661998-07-07 20:45:43 +00001717static char getservbyname_doc[] =
1718"getservbyname(servicename, protocolname) -> integer\n\
1719\n\
1720Return a port number from a service name and protocol name.\n\
1721The protocol name should be 'tcp' or 'udp'.";
1722
Guido van Rossum30a685f1991-06-27 15:51:29 +00001723
Guido van Rossum3901d851996-12-19 16:35:04 +00001724/* Python interface to getprotobyname(name).
1725 This only returns the protocol number, since the other info is
1726 already known or not useful (like the list of aliases). */
1727
1728/*ARGSUSED*/
1729static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001730PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00001731{
1732 char *name;
1733 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001734#ifdef __BEOS__
1735/* Not available in BeOS yet. - [cjh] */
1736 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1737 return NULL;
1738#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001739 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00001740 return NULL;
1741 Py_BEGIN_ALLOW_THREADS
1742 sp = getprotobyname(name);
1743 Py_END_ALLOW_THREADS
1744 if (sp == NULL) {
1745 PyErr_SetString(PySocket_Error, "protocol not found");
1746 return NULL;
1747 }
1748 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001749#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001750}
1751
Guido van Rossum82a5c661998-07-07 20:45:43 +00001752static char getprotobyname_doc[] =
1753"getprotobyname(name) -> integer\n\
1754\n\
1755Return the protocol number for the named protocol. (Rarely used.)";
1756
Guido van Rossum3901d851996-12-19 16:35:04 +00001757
Guido van Rossum30a685f1991-06-27 15:51:29 +00001758/* Python interface to socket(family, type, proto).
1759 The third (protocol) argument is optional.
1760 Return a new socket object. */
1761
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001762/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001763static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001764PySocket_socket(PyObject *self, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001765{
Guido van Rossum73624e91994-10-10 17:59:00 +00001766 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001767 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001768 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001769 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001770 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001771 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001772 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001773 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001774#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001775 if (fd == INVALID_SOCKET)
1776#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001777 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001778#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001779 return PySocket_Err();
1780 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001781 /* If the object can't be created, don't forget to close the
1782 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001783 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001784 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001785 /* From now on, ignore SIGPIPE and let the error checking
1786 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001787#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001788 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001789#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001790 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001791}
1792
Guido van Rossum82a5c661998-07-07 20:45:43 +00001793static char socket_doc[] =
1794"socket(family, type[, proto]) -> socket object\n\
1795\n\
1796Open a socket of the given type. The family argument specifies the\n\
1797address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1798The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1799or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1800specifying the default protocol.";
1801
1802
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001803#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001804/* Create a socket object from a numeric file description.
1805 Useful e.g. if stdin is a socket.
1806 Additional arguments as for socket(). */
1807
1808/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001809static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001810PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001811{
Guido van Rossum73624e91994-10-10 17:59:00 +00001812 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001813 SOCKET_T fd;
1814 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001815 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
1816 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001817 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001818 /* Dup the fd so it and the socket can be closed independently */
1819 fd = dup(fd);
1820 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001821 return PySocket_Err();
1822 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001823 /* From now on, ignore SIGPIPE and let the error checking
1824 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001825#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001826 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001827#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001828 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001829}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001830
1831static char fromfd_doc[] =
1832"fromfd(fd, family, type[, proto]) -> socket object\n\
1833\n\
1834Create a socket object from the given file descriptor.\n\
1835The remaining arguments are the same as for socket().";
1836
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001837#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001838
Guido van Rossum82a5c661998-07-07 20:45:43 +00001839
Guido van Rossum006bf911996-06-12 04:04:55 +00001840static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001841PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001842{
1843 int x1, x2;
1844
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001845 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001846 return NULL;
1847 }
1848 x2 = (int)ntohs((short)x1);
1849 return PyInt_FromLong(x2);
1850}
1851
Guido van Rossum82a5c661998-07-07 20:45:43 +00001852static char ntohs_doc[] =
1853"ntohs(integer) -> integer\n\
1854\n\
1855Convert a 16-bit integer from network to host byte order.";
1856
1857
Guido van Rossum006bf911996-06-12 04:04:55 +00001858static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001859PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001860{
1861 int x1, x2;
1862
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001863 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001864 return NULL;
1865 }
1866 x2 = ntohl(x1);
1867 return PyInt_FromLong(x2);
1868}
1869
Guido van Rossum82a5c661998-07-07 20:45:43 +00001870static char ntohl_doc[] =
1871"ntohl(integer) -> integer\n\
1872\n\
1873Convert a 32-bit integer from network to host byte order.";
1874
1875
Guido van Rossum006bf911996-06-12 04:04:55 +00001876static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001877PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001878{
1879 int x1, x2;
1880
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001881 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001882 return NULL;
1883 }
1884 x2 = (int)htons((short)x1);
1885 return PyInt_FromLong(x2);
1886}
1887
Guido van Rossum82a5c661998-07-07 20:45:43 +00001888static char htons_doc[] =
1889"htons(integer) -> integer\n\
1890\n\
1891Convert a 16-bit integer from host to network byte order.";
1892
1893
Guido van Rossum006bf911996-06-12 04:04:55 +00001894static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001895PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001896{
1897 int x1, x2;
1898
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001899 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001900 return NULL;
1901 }
1902 x2 = htonl(x1);
1903 return PyInt_FromLong(x2);
1904}
1905
Guido van Rossum82a5c661998-07-07 20:45:43 +00001906static char htonl_doc[] =
1907"htonl(integer) -> integer\n\
1908\n\
1909Convert a 32-bit integer from host to network byte order.";
1910
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001911/*
1912 * socket.inet_aton() and socket.inet_ntoa() functions
1913 *
1914 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
1915 *
1916 */
1917
1918static char inet_aton_doc[] =
1919"inet_aton(string) -> packed 32-bit IP representation\n\
1920\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001921Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001922binary format used in low-level network functions.";
1923
1924static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001925PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001926{
Guido van Rossuma2e48551999-09-09 15:42:59 +00001927#ifndef INADDR_NONE
1928#define INADDR_NONE (-1)
1929#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001930
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001931 /* Have to use inet_addr() instead */
1932 char *ip_addr;
1933 long packed_addr;
1934
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001935 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001936 return NULL;
1937 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00001938#ifdef USE_GUSI1
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001939 packed_addr = (long)inet_addr(ip_addr).s_addr;
1940#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001941 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001942#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001943
1944 if (packed_addr == INADDR_NONE) { /* invalid address */
1945 PyErr_SetString(PySocket_Error,
1946 "illegal IP address string passed to inet_aton");
1947 return NULL;
1948 }
1949
1950 return PyString_FromStringAndSize((char *) &packed_addr,
1951 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001952}
1953
1954static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00001955"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001956\n\
1957Convert an IP address from 32-bit packed binary format to string format";
1958
1959static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001960PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001961{
1962 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001963 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001964 struct in_addr packed_addr;
1965
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001966 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001967 return NULL;
1968 }
1969
1970 if (addr_len != sizeof(packed_addr)) {
1971 PyErr_SetString(PySocket_Error,
1972 "packed IP wrong length for inet_ntoa");
1973 return NULL;
1974 }
1975
1976 memcpy(&packed_addr, packed_str, addr_len);
1977
1978 return PyString_FromString(inet_ntoa(packed_addr));
1979}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001980
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001981
1982#ifdef USE_SSL
1983
1984/* This is a C function to be called for new object initialization */
1985static SSLObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001986newSSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001987{
1988 SSLObject *self;
1989 char *str;
1990
1991#if 0
1992 meth=SSLv23_client_method();
1993 meth=SSLv3_client_method();
1994 meth=SSLv2_client_method();
1995#endif
1996
Guido van Rossumb18618d2000-05-03 23:44:39 +00001997 self = PyObject_New(SSLObject, &SSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001998 if (self == NULL){
1999 PyErr_SetObject(SSLErrorObject,
2000 PyString_FromString("newSSLObject error"));
2001 return NULL;
2002 }
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002003 memset(self->server, '\0', sizeof(char) * 256);
2004 memset(self->issuer, '\0', sizeof(char) * 256);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002005
2006 self->x_attr = PyDict_New();
2007 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
2008 if (self->ctx == NULL) {
2009 PyErr_SetObject(SSLErrorObject,
2010 PyString_FromString("SSL_CTX_new error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002011 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002012 return NULL;
2013 }
2014
2015 if ( (key_file && !cert_file) || (!key_file && cert_file) )
2016 {
2017 PyErr_SetObject(SSLErrorObject,
2018 PyString_FromString(
2019 "Both the key & certificate files must be specified"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002020 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002021 return NULL;
2022 }
2023
2024 if (key_file && cert_file)
2025 {
2026 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
2027 SSL_FILETYPE_PEM) < 1)
2028 {
2029 PyErr_SetObject(SSLErrorObject,
2030 PyString_FromString(
2031 "SSL_CTX_use_PrivateKey_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002032 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002033 return NULL;
2034 }
2035
2036 if (SSL_CTX_use_certificate_chain_file(self->ctx,
2037 cert_file) < 1)
2038 {
2039 PyErr_SetObject(SSLErrorObject,
2040 PyString_FromString(
2041 "SSL_CTX_use_certificate_chain_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002042 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002043 return NULL;
2044 }
2045 }
2046
2047 SSL_CTX_set_verify(self->ctx,
2048 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2049 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2050 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2051 SSL_set_connect_state(self->ssl);
2052
2053 if ((SSL_connect(self->ssl)) == -1) {
2054 /* Actually negotiate SSL connection */
2055 PyErr_SetObject(SSLErrorObject,
2056 PyString_FromString("SSL_connect error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002057 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002058 return NULL;
2059 }
2060 self->ssl->debug = 1;
2061
2062 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2063 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
2064 self->server, 256);
2065 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2066 self->issuer, 256);
2067 }
2068 self->x_attr = NULL;
2069 self->Socket = Sock;
2070 Py_INCREF(self->Socket);
2071 return self;
2072}
2073
2074/* This is the Python function called for new object initialization */
2075static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002076PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002077{
2078 SSLObject *rv;
2079 PySocketSockObject *Sock;
2080 char *key_file;
2081 char *cert_file;
2082
Guido van Rossum43713e52000-02-29 13:59:29 +00002083 if (!PyArg_ParseTuple(args, "O!zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002084 &PySocketSock_Type, (PyObject*)&Sock,
2085 &key_file, &cert_file) )
2086 return NULL;
2087
2088 rv = newSSLObject(Sock, key_file, cert_file);
2089 if ( rv == NULL )
2090 return NULL;
2091 return (PyObject *)rv;
2092}
2093
2094static char ssl_doc[] =
2095"ssl(socket, keyfile, certfile) -> sslobject";
2096
2097static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002098SSL_server(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002099{
2100 return PyString_FromString(self->server);
2101}
2102
2103static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002104SSL_issuer(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002105{
2106 return PyString_FromString(self->issuer);
2107}
2108
2109
2110/* SSL object methods */
2111
2112static PyMethodDef SSLMethods[] = {
2113 { "write", (PyCFunction)SSL_SSLwrite, 1 },
2114 { "read", (PyCFunction)SSL_SSLread, 1 },
2115 { "server", (PyCFunction)SSL_server, 1 },
2116 { "issuer", (PyCFunction)SSL_issuer, 1 },
2117 { NULL, NULL}
2118};
2119
2120static void SSL_dealloc(SSLObject *self)
2121{
2122 if (self->server_cert) /* Possible not to have one? */
2123 X509_free (self->server_cert);
2124 SSL_CTX_free(self->ctx);
2125 SSL_free(self->ssl);
2126 Py_XDECREF(self->x_attr);
2127 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002128 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002129}
2130
2131static PyObject *SSL_getattr(SSLObject *self, char *name)
2132{
2133 return Py_FindMethod(SSLMethods, (PyObject *)self, name);
2134}
2135
2136staticforward PyTypeObject SSL_Type = {
2137 PyObject_HEAD_INIT(&PyType_Type)
2138 0, /*ob_size*/
2139 "SSL", /*tp_name*/
2140 sizeof(SSLObject), /*tp_basicsize*/
2141 0, /*tp_itemsize*/
2142 /* methods */
2143 (destructor)SSL_dealloc, /*tp_dealloc*/
2144 0, /*tp_print*/
2145 (getattrfunc)SSL_getattr, /*tp_getattr*/
2146 0, /*tp_setattr*/
2147 0, /*tp_compare*/
2148 0, /*tp_repr*/
2149 0, /*tp_as_number*/
2150 0, /*tp_as_sequence*/
2151 0, /*tp_as_mapping*/
2152 0, /*tp_hash*/
2153};
2154
2155
2156
2157static PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args)
2158{
2159 char *data;
Fred Drakea04eaad2000-06-30 02:46:07 +00002160 size_t len = 0;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002161
Guido van Rossum43713e52000-02-29 13:59:29 +00002162 if (!PyArg_ParseTuple(args, "s|i:write", &data, &len))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002163 return NULL;
2164
2165 if (!len)
2166 len = strlen(data);
2167
2168 len = SSL_write(self->ssl, data, len);
2169 return PyInt_FromLong((long)len);
2170}
2171
2172static PyObject *SSL_SSLread(SSLObject *self, PyObject *args)
2173{
2174 PyObject *buf;
2175 int count = 0;
2176 int len = 1024;
2177 int res;
2178
Guido van Rossum43713e52000-02-29 13:59:29 +00002179 PyArg_ParseTuple(args, "|i:read", &len);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002180
2181 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2182 return NULL; /* Error object should already be set */
2183
2184 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2185 res = SSL_get_error(self->ssl, count);
2186
2187 switch (res) {
2188 case 0: /* Good return value! */
2189 break;
2190 case 6:
2191 PyErr_SetString(SSLErrorObject, "EOF");
2192 Py_DECREF(buf);
2193 return NULL;
2194 break;
2195 case 5:
2196 default:
2197 return PyErr_SetFromErrno(SSLErrorObject);
2198 break;
2199 }
2200
2201 fflush(stderr);
2202
2203 if (count < 0) {
2204 Py_DECREF(buf);
2205 return PyErr_SetFromErrno(SSLErrorObject);
2206 }
2207
2208 if (count != len && _PyString_Resize(&buf, count) < 0)
2209 return NULL;
2210 return buf;
2211}
2212
2213#endif /* USE_SSL */
2214
2215
Guido van Rossum30a685f1991-06-27 15:51:29 +00002216/* List of functions exported by this module. */
2217
Guido van Rossum73624e91994-10-10 17:59:00 +00002218static PyMethodDef PySocket_methods[] = {
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002219 {"gethostbyname", PySocket_gethostbyname, 1, gethostbyname_doc},
2220 {"gethostbyname_ex", PySocket_gethostbyname_ex, 1, ghbn_ex_doc},
2221 {"gethostbyaddr", PySocket_gethostbyaddr, 1, gethostbyaddr_doc},
2222 {"gethostname", PySocket_gethostname, 1, gethostname_doc},
2223 {"getservbyname", PySocket_getservbyname, 1, getservbyname_doc},
2224 {"getprotobyname", PySocket_getprotobyname, 1,getprotobyname_doc},
Guido van Rossum82a5c661998-07-07 20:45:43 +00002225 {"socket", PySocket_socket, 1, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002226#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00002227 {"fromfd", PySocket_fromfd, 1, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002228#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002229 {"ntohs", PySocket_ntohs, 1, ntohs_doc},
2230 {"ntohl", PySocket_ntohl, 1, ntohl_doc},
2231 {"htons", PySocket_htons, 1, htons_doc},
2232 {"htonl", PySocket_htonl, 1, htonl_doc},
2233 {"inet_aton", PySocket_inet_aton, 1, inet_aton_doc},
2234 {"inet_ntoa", PySocket_inet_ntoa, 1, inet_ntoa_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002235#ifdef USE_SSL
2236 {"ssl", PySocket_ssl, 1, ssl_doc},
2237#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002238 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002239};
2240
Guido van Rossum30a685f1991-06-27 15:51:29 +00002241
2242/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002243 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002244 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002245 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002246static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002247insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002248{
Guido van Rossum73624e91994-10-10 17:59:00 +00002249 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002250 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002251 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002252
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002253 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002254}
2255
Guido van Rossum30a685f1991-06-27 15:51:29 +00002256
Guido van Rossum8d665e61996-06-26 18:22:49 +00002257#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002258
2259/* Additional initialization and cleanup for NT/Windows */
2260
2261static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002262NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002263{
2264 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002265}
2266
2267static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002268NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002269{
2270 WSADATA WSAData;
2271 int ret;
2272 char buf[100];
2273 ret = WSAStartup(0x0101, &WSAData);
2274 switch (ret) {
2275 case 0: /* no error */
2276 atexit(NTcleanup);
2277 return 1;
2278 case WSASYSNOTREADY:
2279 PyErr_SetString(PyExc_ImportError,
2280 "WSAStartup failed: network not ready");
2281 break;
2282 case WSAVERNOTSUPPORTED:
2283 case WSAEINVAL:
2284 PyErr_SetString(PyExc_ImportError,
2285 "WSAStartup failed: requested version not supported");
2286 break;
2287 default:
2288 sprintf(buf, "WSAStartup failed: error code %d", ret);
2289 PyErr_SetString(PyExc_ImportError, buf);
2290 break;
2291 }
2292 return 0;
2293}
2294
Guido van Rossum8d665e61996-06-26 18:22:49 +00002295#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002296
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002297#if defined(PYOS_OS2)
2298
2299/* Additional initialization and cleanup for OS/2 */
2300
2301static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002302OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002303{
2304 /* No cleanup is necessary for OS/2 Sockets */
2305}
2306
2307static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002308OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002309{
2310 char reason[64];
2311 int rc = sock_init();
2312
2313 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002314 atexit(OS2cleanup);
2315 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002316 }
2317
2318 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2319 PyErr_SetString(PyExc_ImportError, reason);
2320
Guido van Rossum32c575d1997-12-02 20:37:32 +00002321 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002322}
2323
2324#endif /* PYOS_OS2 */
2325
Guido van Rossum30a685f1991-06-27 15:51:29 +00002326/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002327 * This is called when the first 'import socket' is done,
2328 * via a table in config.c, if config.c is compiled with USE_SOCKET
2329 * defined.
2330 *
2331 * For MS_WINDOWS (which means any Windows variant), this module
2332 * is actually called "_socket", and there's a wrapper "socket.py"
2333 * which implements some missing functionality (such as makefile(),
2334 * dup() and fromfd()). The import of "_socket" may fail with an
2335 * ImportError exception if initialization of WINSOCK fails. When
2336 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2337 * scheduled to be made at exit time.
2338 *
2339 * For OS/2, this module is also called "_socket" and uses a wrapper
2340 * "socket.py" which implements that functionality that is missing
2341 * when PC operating systems don't put socket descriptors in the
2342 * operating system's filesystem layer.
2343 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002344
Guido van Rossum82a5c661998-07-07 20:45:43 +00002345static char module_doc[] =
2346"This module provides socket operations and some related functions.\n\
2347On Unix, it supports IP (Internet Protocol) and Unix domain sockets.\n\
2348On other systems, it only supports IP.\n\
2349\n\
2350Functions:\n\
2351\n\
2352socket() -- create a new socket object\n\
2353fromfd() -- create a socket object from an open file descriptor (*)\n\
2354gethostname() -- return the current hostname\n\
2355gethostbyname() -- map a hostname to its IP number\n\
2356gethostbyaddr() -- map an IP number or hostname to DNS info\n\
2357getservbyname() -- map a service name and a protocol name to a port number\n\
2358getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\
2359ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\
2360htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002361inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format\n\
2362inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)\n\
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002363ssl() -- secure socket layer support (only available if configured)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002364\n\
2365(*) not available on all platforms!)\n\
2366\n\
2367Special objects:\n\
2368\n\
2369SocketType -- type object for socket objects\n\
2370error -- exception raised for I/O errors\n\
2371\n\
2372Integer constants:\n\
2373\n\
2374AF_INET, AF_UNIX -- socket domains (first argument to socket() call)\n\
2375SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)\n\
2376\n\
2377Many other constants may be defined; these may be used in calls to\n\
2378the setsockopt() and getsockopt() methods.\n\
2379";
2380
2381static char sockettype_doc[] =
2382"A socket represents one endpoint of a network connection.\n\
2383\n\
2384Methods:\n\
2385\n\
2386accept() -- accept a connection, returning new socket and client address\n\
2387bind() -- bind the socket to a local address\n\
2388close() -- close the socket\n\
2389connect() -- connect the socket to a remote address\n\
2390connect_ex() -- connect, return an error code instead of an exception \n\
2391dup() -- return a new socket object identical to the current one (*)\n\
2392fileno() -- return underlying file descriptor\n\
2393getpeername() -- return remote address (*)\n\
2394getsockname() -- return local address\n\
2395getsockopt() -- get socket options\n\
2396listen() -- start listening for incoming connections\n\
2397makefile() -- return a file object corresponding tot the socket (*)\n\
2398recv() -- receive data\n\
2399recvfrom() -- receive data and sender's address\n\
2400send() -- send data\n\
2401sendto() -- send data to a given address\n\
2402setblocking() -- set or clear the blocking I/O flag\n\
2403setsockopt() -- set socket options\n\
2404shutdown() -- shut down traffic in one or both directions\n\
2405\n\
2406(*) not available on all platforms!)";
2407
Guido van Rossum3886bb61998-12-04 18:50:17 +00002408DL_EXPORT(void)
Guido van Rossumbcc20741998-08-04 22:53:56 +00002409#if defined(MS_WINDOWS) || defined(PYOS_OS2) || defined(__BEOS__)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002410init_socket()
2411#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002412initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00002413#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002414{
Guido van Rossum73624e91994-10-10 17:59:00 +00002415 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00002416#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002417 if (!NTinit())
2418 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002419 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002420#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002421#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002422 if (!OS2init())
2423 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002424 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002425#else
Guido van Rossumbcc20741998-08-04 22:53:56 +00002426#if defined(__BEOS__)
2427 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
2428#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00002429 m = Py_InitModule3("socket", PySocket_methods, module_doc);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002430#endif /* __BEOS__ */
Guido van Rossum32c575d1997-12-02 20:37:32 +00002431#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00002432#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002433 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002434 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2435 if (PySocket_Error == NULL)
2436 return;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002437#ifdef USE_SSL
2438 SSL_load_error_strings();
2439 SSLeay_add_ssl_algorithms();
2440 SSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2441 if (SSLErrorObject == NULL)
2442 return;
2443 PyDict_SetItemString(d, "sslerror", SSLErrorObject);
2444 Py_INCREF(&SSL_Type);
2445 if (PyDict_SetItemString(d, "SSLType",
2446 (PyObject *)&SSL_Type) != 0)
2447 return;
2448#endif /* USE_SSL */
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002449 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002450 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002451 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002452 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002453 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002454 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002455 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002456
2457 /* Address families (we only support AF_INET and AF_UNIX) */
2458#ifdef AF_UNSPEC
2459 insint(d, "AF_UNSPEC", AF_UNSPEC);
2460#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002461 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002462#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002463 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002464#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002465#ifdef AF_AX25
2466 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2467#endif
2468#ifdef AF_IPX
2469 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2470#endif
2471#ifdef AF_APPLETALK
2472 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2473#endif
2474#ifdef AF_NETROM
2475 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2476#endif
2477#ifdef AF_BRIDGE
2478 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2479#endif
2480#ifdef AF_AAL5
2481 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2482#endif
2483#ifdef AF_X25
2484 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2485#endif
2486#ifdef AF_INET6
2487 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2488#endif
2489#ifdef AF_ROSE
2490 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2491#endif
2492
2493 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002494 insint(d, "SOCK_STREAM", SOCK_STREAM);
2495 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002496#ifndef __BEOS__
2497/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002498 insint(d, "SOCK_RAW", SOCK_RAW);
2499 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2500 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002501#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002502
2503#ifdef SO_DEBUG
2504 insint(d, "SO_DEBUG", SO_DEBUG);
2505#endif
2506#ifdef SO_ACCEPTCONN
2507 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2508#endif
2509#ifdef SO_REUSEADDR
2510 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2511#endif
2512#ifdef SO_KEEPALIVE
2513 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2514#endif
2515#ifdef SO_DONTROUTE
2516 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2517#endif
2518#ifdef SO_BROADCAST
2519 insint(d, "SO_BROADCAST", SO_BROADCAST);
2520#endif
2521#ifdef SO_USELOOPBACK
2522 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2523#endif
2524#ifdef SO_LINGER
2525 insint(d, "SO_LINGER", SO_LINGER);
2526#endif
2527#ifdef SO_OOBINLINE
2528 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2529#endif
2530#ifdef SO_REUSEPORT
2531 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2532#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002533#ifdef SO_SNDBUF
2534 insint(d, "SO_SNDBUF", SO_SNDBUF);
2535#endif
2536#ifdef SO_RCVBUF
2537 insint(d, "SO_RCVBUF", SO_RCVBUF);
2538#endif
2539#ifdef SO_SNDLOWAT
2540 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2541#endif
2542#ifdef SO_RCVLOWAT
2543 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2544#endif
2545#ifdef SO_SNDTIMEO
2546 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2547#endif
2548#ifdef SO_RCVTIMEO
2549 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2550#endif
2551#ifdef SO_ERROR
2552 insint(d, "SO_ERROR", SO_ERROR);
2553#endif
2554#ifdef SO_TYPE
2555 insint(d, "SO_TYPE", SO_TYPE);
2556#endif
2557
2558 /* Maximum number of connections for "listen" */
2559#ifdef SOMAXCONN
2560 insint(d, "SOMAXCONN", SOMAXCONN);
2561#else
2562 insint(d, "SOMAXCONN", 5); /* Common value */
2563#endif
2564
2565 /* Flags for send, recv */
2566#ifdef MSG_OOB
2567 insint(d, "MSG_OOB", MSG_OOB);
2568#endif
2569#ifdef MSG_PEEK
2570 insint(d, "MSG_PEEK", MSG_PEEK);
2571#endif
2572#ifdef MSG_DONTROUTE
2573 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2574#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002575#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00002576 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002577#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002578#ifdef MSG_EOR
2579 insint(d, "MSG_EOR", MSG_EOR);
2580#endif
2581#ifdef MSG_TRUNC
2582 insint(d, "MSG_TRUNC", MSG_TRUNC);
2583#endif
2584#ifdef MSG_CTRUNC
2585 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2586#endif
2587#ifdef MSG_WAITALL
2588 insint(d, "MSG_WAITALL", MSG_WAITALL);
2589#endif
2590#ifdef MSG_BTAG
2591 insint(d, "MSG_BTAG", MSG_BTAG);
2592#endif
2593#ifdef MSG_ETAG
2594 insint(d, "MSG_ETAG", MSG_ETAG);
2595#endif
2596
2597 /* Protocol level and numbers, usable for [gs]etsockopt */
2598#ifdef SOL_SOCKET
2599 insint(d, "SOL_SOCKET", SOL_SOCKET);
2600#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002601#ifdef SOL_IP
2602 insint(d, "SOL_IP", SOL_IP);
2603#else
2604 insint(d, "SOL_IP", 0);
2605#endif
2606#ifdef SOL_IPX
2607 insint(d, "SOL_IPX", SOL_IPX);
2608#endif
2609#ifdef SOL_AX25
2610 insint(d, "SOL_AX25", SOL_AX25);
2611#endif
2612#ifdef SOL_ATALK
2613 insint(d, "SOL_ATALK", SOL_ATALK);
2614#endif
2615#ifdef SOL_NETROM
2616 insint(d, "SOL_NETROM", SOL_NETROM);
2617#endif
2618#ifdef SOL_ROSE
2619 insint(d, "SOL_ROSE", SOL_ROSE);
2620#endif
2621#ifdef SOL_TCP
2622 insint(d, "SOL_TCP", SOL_TCP);
2623#else
2624 insint(d, "SOL_TCP", 6);
2625#endif
2626#ifdef SOL_UDP
2627 insint(d, "SOL_UDP", SOL_UDP);
2628#else
2629 insint(d, "SOL_UDP", 17);
2630#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002631#ifdef IPPROTO_IP
2632 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002633#else
2634 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002635#endif
2636#ifdef IPPROTO_ICMP
2637 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002638#else
2639 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002640#endif
2641#ifdef IPPROTO_IGMP
2642 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2643#endif
2644#ifdef IPPROTO_GGP
2645 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2646#endif
2647#ifdef IPPROTO_TCP
2648 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002649#else
2650 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002651#endif
2652#ifdef IPPROTO_EGP
2653 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2654#endif
2655#ifdef IPPROTO_PUP
2656 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2657#endif
2658#ifdef IPPROTO_UDP
2659 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002660#else
2661 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002662#endif
2663#ifdef IPPROTO_IDP
2664 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2665#endif
2666#ifdef IPPROTO_HELLO
2667 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2668#endif
2669#ifdef IPPROTO_ND
2670 insint(d, "IPPROTO_ND", IPPROTO_ND);
2671#endif
2672#ifdef IPPROTO_TP
2673 insint(d, "IPPROTO_TP", IPPROTO_TP);
2674#endif
2675#ifdef IPPROTO_XTP
2676 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2677#endif
2678#ifdef IPPROTO_EON
2679 insint(d, "IPPROTO_EON", IPPROTO_EON);
2680#endif
2681#ifdef IPPROTO_BIP
2682 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2683#endif
2684/**/
2685#ifdef IPPROTO_RAW
2686 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002687#else
2688 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002689#endif
2690#ifdef IPPROTO_MAX
2691 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2692#endif
2693
2694 /* Some port configuration */
2695#ifdef IPPORT_RESERVED
2696 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2697#else
2698 insint(d, "IPPORT_RESERVED", 1024);
2699#endif
2700#ifdef IPPORT_USERRESERVED
2701 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2702#else
2703 insint(d, "IPPORT_USERRESERVED", 5000);
2704#endif
2705
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002706 /* Some reserved IP v.4 addresses */
2707#ifdef INADDR_ANY
2708 insint(d, "INADDR_ANY", INADDR_ANY);
2709#else
2710 insint(d, "INADDR_ANY", 0x00000000);
2711#endif
2712#ifdef INADDR_BROADCAST
2713 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2714#else
2715 insint(d, "INADDR_BROADCAST", 0xffffffff);
2716#endif
2717#ifdef INADDR_LOOPBACK
2718 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2719#else
2720 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2721#endif
2722#ifdef INADDR_UNSPEC_GROUP
2723 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2724#else
2725 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2726#endif
2727#ifdef INADDR_ALLHOSTS_GROUP
2728 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2729#else
2730 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2731#endif
2732#ifdef INADDR_MAX_LOCAL_GROUP
2733 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2734#else
2735 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2736#endif
2737#ifdef INADDR_NONE
2738 insint(d, "INADDR_NONE", INADDR_NONE);
2739#else
2740 insint(d, "INADDR_NONE", 0xffffffff);
2741#endif
2742
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002743 /* IP [gs]etsockopt options */
2744#ifdef IP_OPTIONS
2745 insint(d, "IP_OPTIONS", IP_OPTIONS);
2746#endif
2747#ifdef IP_HDRINCL
2748 insint(d, "IP_HDRINCL", IP_HDRINCL);
2749#endif
2750#ifdef IP_TOS
2751 insint(d, "IP_TOS", IP_TOS);
2752#endif
2753#ifdef IP_TTL
2754 insint(d, "IP_TTL", IP_TTL);
2755#endif
2756#ifdef IP_RECVOPTS
2757 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2758#endif
2759#ifdef IP_RECVRETOPTS
2760 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2761#endif
2762#ifdef IP_RECVDSTADDR
2763 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2764#endif
2765#ifdef IP_RETOPTS
2766 insint(d, "IP_RETOPTS", IP_RETOPTS);
2767#endif
2768#ifdef IP_MULTICAST_IF
2769 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2770#endif
2771#ifdef IP_MULTICAST_TTL
2772 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2773#endif
2774#ifdef IP_MULTICAST_LOOP
2775 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2776#endif
2777#ifdef IP_ADD_MEMBERSHIP
2778 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2779#endif
2780#ifdef IP_DROP_MEMBERSHIP
2781 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2782#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002783#ifdef IP_DEFAULT_MULTICAST_TTL
2784 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
2785#endif
2786#ifdef IP_DEFAULT_MULTICAST_LOOP
2787 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
2788#endif
2789#ifdef IP_MAX_MEMBERSHIPS
2790 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
2791#endif
2792
2793 /* TCP options */
2794#ifdef TCP_NODELAY
2795 insint(d, "TCP_NODELAY", TCP_NODELAY);
2796#endif
2797#ifdef TCP_MAXSEG
2798 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
2799#endif
2800
2801 /* IPX options */
2802#ifdef IPX_TYPE
2803 insint(d, "IPX_TYPE", IPX_TYPE);
2804#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002805
2806 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002807#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002808 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002809#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002810}