blob: e9b3aadfecf87aa5fc139ddfd67930db86ee3ccb [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003/* SSL support based on patches by Brian E Gallew and Laszlo Kovacs */
4
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005/*
6This module provides an interface to Berkeley socket IPC.
7
8Limitations:
9
Guido van Rossum30a685f1991-06-27 15:51:29 +000010- only AF_INET and AF_UNIX address families are supported
Guido van Rossum81194471991-07-27 21:42:02 +000011- no read/write operations (use send/recv or makefile instead)
Guido van Rossumbe32c891996-06-20 16:25:29 +000012- additional restrictions apply on Windows
Guido van Rossum6574b3e1991-06-25 21:36:08 +000013
Guido van Rossum27e177d1995-03-16 15:43:47 +000014Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015
Guido van Rossum27e177d1995-03-16 15:43:47 +000016- socket.error: exception raised for socket specific errors
Guido van Rossum30a685f1991-06-27 15:51:29 +000017- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000018- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000019- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000020- socket.getprotobyname(protocolname) --> protocol number
Guido van Rossum27e177d1995-03-16 15:43:47 +000021- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000022- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum006bf911996-06-12 04:04:55 +000023- socket.ntohs(16 bit value) --> new int object
24- socket.ntohl(32 bit value) --> new int object
25- socket.htons(16 bit value) --> new int object
26- socket.htonl(32 bit value) --> new int object
Guido van Rossum27e177d1995-03-16 15:43:47 +000027- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +000028- socket.inet_aton(IP address) -> 32-bit packed IP representation
29- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum09c8b6c1999-12-07 21:37:17 +000030- socket.ssl(socket, keyfile, certfile) -> new ssl object
Guido van Rossum6574b3e1991-06-25 21:36:08 +000031- an Internet socket address is a pair (hostname, port)
32 where hostname can be anything recognized by gethostbyname()
33 (including the dd.dd.dd.dd notation) and port is in host byte order
34- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000035- a UNIX domain socket address is a string specifying the pathname
Guido van Rossum6574b3e1991-06-25 21:36:08 +000036
Guido van Rossum30a685f1991-06-27 15:51:29 +000037Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000038
Guido van Rossum81194471991-07-27 21:42:02 +000039- s.accept() --> new socket object, sockaddr
Fred Drake728819a2000-07-01 03:40:12 +000040- s.bind(sockaddr) --> None
Guido van Rossum27e177d1995-03-16 15:43:47 +000041- s.close() --> None
Fred Drake728819a2000-07-01 03:40:12 +000042- s.connect(sockaddr) --> None
43- s.connect_ex(sockaddr) --> 0 or errno (handy for e.g. async connect)
Guido van Rossum27e177d1995-03-16 15:43:47 +000044- s.fileno() --> file descriptor
Guido van Rossumbe32c891996-06-20 16:25:29 +000045- s.dup() --> same as socket.fromfd(os.dup(s.fileno(), ...)
Guido van Rossumc89705d1992-11-26 08:54:07 +000046- s.getpeername() --> sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000047- s.getsockname() --> sockaddr
48- s.getsockopt(level, optname[, buflen]) --> int or string
49- s.listen(backlog) --> None
Guido van Rossum6b144911995-03-14 15:05:13 +000050- s.makefile([mode[, bufsize]]) --> file object
Guido van Rossum27e177d1995-03-16 15:43:47 +000051- s.recv(buflen [,flags]) --> string
52- s.recvfrom(buflen [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000053- s.send(string [,flags]) --> nbytes
54- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum27e177d1995-03-16 15:43:47 +000055- s.setblocking(0 | 1) --> None
56- s.setsockopt(level, optname, value) --> None
57- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000058- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000059
Guido van Rossum6574b3e1991-06-25 21:36:08 +000060*/
61
Guido van Rossum73624e91994-10-10 17:59:00 +000062#include "Python.h"
Guido van Rossum3baaa131999-03-22 21:44:51 +000063
Guido van Rossum9376b741999-09-15 22:01:40 +000064/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
65 script doesn't get this right, so we hardcode some platform checks below.
66 On the other hand, not all Linux versions agree, so there the settings
67 computed by the configure script are needed! */
68
69#ifndef linux
Guido van Rossume7de2061999-03-24 17:24:33 +000070#undef HAVE_GETHOSTBYNAME_R_3_ARG
71#undef HAVE_GETHOSTBYNAME_R_5_ARG
72#undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +000073#endif
Guido van Rossume7de2061999-03-24 17:24:33 +000074
Guido van Rossum7a122991999-04-13 04:07:32 +000075#ifndef WITH_THREAD
76#undef HAVE_GETHOSTBYNAME_R
77#endif
78
Guido van Rossume7de2061999-03-24 17:24:33 +000079#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +000080#if defined(_AIX) || defined(__osf__)
Guido van Rossume7de2061999-03-24 17:24:33 +000081#define HAVE_GETHOSTBYNAME_R_3_ARG
82#elif defined(__sun__) || defined(__sgi)
83#define HAVE_GETHOSTBYNAME_R_5_ARG
84#elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +000085/* Rely on the configure script */
Guido van Rossume7de2061999-03-24 17:24:33 +000086#else
87#undef HAVE_GETHOSTBYNAME_R
88#endif
89#endif
90
Guido van Rossum3baaa131999-03-22 21:44:51 +000091#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && !defined(MS_WINDOWS)
92#define USE_GETHOSTBYNAME_LOCK
93#endif
94
95#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum49b56061998-10-01 20:42:43 +000096#include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +000097#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +000098
Guido van Rossuma376cc51996-12-05 23:43:35 +000099#ifdef HAVE_UNISTD_H
100#include <unistd.h>
101#endif
102
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000103#if defined(PYCC_VACPP)
104#include <types.h>
105#include <io.h>
106#include <sys/ioctl.h>
107#include <utils.h>
108#include <ctype.h>
109#endif
110
111#if defined(PYOS_OS2)
112#define INCL_DOS
113#define INCL_DOSERRORS
114#define INCL_NOPMAPI
115#include <os2.h>
116#endif
117
Guido van Rossumb6775db1994-08-01 11:34:53 +0000118#include <sys/types.h>
Guido van Rossumed233a51992-06-23 09:07:03 +0000119
Guido van Rossum81194471991-07-27 21:42:02 +0000120#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000121#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000122#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000123#include <sys/socket.h>
124#include <netinet/in.h>
Fred Drake51d90362000-10-06 15:37:06 +0000125#if !(defined(__BEOS__) || defined(__CYGWIN__))
Andrew M. Kuchling52a644c2000-03-31 17:24:30 +0000126#include <netinet/tcp.h>
Fred Drake11b09362000-05-16 13:30:12 +0000127#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000128
Guido van Rossum9376b741999-09-15 22:01:40 +0000129/* Headers needed for inet_ntoa() and inet_addr() */
130#ifdef __BEOS__
131#include <net/netdb.h>
132#else
Guido van Rossumff3ab422000-04-24 15:16:03 +0000133#ifndef USE_GUSI1
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000134#include <arpa/inet.h>
Guido van Rossum9376b741999-09-15 22:01:40 +0000135#endif
Guido van Rossum1b6e4631999-11-04 18:22:29 +0000136#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000137
Guido van Rossume4485b01994-09-07 14:32:49 +0000138#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000139#else
140#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000141#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000142#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000143#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000144#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000145#else
146#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000147#endif
148
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000149#ifndef O_NDELAY
150#define O_NDELAY O_NONBLOCK /* For QNX only? */
151#endif
152
Guido van Rossumff3ab422000-04-24 15:16:03 +0000153#ifdef USE_GUSI1
Jack Jansen508537b1996-02-14 15:57:45 +0000154/* fdopen() isn't declared in stdio.h (sigh) */
155#include <GUSI.h>
156#endif
157
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000158#ifdef USE_SSL
159#include "rsa.h"
160#include "crypto.h"
161#include "x509.h"
162#include "pem.h"
163#include "ssl.h"
164#include "err.h"
165#endif /* USE_SSL */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000166
Guido van Rossumbcc20741998-08-04 22:53:56 +0000167#if defined(MS_WINDOWS) || defined(__BEOS__)
168/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000169/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000170#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000171#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000172#endif
173
Fred Drakea04eaad2000-06-30 02:46:07 +0000174/* abstract the socket file descriptor type */
175#ifdef MS_WINDOWS
176typedef SOCKET SOCKET_T;
177# ifdef MS_WIN64
178# define SIZEOF_SOCKET_T 8
179# else
180# define SIZEOF_SOCKET_T 4
181# endif
182#else
183typedef int SOCKET_T;
184# define SIZEOF_SOCKET_T SIZEOF_INT
185#endif
186
187
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000188#if defined(PYOS_OS2)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000189#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000190#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000191#endif
192
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000193#ifndef SOCKETCLOSE
194#define SOCKETCLOSE close
195#endif
196
Guido van Rossum30a685f1991-06-27 15:51:29 +0000197/* Global variable holding the exception type for errors detected
198 by this module (but not argument type or memory errors, etc.). */
199
Guido van Rossum73624e91994-10-10 17:59:00 +0000200static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000201
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000202#ifdef USE_SSL
203static PyObject *SSLErrorObject;
204#endif /* USE_SSL */
205
Guido van Rossum30a685f1991-06-27 15:51:29 +0000206
207/* Convenience function to raise an error according to errno
208 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000209
Guido van Rossum73624e91994-10-10 17:59:00 +0000210static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000211PySocket_Err(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000212{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000213#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000214 int err_no = WSAGetLastError();
215 if (err_no) {
216 static struct { int no; const char *msg; } *msgp, msgs[] = {
217 { WSAEINTR, "Interrupted system call" },
218 { WSAEBADF, "Bad file descriptor" },
219 { WSAEACCES, "Permission denied" },
220 { WSAEFAULT, "Bad address" },
221 { WSAEINVAL, "Invalid argument" },
222 { WSAEMFILE, "Too many open files" },
223 { WSAEWOULDBLOCK,
224 "The socket operation could not complete "
225 "without blocking" },
226 { WSAEINPROGRESS, "Operation now in progress" },
227 { WSAEALREADY, "Operation already in progress" },
228 { WSAENOTSOCK, "Socket operation on non-socket" },
229 { WSAEDESTADDRREQ, "Destination address required" },
230 { WSAEMSGSIZE, "Message too long" },
231 { WSAEPROTOTYPE, "Protocol wrong type for socket" },
232 { WSAENOPROTOOPT, "Protocol not available" },
233 { WSAEPROTONOSUPPORT, "Protocol not supported" },
234 { WSAESOCKTNOSUPPORT, "Socket type not supported" },
235 { WSAEOPNOTSUPP, "Operation not supported" },
236 { WSAEPFNOSUPPORT, "Protocol family not supported" },
237 { WSAEAFNOSUPPORT, "Address family not supported" },
238 { WSAEADDRINUSE, "Address already in use" },
239 { WSAEADDRNOTAVAIL,
240 "Can't assign requested address" },
241 { WSAENETDOWN, "Network is down" },
242 { WSAENETUNREACH, "Network is unreachable" },
243 { WSAENETRESET,
244 "Network dropped connection on reset" },
245 { WSAECONNABORTED,
246 "Software caused connection abort" },
247 { WSAECONNRESET, "Connection reset by peer" },
248 { WSAENOBUFS, "No buffer space available" },
249 { WSAEISCONN, "Socket is already connected" },
250 { WSAENOTCONN, "Socket is not connected" },
251 { WSAESHUTDOWN, "Can't send after socket shutdown" },
252 { WSAETOOMANYREFS,
253 "Too many references: can't splice" },
254 { WSAETIMEDOUT, "Operation timed out" },
255 { WSAECONNREFUSED, "Connection refused" },
256 { WSAELOOP, "Too many levels of symbolic links" },
257 { WSAENAMETOOLONG, "File name too long" },
258 { WSAEHOSTDOWN, "Host is down" },
259 { WSAEHOSTUNREACH, "No route to host" },
260 { WSAENOTEMPTY, "Directory not empty" },
261 { WSAEPROCLIM, "Too many processes" },
262 { WSAEUSERS, "Too many users" },
263 { WSAEDQUOT, "Disc quota exceeded" },
264 { WSAESTALE, "Stale NFS file handle" },
265 { WSAEREMOTE, "Too many levels of remote in path" },
266 { WSASYSNOTREADY,
267 "Network subsystem is unvailable" },
268 { WSAVERNOTSUPPORTED,
269 "WinSock version is not supported" },
270 { WSANOTINITIALISED,
271 "Successful WSAStartup() not yet performed" },
272 { WSAEDISCON, "Graceful shutdown in progress" },
273 /* Resolver errors */
274 { WSAHOST_NOT_FOUND, "No such host is known" },
275 { WSATRY_AGAIN, "Host not found, or server failed" },
276 { WSANO_RECOVERY,
277 "Unexpected server error encountered" },
278 { WSANO_DATA, "Valid name without requested data" },
279 { WSANO_ADDRESS, "No address, look for MX record" },
280 { 0, NULL }
281 };
Guido van Rossum73624e91994-10-10 17:59:00 +0000282 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000283 const char *msg = "winsock error";
284
285 for (msgp = msgs; msgp->msg; msgp++) {
286 if (err_no == msgp->no) {
287 msg = msgp->msg;
288 break;
289 }
290 }
291
292 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000293 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000294 PyErr_SetObject(PySocket_Error, v);
295 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000296 }
297 return NULL;
298 }
299 else
300#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000301
302#if defined(PYOS_OS2)
303 if (sock_errno() != NO_ERROR) {
304 APIRET rc;
305 ULONG msglen;
306 char outbuf[100];
307 int myerrorcode = sock_errno();
308
309 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
310 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
311 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
312 if (rc == NO_ERROR) {
313 PyObject *v;
314
315 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
316 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
317 char *lastc = &outbuf[ strlen(outbuf)-1 ];
318 while (lastc > outbuf && isspace(*lastc))
319 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
320 }
321 v = Py_BuildValue("(is)", myerrorcode, outbuf);
322 if (v != NULL) {
323 PyErr_SetObject(PySocket_Error, v);
324 Py_DECREF(v);
325 }
326 return NULL;
327 }
328 }
329#endif
330
Guido van Rossum73624e91994-10-10 17:59:00 +0000331 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000332}
333
Guido van Rossum30a685f1991-06-27 15:51:29 +0000334
335/* The object holding a socket. It holds some extra information,
336 like the address family, which is used to decode socket address
337 arguments properly. */
338
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000339typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000340 PyObject_HEAD
Fred Drakea04eaad2000-06-30 02:46:07 +0000341 SOCKET_T sock_fd; /* Socket file descriptor */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000342 int sock_family; /* Address family, e.g., AF_INET */
343 int sock_type; /* Socket type, e.g., SOCK_STREAM */
344 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000345 union sock_addr {
346 struct sockaddr_in in;
347#ifdef AF_UNIX
348 struct sockaddr_un un;
349#endif
350 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000351} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000352
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000353#ifdef USE_SSL
Guido van Rossum30a685f1991-06-27 15:51:29 +0000354
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000355typedef struct {
356 PyObject_HEAD
357 PySocketSockObject *Socket; /* Socket on which we're layered */
358 PyObject *x_attr; /* Attributes dictionary */
359 SSL_CTX* ctx;
360 SSL* ssl;
361 X509* server_cert;
362 BIO* sbio;
363 char server[256];
364 char issuer[256];
365
366} SSLObject;
367
368staticforward PyTypeObject SSL_Type;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000369staticforward PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args);
370staticforward PyObject *SSL_SSLread(SSLObject *self, PyObject *args);
371
372#define SSLObject_Check(v) ((v)->ob_type == &SSL_Type)
373
374#endif /* USE_SSL */
375
Guido van Rossum30a685f1991-06-27 15:51:29 +0000376/* A forward reference to the Socktype type object.
377 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000378 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000379 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000380
Guido van Rossum73624e91994-10-10 17:59:00 +0000381staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000382
Guido van Rossum30a685f1991-06-27 15:51:29 +0000383
384/* Create a new socket object.
385 This just creates the object and initializes it.
386 If the creation fails, return NULL and set an exception (implicit
387 in NEWOBJ()). */
388
Guido van Rossum73624e91994-10-10 17:59:00 +0000389static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000390PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000391{
Guido van Rossum73624e91994-10-10 17:59:00 +0000392 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000393 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000394 s = PyObject_New(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000395 if (s != NULL) {
396 s->sock_fd = fd;
397 s->sock_family = family;
398 s->sock_type = type;
399 s->sock_proto = proto;
400 }
401 return s;
402}
403
Guido van Rossum30a685f1991-06-27 15:51:29 +0000404
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000405/* Lock to allow python interpreter to continue, but only allow one
406 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000407#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000408PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000409#endif
410
411
Guido van Rossum30a685f1991-06-27 15:51:29 +0000412/* Convert a string specifying a host name or one of a few symbolic
413 names to a numeric IP address. This usually calls gethostbyname()
414 to do the work; the names "" and "<broadcast>" are special.
415 Return the length (should always be 4 bytes), or negative if
416 an error occurred; then an exception is raised. */
417
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000418static int
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000419setipaddr(char* name, struct sockaddr_in * addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000420{
421 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000422 int d1, d2, d3, d4;
Guido van Rossum955becc1999-03-22 20:14:53 +0000423 int h_length;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000424 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000425#ifdef HAVE_GETHOSTBYNAME_R
426 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000427#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
428 struct hostent_data data;
429#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000430 char buf[1001];
431 int buf_len = (sizeof buf) - 1;
432 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000433#endif
434#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000435 int result;
436#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000437#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000438
Guido van Rossuma376cc51996-12-05 23:43:35 +0000439 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000440 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000441 addr_ret->sin_addr.s_addr = INADDR_ANY;
442 return 4;
443 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000444 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000445 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
446 return 4;
447 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000448 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
449 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
450 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
451 addr_ret->sin_addr.s_addr = htonl(
452 ((long) d1 << 24) | ((long) d2 << 16) |
453 ((long) d3 << 8) | ((long) d4 << 0));
454 return 4;
455 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000456 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000457#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000458#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000459 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &hp, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000460#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000461 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000462#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +0000463 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000464 result = gethostbyname_r(name, &hp_allocated, &data);
465 hp = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000466#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000467#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000468#ifdef USE_GETHOSTBYNAME_LOCK
469 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000470#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000471 hp = gethostbyname(name);
472#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000473 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000474
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000475 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000476#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000477 /* Let's get real error message to return */
478 extern int h_errno;
479 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
480#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000481 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000482#endif
Guido van Rossum3baaa131999-03-22 21:44:51 +0000483#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000484 PyThread_release_lock(gethostbyname_lock);
485#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000486 return -1;
487 }
488 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
Guido van Rossum955becc1999-03-22 20:14:53 +0000489 h_length = hp->h_length;
Guido van Rossum3baaa131999-03-22 21:44:51 +0000490#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000491 PyThread_release_lock(gethostbyname_lock);
492#endif
493 return h_length;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000494}
495
Guido van Rossum30a685f1991-06-27 15:51:29 +0000496
Guido van Rossum30a685f1991-06-27 15:51:29 +0000497/* Create a string object representing an IP address.
498 This is always a string of the form 'dd.dd.dd.dd' (with variable
499 size numbers). */
500
Guido van Rossum73624e91994-10-10 17:59:00 +0000501static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000502makeipaddr(struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000503{
504 long x = ntohl(addr->sin_addr.s_addr);
505 char buf[100];
506 sprintf(buf, "%d.%d.%d.%d",
507 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
508 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000509 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000510}
511
512
513/* Create an object representing the given socket address,
514 suitable for passing it back to bind(), connect() etc.
515 The family field of the sockaddr structure is inspected
516 to determine what kind of address it really is. */
517
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000518/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000519static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000520makesockaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000521{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000522 if (addrlen == 0) {
523 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000524 Py_INCREF(Py_None);
525 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000526 }
527
Guido van Rossumbcc20741998-08-04 22:53:56 +0000528#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000529 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000530 addr->sa_family = AF_INET;
531#endif
532
Guido van Rossum30a685f1991-06-27 15:51:29 +0000533 switch (addr->sa_family) {
534
535 case AF_INET:
536 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000537 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000538 PyObject *addrobj = makeipaddr(a);
539 PyObject *ret = NULL;
540 if (addrobj) {
541 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
542 Py_DECREF(addrobj);
543 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000544 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000545 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000546
Guido van Rossumb6775db1994-08-01 11:34:53 +0000547#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000548 case AF_UNIX:
549 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000550 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000551 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000552 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000553#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000554
555 /* More cases here... */
556
557 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000558 /* If we don't know the address family, don't raise an
559 exception -- return it as a tuple. */
560 return Py_BuildValue("is#",
561 addr->sa_family,
562 addr->sa_data,
563 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000564
Guido van Rossum30a685f1991-06-27 15:51:29 +0000565 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000566}
567
Guido van Rossum30a685f1991-06-27 15:51:29 +0000568
569/* Parse a socket address argument according to the socket object's
570 address family. Return 1 if the address was in the proper format,
571 0 of not. The address is returned through addr_ret, its length
572 through len_ret. */
573
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000574static int
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000575getsockaddrarg(PySocketSockObject *s, PyObject *args, struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000576{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000577 switch (s->sock_family) {
578
Guido van Rossumb6775db1994-08-01 11:34:53 +0000579#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000580 case AF_UNIX:
581 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000582 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000583 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000584 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000585 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000586 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000587 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000588 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000589 PyErr_SetString(PySocket_Error,
590 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000591 return 0;
592 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000593 addr->sun_family = AF_UNIX;
594 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000595 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000596 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000597 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000598 return 1;
599 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000600#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000601
Guido van Rossum30a685f1991-06-27 15:51:29 +0000602 case AF_INET:
603 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000604 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000605 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000606 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000607 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000608 if (!PyTuple_Check(args)) {
609 PyErr_Format(PyExc_TypeError,
610 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
611 args->ob_type->tp_name);
612 return 0;
613 }
614 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000615 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000616 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000617 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000618 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000619 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000620 *addr_ret = (struct sockaddr *) addr;
621 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000622 return 1;
623 }
624
Guido van Rossum30a685f1991-06-27 15:51:29 +0000625 /* More cases here... */
626
627 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000628 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000629 return 0;
630
631 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000632}
633
Guido van Rossum30a685f1991-06-27 15:51:29 +0000634
Guido van Rossum710e1df1992-06-12 10:39:36 +0000635/* Get the address length according to the socket object's address family.
636 Return 1 if the family is known, 0 otherwise. The length is returned
637 through len_ret. */
638
639static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000640getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000641{
642 switch (s->sock_family) {
643
Guido van Rossumb6775db1994-08-01 11:34:53 +0000644#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000645 case AF_UNIX:
646 {
647 *len_ret = sizeof (struct sockaddr_un);
648 return 1;
649 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000650#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000651
652 case AF_INET:
653 {
654 *len_ret = sizeof (struct sockaddr_in);
655 return 1;
656 }
657
658 /* More cases here... */
659
660 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000661 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000662 return 0;
663
664 }
665}
666
667
Guido van Rossum30a685f1991-06-27 15:51:29 +0000668/* s.accept() method */
669
Guido van Rossum73624e91994-10-10 17:59:00 +0000670static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000671PySocketSock_accept(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000672{
673 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000674 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000675 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000676 PyObject *sock = NULL;
677 PyObject *addr = NULL;
678 PyObject *res = NULL;
679
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000680 if (!PyArg_ParseTuple(args, ":accept"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000681 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000682 if (!getsockaddrlen(s, &addrlen))
683 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000684 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000685 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000686 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000687#ifdef MS_WINDOWS
688 if (newfd == INVALID_SOCKET)
689#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000690 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000691#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000692 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000693
Guido van Rossum30a685f1991-06-27 15:51:29 +0000694 /* Create the new object with unspecified family,
695 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000696 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000697 s->sock_family,
698 s->sock_type,
699 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000700 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000701 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000702 goto finally;
703 }
704 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
705 goto finally;
706
707 if (!(res = Py_BuildValue("OO", sock, addr)))
708 goto finally;
709
710 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000711 Py_XDECREF(sock);
712 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000713 return res;
714}
715
Guido van Rossum82a5c661998-07-07 20:45:43 +0000716static char accept_doc[] =
717"accept() -> (socket object, address info)\n\
718\n\
719Wait for an incoming connection. Return a new socket representing the\n\
720connection, and the address of the client. For IP sockets, the address\n\
721info is a pair (hostaddr, port).";
722
Guido van Rossum30a685f1991-06-27 15:51:29 +0000723
Guido van Rossume4485b01994-09-07 14:32:49 +0000724/* s.setblocking(1 | 0) method */
725
Guido van Rossum73624e91994-10-10 17:59:00 +0000726static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000727PySocketSock_setblocking(PySocketSockObject *s, PyObject *args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000728{
729 int block;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000730#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000731 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000732#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000733 if (!PyArg_ParseTuple(args, "i:setblocking", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000734 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000735 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000736#ifdef __BEOS__
737 block = !block;
738 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
739 (void *)(&block), sizeof( int ) );
740#else
Guido van Rossum6f489d91996-06-28 20:15:15 +0000741#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000742#ifdef PYOS_OS2
743 block = !block;
744 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
745#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000746 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
747 if (block)
748 delay_flag &= (~O_NDELAY);
749 else
750 delay_flag |= O_NDELAY;
751 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000752#endif /* !PYOS_OS2 */
753#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000754 block = !block;
755 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000756#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000757#endif /* __BEOS__ */
Guido van Rossum73624e91994-10-10 17:59:00 +0000758 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000759
Guido van Rossum73624e91994-10-10 17:59:00 +0000760 Py_INCREF(Py_None);
761 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000762}
Guido van Rossume4485b01994-09-07 14:32:49 +0000763
Guido van Rossum82a5c661998-07-07 20:45:43 +0000764static char setblocking_doc[] =
765"setblocking(flag)\n\
766\n\
767Set the socket to blocking (flag is true) or non-blocking (false).\n\
768This uses the FIONBIO ioctl with the O_NDELAY flag.";
769
Guido van Rossume4485b01994-09-07 14:32:49 +0000770
Guido van Rossumaee08791992-09-08 09:05:33 +0000771/* s.setsockopt() method.
772 With an integer third argument, sets an integer option.
773 With a string third argument, sets an option from a buffer;
774 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000775
Guido van Rossum73624e91994-10-10 17:59:00 +0000776static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000777PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000778{
779 int level;
780 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000781 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000782 char *buf;
783 int buflen;
784 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000785
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000786 if (PyArg_ParseTuple(args, "iii:setsockopt",
787 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000788 buf = (char *) &flag;
789 buflen = sizeof flag;
790 }
791 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000792 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000793 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
794 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000795 return NULL;
796 }
Thomas Wouters334fb892000-07-25 12:56:38 +0000797 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000798 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000799 return PySocket_Err();
800 Py_INCREF(Py_None);
801 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000802}
803
Guido van Rossum82a5c661998-07-07 20:45:43 +0000804static char setsockopt_doc[] =
805"setsockopt(level, option, value)\n\
806\n\
807Set a socket option. See the Unix manual for level and option.\n\
808The value argument can either be an integer or a string.";
809
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000810
Guido van Rossumaee08791992-09-08 09:05:33 +0000811/* s.getsockopt() method.
812 With two arguments, retrieves an integer option.
813 With a third integer argument, retrieves a string buffer of that size;
814 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000815
Guido van Rossum73624e91994-10-10 17:59:00 +0000816static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000817PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000818{
819 int level;
820 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000821 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000822 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000823 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000824
Guido van Rossumbcc20741998-08-04 22:53:56 +0000825#ifdef __BEOS__
826/* We have incomplete socket support. */
827 PyErr_SetString( PySocket_Error, "getsockopt not supported" );
828 return NULL;
829#else
830
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000831 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
832 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +0000833 return NULL;
834
835 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000836 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000837 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000838 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +0000839 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000840 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000841 return PySocket_Err();
842 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000843 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000844 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000845 PyErr_SetString(PySocket_Error,
846 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000847 return NULL;
848 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000849 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000850 if (buf == NULL)
851 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000852 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +0000853 (void *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000854 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000855 Py_DECREF(buf);
856 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000857 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000858 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000859 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000860#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000861}
862
Guido van Rossum82a5c661998-07-07 20:45:43 +0000863static char getsockopt_doc[] =
864"getsockopt(level, option[, buffersize]) -> value\n\
865\n\
866Get a socket option. See the Unix manual for level and option.\n\
867If a nonzero buffersize argument is given, the return value is a\n\
868string of that length; otherwise it is an integer.";
869
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000870
Fred Drake728819a2000-07-01 03:40:12 +0000871/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000872
Guido van Rossum73624e91994-10-10 17:59:00 +0000873static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000874PySocketSock_bind(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000875{
876 struct sockaddr *addr;
877 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000878 int res;
Fred Drake728819a2000-07-01 03:40:12 +0000879 PyObject *addro;
880 if (!PyArg_ParseTuple(args, "O:bind", &addro))
881 return NULL;
882 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000883 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000884 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000885 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000886 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000887 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000888 return PySocket_Err();
889 Py_INCREF(Py_None);
890 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000891}
892
Guido van Rossum82a5c661998-07-07 20:45:43 +0000893static char bind_doc[] =
894"bind(address)\n\
895\n\
896Bind the socket to a local address. For IP sockets, the address is a\n\
897pair (host, port); the host must refer to the local host.";
898
Guido van Rossum30a685f1991-06-27 15:51:29 +0000899
900/* s.close() method.
901 Set the file descriptor to -1 so operations tried subsequently
902 will surely fail. */
903
Guido van Rossum73624e91994-10-10 17:59:00 +0000904static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000905PySocketSock_close(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000906{
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000907 if (!PyArg_ParseTuple(args, ":close"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000908 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000909 if (s->sock_fd != -1) {
910 Py_BEGIN_ALLOW_THREADS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000911 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum08481461996-10-12 14:07:22 +0000912 Py_END_ALLOW_THREADS
913 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000914 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000915 Py_INCREF(Py_None);
916 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000917}
918
Guido van Rossum82a5c661998-07-07 20:45:43 +0000919static char close_doc[] =
920"close()\n\
921\n\
922Close the socket. It cannot be used after this call.";
923
Guido van Rossum30a685f1991-06-27 15:51:29 +0000924
Fred Drake728819a2000-07-01 03:40:12 +0000925/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000926
Guido van Rossum73624e91994-10-10 17:59:00 +0000927static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000928PySocketSock_connect(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000929{
930 struct sockaddr *addr;
931 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000932 int res;
Fred Drake728819a2000-07-01 03:40:12 +0000933 PyObject *addro;
934 if (!PyArg_ParseTuple(args, "O:connect", &addro))
935 return NULL;
936 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000937 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000938 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000939 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000940 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000941 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000942 return PySocket_Err();
943 Py_INCREF(Py_None);
944 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000945}
946
Guido van Rossum82a5c661998-07-07 20:45:43 +0000947static char connect_doc[] =
948"connect(address)\n\
949\n\
950Connect the socket to a remote address. For IP sockets, the address\n\
951is a pair (host, port).";
952
Guido van Rossum30a685f1991-06-27 15:51:29 +0000953
Fred Drake728819a2000-07-01 03:40:12 +0000954/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000955
956static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000957PySocketSock_connect_ex(PySocketSockObject *s, PyObject *args)
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000958{
959 struct sockaddr *addr;
960 int addrlen;
961 int res;
Fred Drake728819a2000-07-01 03:40:12 +0000962 PyObject *addro;
963 if (!PyArg_ParseTuple(args, "O:connect_ex", &addro))
964 return NULL;
965 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000966 return NULL;
967 Py_BEGIN_ALLOW_THREADS
968 res = connect(s->sock_fd, addr, addrlen);
969 Py_END_ALLOW_THREADS
970 if (res != 0)
971 res = errno;
972 return PyInt_FromLong((long) res);
973}
974
Guido van Rossum82a5c661998-07-07 20:45:43 +0000975static char connect_ex_doc[] =
976"connect_ex(address)\n\
977\n\
978This is like connect(address), but returns an error code (the errno value)\n\
979instead of raising an exception when an error occurs.";
980
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000981
Guido van Rossumed233a51992-06-23 09:07:03 +0000982/* s.fileno() method */
983
Guido van Rossum73624e91994-10-10 17:59:00 +0000984static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000985PySocketSock_fileno(PySocketSockObject *s, PyObject *args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000986{
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000987 if (!PyArg_ParseTuple(args, ":fileno"))
Guido van Rossumed233a51992-06-23 09:07:03 +0000988 return NULL;
Fred Drakea04eaad2000-06-30 02:46:07 +0000989#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +0000990 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +0000991#else
992 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
993#endif
Guido van Rossumed233a51992-06-23 09:07:03 +0000994}
995
Guido van Rossum82a5c661998-07-07 20:45:43 +0000996static char fileno_doc[] =
997"fileno() -> integer\n\
998\n\
999Return the integer file descriptor of the socket.";
1000
Guido van Rossumed233a51992-06-23 09:07:03 +00001001
Guido van Rossumbe32c891996-06-20 16:25:29 +00001002#ifndef NO_DUP
1003/* s.dup() method */
1004
1005static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001006PySocketSock_dup(PySocketSockObject *s, PyObject *args)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001007{
Fred Drakea04eaad2000-06-30 02:46:07 +00001008 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001009 PyObject *sock;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001010 if (!PyArg_ParseTuple(args, ":dup"))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001011 return NULL;
1012 newfd = dup(s->sock_fd);
1013 if (newfd < 0)
1014 return PySocket_Err();
1015 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001016 s->sock_family,
1017 s->sock_type,
1018 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001019 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001020 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001021 return sock;
1022}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001023
1024static char dup_doc[] =
1025"dup() -> socket object\n\
1026\n\
1027Return a new socket object connected to the same system resource.";
1028
Guido van Rossumbe32c891996-06-20 16:25:29 +00001029#endif
1030
1031
Guido van Rossumc89705d1992-11-26 08:54:07 +00001032/* s.getsockname() method */
1033
Guido van Rossum73624e91994-10-10 17:59:00 +00001034static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001035PySocketSock_getsockname(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001036{
1037 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001038 int res;
1039 socklen_t addrlen;
1040
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001041 if (!PyArg_ParseTuple(args, ":getsockname"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001042 return NULL;
1043 if (!getsockaddrlen(s, &addrlen))
1044 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001045 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001046 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001047 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001048 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001049 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001050 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001051 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1052}
1053
Guido van Rossum82a5c661998-07-07 20:45:43 +00001054static char getsockname_doc[] =
1055"getsockname() -> address info\n\
1056\n\
1057Return the address of the local endpoint. For IP sockets, the address\n\
1058info is a pair (hostaddr, port).";
1059
Guido van Rossumc89705d1992-11-26 08:54:07 +00001060
Guido van Rossumb6775db1994-08-01 11:34:53 +00001061#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001062/* s.getpeername() method */
1063
Guido van Rossum73624e91994-10-10 17:59:00 +00001064static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001065PySocketSock_getpeername(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001066{
1067 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001068 int res;
1069 socklen_t addrlen;
1070
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001071 if (!PyArg_ParseTuple(args, ":getpeername"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001072 return NULL;
1073 if (!getsockaddrlen(s, &addrlen))
1074 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001075 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001076 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001077 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001078 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001079 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001080 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1081}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001082
1083static char getpeername_doc[] =
1084"getpeername() -> address info\n\
1085\n\
1086Return the address of the remote endpoint. For IP sockets, the address\n\
1087info is a pair (hostaddr, port).";
1088
Guido van Rossumb6775db1994-08-01 11:34:53 +00001089#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001090
1091
Guido van Rossum30a685f1991-06-27 15:51:29 +00001092/* s.listen(n) method */
1093
Guido van Rossum73624e91994-10-10 17:59:00 +00001094static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001095PySocketSock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001096{
1097 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001098 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001099 if (!PyArg_ParseTuple(args, "i:listen", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001100 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001101 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001102 if (backlog < 1)
1103 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001104 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001105 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001106 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001107 return PySocket_Err();
1108 Py_INCREF(Py_None);
1109 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001110}
1111
Guido van Rossum82a5c661998-07-07 20:45:43 +00001112static char listen_doc[] =
1113"listen(backlog)\n\
1114\n\
1115Enable a server to accept connections. The backlog argument must be at\n\
1116least 1; it specifies the number of unaccepted connection that the system\n\
1117will allow before refusing new connections.";
1118
1119
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001120#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001121/* s.makefile(mode) method.
1122 Create a new open file object referring to a dupped version of
1123 the socket's file descriptor. (The dup() call is necessary so
1124 that the open file and socket objects may be closed independent
1125 of each other.)
1126 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1127
Guido van Rossum73624e91994-10-10 17:59:00 +00001128static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001129PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001130{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001131 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001132 char *mode = "r";
1133 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001134#ifdef MS_WIN32
1135 intptr_t fd;
1136#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001137 int fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001138#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001139 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001140 PyObject *f;
1141
Guido van Rossum43713e52000-02-29 13:59:29 +00001142 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001143 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001144#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001145 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1146 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001147#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001148 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001149#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001150 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001151 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001152 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001153 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001154 }
1155 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1156 if (f != NULL)
1157 PyFile_SetBufSize(f, bufsize);
1158 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001159}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001160
1161static char makefile_doc[] =
1162"makefile([mode[, buffersize]]) -> file object\n\
1163\n\
1164Return a regular file object corresponding to the socket.\n\
1165The mode and buffersize arguments are as for the built-in open() function.";
1166
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001167#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001168
Guido van Rossum82a5c661998-07-07 20:45:43 +00001169
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001170/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001171
Guido van Rossum73624e91994-10-10 17:59:00 +00001172static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001173PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001174{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001175 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001176 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001177 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001178 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001179 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001180 if (buf == NULL)
1181 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001182 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001183 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001184 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001185 if (n < 0) {
1186 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001187 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001188 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001189 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001190 return NULL;
1191 return buf;
1192}
1193
Guido van Rossum82a5c661998-07-07 20:45:43 +00001194static char recv_doc[] =
1195"recv(buffersize[, flags]) -> data\n\
1196\n\
1197Receive up to buffersize bytes from the socket. For the optional flags\n\
1198argument, see the Unix manual. When no data is available, block until\n\
1199at least one byte is available or until the remote end is closed. When\n\
1200the remote end is closed and all data is read, return the empty string.";
1201
Guido van Rossum30a685f1991-06-27 15:51:29 +00001202
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001203/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001204
Guido van Rossum73624e91994-10-10 17:59:00 +00001205static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001206PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001207{
1208 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001209 PyObject *buf = NULL;
1210 PyObject *addr = NULL;
1211 PyObject *ret = NULL;
1212
Guido van Rossumff3ab422000-04-24 15:16:03 +00001213 int len, n, flags = 0;
1214 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001215 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001216 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001217 if (!getsockaddrlen(s, &addrlen))
1218 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001219 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001220 if (buf == NULL)
1221 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001222 Py_BEGIN_ALLOW_THREADS
1223 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001224#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001225#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001226 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001227#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001228 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001229#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001230#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001231 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001232#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001233 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001234 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001235 if (n < 0) {
1236 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001237 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001238 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001239 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001240 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00001241
1242 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
1243 goto finally;
1244
Guido van Rossum73624e91994-10-10 17:59:00 +00001245 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001246 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001247 Py_XDECREF(addr);
1248 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001249 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001250}
1251
Guido van Rossum82a5c661998-07-07 20:45:43 +00001252static char recvfrom_doc[] =
1253"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1254\n\
1255Like recv(buffersize, flags) but also return the sender's address info.";
1256
Guido van Rossum30a685f1991-06-27 15:51:29 +00001257
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001258/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001259
Guido van Rossum73624e91994-10-10 17:59:00 +00001260static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001261PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001262{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001263 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001264 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001265 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001266 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001267 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001268 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001269 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001270 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001271 return PySocket_Err();
1272 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001273}
1274
Guido van Rossum82a5c661998-07-07 20:45:43 +00001275static char send_doc[] =
1276"send(data[, flags])\n\
1277\n\
1278Send a data string to the socket. For the optional flags\n\
1279argument, see the Unix manual.";
1280
Guido van Rossum30a685f1991-06-27 15:51:29 +00001281
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001282/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001283
Guido van Rossum73624e91994-10-10 17:59:00 +00001284static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001285PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001286{
Guido van Rossum73624e91994-10-10 17:59:00 +00001287 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001288 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001289 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001290 int addrlen, len, n, flags;
1291 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001292 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001293 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001294 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1295 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001296 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001297 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001298 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001299 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001300 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001301 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001302 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001303 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001304 return PySocket_Err();
1305 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001306}
1307
Guido van Rossum82a5c661998-07-07 20:45:43 +00001308static char sendto_doc[] =
1309"sendto(data[, flags], address)\n\
1310\n\
1311Like send(data, flags) but allows specifying the destination address.\n\
1312For IP sockets, the address is a pair (hostaddr, port).";
1313
Guido van Rossum30a685f1991-06-27 15:51:29 +00001314
1315/* s.shutdown(how) method */
1316
Guido van Rossum73624e91994-10-10 17:59:00 +00001317static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001318PySocketSock_shutdown(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001319{
1320 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001321 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001322 if (!PyArg_ParseTuple(args, "i:shutdown", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001323 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001324 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001325 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001326 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001327 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001328 return PySocket_Err();
1329 Py_INCREF(Py_None);
1330 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001331}
1332
Guido van Rossum82a5c661998-07-07 20:45:43 +00001333static char shutdown_doc[] =
1334"shutdown(flag)\n\
1335\n\
1336Shut down the reading side of the socket (flag == 0), the writing side\n\
1337of the socket (flag == 1), or both ends (flag == 2).";
1338
Guido van Rossum30a685f1991-06-27 15:51:29 +00001339
1340/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001341
Guido van Rossum73624e91994-10-10 17:59:00 +00001342static PyMethodDef PySocketSock_methods[] = {
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001343 {"accept", (PyCFunction)PySocketSock_accept, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001344 accept_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001345 {"bind", (PyCFunction)PySocketSock_bind, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001346 bind_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001347 {"close", (PyCFunction)PySocketSock_close, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001348 close_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001349 {"connect", (PyCFunction)PySocketSock_connect, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001350 connect_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001351 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001352 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001353#ifndef NO_DUP
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001354 {"dup", (PyCFunction)PySocketSock_dup, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001355 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001356#endif
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001357 {"fileno", (PyCFunction)PySocketSock_fileno, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001358 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001359#ifdef HAVE_GETPEERNAME
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001360 {"getpeername", (PyCFunction)PySocketSock_getpeername, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001361 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001362#endif
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001363 {"getsockname", (PyCFunction)PySocketSock_getsockname, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001364 getsockname_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001365 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001366 getsockopt_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001367 {"listen", (PyCFunction)PySocketSock_listen, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001368 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001369#ifndef NO_DUP
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001370 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001371 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001372#endif
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001373 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001374 recv_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001375 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001376 recvfrom_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001377 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001378 send_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001379 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001380 sendto_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001381 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001382 setblocking_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001383 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001384 setsockopt_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001385 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001386 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001387 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001388};
1389
Guido van Rossum30a685f1991-06-27 15:51:29 +00001390
Guido van Rossum73624e91994-10-10 17:59:00 +00001391/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001392 First close the file description. */
1393
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001394static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001395PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001396{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001397 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001398 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001399 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001400}
1401
Guido van Rossum30a685f1991-06-27 15:51:29 +00001402
1403/* Return a socket object's named attribute. */
1404
Guido van Rossum73624e91994-10-10 17:59:00 +00001405static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001406PySocketSock_getattr(PySocketSockObject *s, char *name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001407{
Guido van Rossum73624e91994-10-10 17:59:00 +00001408 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001409}
1410
Guido van Rossum30a685f1991-06-27 15:51:29 +00001411
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001412static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001413PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001414{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001415 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001416#if SIZEOF_SOCKET_T > SIZEOF_LONG
1417 if (s->sock_fd > LONG_MAX) {
1418 /* this can occur on Win64, and actually there is a special
1419 ugly printf formatter for decimal pointer length integer
1420 printing, only bother if necessary*/
1421 PyErr_SetString(PyExc_OverflowError,
1422 "no printf formatter to display the socket descriptor in decimal");
1423 return NULL;
1424 }
1425#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001426 sprintf(buf,
Fred Drakea04eaad2000-06-30 02:46:07 +00001427 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
1428 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001429 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001430}
1431
1432
Guido van Rossumb6775db1994-08-01 11:34:53 +00001433/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001434
Guido van Rossum73624e91994-10-10 17:59:00 +00001435static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001436 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001437 0,
1438 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001439 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001440 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001441 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001442 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001443 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001444 0, /*tp_setattr*/
1445 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001446 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001447 0, /*tp_as_number*/
1448 0, /*tp_as_sequence*/
1449 0, /*tp_as_mapping*/
1450};
1451
Guido van Rossum30a685f1991-06-27 15:51:29 +00001452
Guido van Rossum81194471991-07-27 21:42:02 +00001453/* Python interface to gethostname(). */
1454
1455/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001456static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001457PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001458{
1459 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001460 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001461 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001462 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001463 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001464 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001465 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001466 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001467 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001468 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001469 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001470}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001471
Guido van Rossum82a5c661998-07-07 20:45:43 +00001472static char gethostname_doc[] =
1473"gethostname() -> string\n\
1474\n\
1475Return the current host name.";
1476
Guido van Rossumff4949e1992-08-05 19:58:53 +00001477
Guido van Rossum30a685f1991-06-27 15:51:29 +00001478/* Python interface to gethostbyname(name). */
1479
1480/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001481static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001482PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001483{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001484 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001485 struct sockaddr_in addrbuf;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001486 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001487 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001488 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001489 return NULL;
1490 return makeipaddr(&addrbuf);
1491}
1492
Guido van Rossum82a5c661998-07-07 20:45:43 +00001493static char gethostbyname_doc[] =
1494"gethostbyname(host) -> address\n\
1495\n\
1496Return the IP address (a string of the form '255.255.255.255') for a host.";
1497
1498
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001499/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1500
1501static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001502gethost_common(struct hostent *h, struct sockaddr_in *addr)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001503{
1504 char **pch;
1505 PyObject *rtn_tuple = (PyObject *)NULL;
1506 PyObject *name_list = (PyObject *)NULL;
1507 PyObject *addr_list = (PyObject *)NULL;
1508 PyObject *tmp;
1509 if (h == NULL) {
1510#ifdef HAVE_HSTRERROR
1511 /* Let's get real error message to return */
1512 extern int h_errno;
1513 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1514#else
1515 PyErr_SetString(PySocket_Error, "host not found");
1516#endif
1517 return NULL;
1518 }
1519 if ((name_list = PyList_New(0)) == NULL)
1520 goto err;
1521 if ((addr_list = PyList_New(0)) == NULL)
1522 goto err;
1523 for (pch = h->h_aliases; *pch != NULL; pch++) {
1524 int status;
1525 tmp = PyString_FromString(*pch);
1526 if (tmp == NULL)
1527 goto err;
1528 status = PyList_Append(name_list, tmp);
1529 Py_DECREF(tmp);
1530 if (status)
1531 goto err;
1532 }
1533 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1534 int status;
1535 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1536 tmp = makeipaddr(addr);
1537 if (tmp == NULL)
1538 goto err;
1539 status = PyList_Append(addr_list, tmp);
1540 Py_DECREF(tmp);
1541 if (status)
1542 goto err;
1543 }
1544 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1545 err:
1546 Py_XDECREF(name_list);
1547 Py_XDECREF(addr_list);
1548 return rtn_tuple;
1549}
1550
1551
1552/* Python interface to gethostbyname_ex(name). */
1553
1554/*ARGSUSED*/
1555static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001556PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001557{
1558 char *name;
1559 struct hostent *h;
1560 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001561 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001562#ifdef HAVE_GETHOSTBYNAME_R
1563 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001564#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1565 struct hostent_data data;
1566#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001567 char buf[16384];
1568 int buf_len = (sizeof buf) - 1;
1569 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001570#endif
1571#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001572 int result;
1573#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001574#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001575 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001576 return NULL;
1577 if (setipaddr(name, &addr) < 0)
1578 return NULL;
1579 Py_BEGIN_ALLOW_THREADS
1580#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001581#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001582 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001583#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001584 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001585#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001586 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001587 result = gethostbyname_r(name, &hp_allocated, &data);
1588 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001589#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001590#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001591#ifdef USE_GETHOSTBYNAME_LOCK
1592 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001593#endif
1594 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001595#endif /* HAVE_GETHOSTBYNAME_R */
1596 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001597 ret = gethost_common(h, &addr);
1598#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001599 PyThread_release_lock(gethostbyname_lock);
1600#endif
1601 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001602}
1603
1604static char ghbn_ex_doc[] =
1605"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1606\n\
1607Return the true host name, a list of aliases, and a list of IP addresses,\n\
1608for a host. The host argument is a string giving a host name or IP number.";
1609
1610
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001611/* Python interface to gethostbyaddr(IP). */
1612
1613/*ARGSUSED*/
1614static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001615PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001616{
1617 struct sockaddr_in addr;
1618 char *ip_num;
1619 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001620 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001621#ifdef HAVE_GETHOSTBYNAME_R
1622 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001623#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1624 struct hostent_data data;
1625#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001626 char buf[16384];
1627 int buf_len = (sizeof buf) - 1;
1628 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001629#endif
1630#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001631 int result;
1632#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001633#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001634
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001635 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001636 return NULL;
1637 if (setipaddr(ip_num, &addr) < 0)
1638 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001639 Py_BEGIN_ALLOW_THREADS
1640#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001641#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001642 result = gethostbyaddr_r((char *)&addr.sin_addr,
1643 sizeof(addr.sin_addr),
1644 AF_INET, &hp_allocated, buf, buf_len,
1645 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001646#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001647 h = gethostbyaddr_r((char *)&addr.sin_addr,
1648 sizeof(addr.sin_addr),
1649 AF_INET,
1650 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001651#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001652 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001653 result = gethostbyaddr_r((char *)&addr.sin_addr,
1654 sizeof(addr.sin_addr),
1655 AF_INET, &hp_allocated, &data);
1656 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001657#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001658#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001659#ifdef USE_GETHOSTBYNAME_LOCK
1660 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001661#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001662 h = gethostbyaddr((char *)&addr.sin_addr,
1663 sizeof(addr.sin_addr),
1664 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001665#endif /* HAVE_GETHOSTBYNAME_R */
1666 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001667 ret = gethost_common(h, &addr);
1668#ifdef USE_GETHOSTBYNAME_LOCK
1669 PyThread_release_lock(gethostbyname_lock);
1670#endif
1671 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001672}
1673
Guido van Rossum82a5c661998-07-07 20:45:43 +00001674static char gethostbyaddr_doc[] =
1675"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1676\n\
1677Return the true host name, a list of aliases, and a list of IP addresses,\n\
1678for a host. The host argument is a string giving a host name or IP number.";
1679
Guido van Rossum30a685f1991-06-27 15:51:29 +00001680
1681/* Python interface to getservbyname(name).
1682 This only returns the port number, since the other info is already
1683 known or not useful (like the list of aliases). */
1684
1685/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001686static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001687PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001688{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001689 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001690 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001691 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001692 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001693 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001694 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001695 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001696 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001697 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001698 return NULL;
1699 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001700 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001701}
1702
Guido van Rossum82a5c661998-07-07 20:45:43 +00001703static char getservbyname_doc[] =
1704"getservbyname(servicename, protocolname) -> integer\n\
1705\n\
1706Return a port number from a service name and protocol name.\n\
1707The protocol name should be 'tcp' or 'udp'.";
1708
Guido van Rossum30a685f1991-06-27 15:51:29 +00001709
Guido van Rossum3901d851996-12-19 16:35:04 +00001710/* Python interface to getprotobyname(name).
1711 This only returns the protocol number, since the other info is
1712 already known or not useful (like the list of aliases). */
1713
1714/*ARGSUSED*/
1715static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001716PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00001717{
1718 char *name;
1719 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001720#ifdef __BEOS__
1721/* Not available in BeOS yet. - [cjh] */
1722 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1723 return NULL;
1724#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001725 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00001726 return NULL;
1727 Py_BEGIN_ALLOW_THREADS
1728 sp = getprotobyname(name);
1729 Py_END_ALLOW_THREADS
1730 if (sp == NULL) {
1731 PyErr_SetString(PySocket_Error, "protocol not found");
1732 return NULL;
1733 }
1734 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001735#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001736}
1737
Guido van Rossum82a5c661998-07-07 20:45:43 +00001738static char getprotobyname_doc[] =
1739"getprotobyname(name) -> integer\n\
1740\n\
1741Return the protocol number for the named protocol. (Rarely used.)";
1742
Guido van Rossum3901d851996-12-19 16:35:04 +00001743
Guido van Rossum30a685f1991-06-27 15:51:29 +00001744/* Python interface to socket(family, type, proto).
1745 The third (protocol) argument is optional.
1746 Return a new socket object. */
1747
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001748/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001749static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001750PySocket_socket(PyObject *self, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001751{
Guido van Rossum73624e91994-10-10 17:59:00 +00001752 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001753 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001754 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001755 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001756 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001757 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001758 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001759 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001760#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001761 if (fd == INVALID_SOCKET)
1762#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001763 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001764#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001765 return PySocket_Err();
1766 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001767 /* If the object can't be created, don't forget to close the
1768 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001769 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001770 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001771 /* From now on, ignore SIGPIPE and let the error checking
1772 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001773#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001774 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001775#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001776 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001777}
1778
Guido van Rossum82a5c661998-07-07 20:45:43 +00001779static char socket_doc[] =
1780"socket(family, type[, proto]) -> socket object\n\
1781\n\
1782Open a socket of the given type. The family argument specifies the\n\
1783address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1784The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1785or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1786specifying the default protocol.";
1787
1788
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001789#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001790/* Create a socket object from a numeric file description.
1791 Useful e.g. if stdin is a socket.
1792 Additional arguments as for socket(). */
1793
1794/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001795static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001796PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001797{
Guido van Rossum73624e91994-10-10 17:59:00 +00001798 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001799 SOCKET_T fd;
1800 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001801 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
1802 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001803 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001804 /* Dup the fd so it and the socket can be closed independently */
1805 fd = dup(fd);
1806 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001807 return PySocket_Err();
1808 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001809 /* From now on, ignore SIGPIPE and let the error checking
1810 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001811#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001812 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001813#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001814 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001815}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001816
1817static char fromfd_doc[] =
1818"fromfd(fd, family, type[, proto]) -> socket object\n\
1819\n\
1820Create a socket object from the given file descriptor.\n\
1821The remaining arguments are the same as for socket().";
1822
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001823#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001824
Guido van Rossum82a5c661998-07-07 20:45:43 +00001825
Guido van Rossum006bf911996-06-12 04:04:55 +00001826static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001827PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001828{
1829 int x1, x2;
1830
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001831 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001832 return NULL;
1833 }
1834 x2 = (int)ntohs((short)x1);
1835 return PyInt_FromLong(x2);
1836}
1837
Guido van Rossum82a5c661998-07-07 20:45:43 +00001838static char ntohs_doc[] =
1839"ntohs(integer) -> integer\n\
1840\n\
1841Convert a 16-bit integer from network to host byte order.";
1842
1843
Guido van Rossum006bf911996-06-12 04:04:55 +00001844static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001845PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001846{
1847 int x1, x2;
1848
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001849 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001850 return NULL;
1851 }
1852 x2 = ntohl(x1);
1853 return PyInt_FromLong(x2);
1854}
1855
Guido van Rossum82a5c661998-07-07 20:45:43 +00001856static char ntohl_doc[] =
1857"ntohl(integer) -> integer\n\
1858\n\
1859Convert a 32-bit integer from network to host byte order.";
1860
1861
Guido van Rossum006bf911996-06-12 04:04:55 +00001862static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001863PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001864{
1865 int x1, x2;
1866
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001867 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001868 return NULL;
1869 }
1870 x2 = (int)htons((short)x1);
1871 return PyInt_FromLong(x2);
1872}
1873
Guido van Rossum82a5c661998-07-07 20:45:43 +00001874static char htons_doc[] =
1875"htons(integer) -> integer\n\
1876\n\
1877Convert a 16-bit integer from host to network byte order.";
1878
1879
Guido van Rossum006bf911996-06-12 04:04:55 +00001880static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001881PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001882{
1883 int x1, x2;
1884
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001885 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001886 return NULL;
1887 }
1888 x2 = htonl(x1);
1889 return PyInt_FromLong(x2);
1890}
1891
Guido van Rossum82a5c661998-07-07 20:45:43 +00001892static char htonl_doc[] =
1893"htonl(integer) -> integer\n\
1894\n\
1895Convert a 32-bit integer from host to network byte order.";
1896
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001897/*
1898 * socket.inet_aton() and socket.inet_ntoa() functions
1899 *
1900 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
1901 *
1902 */
1903
1904static char inet_aton_doc[] =
1905"inet_aton(string) -> packed 32-bit IP representation\n\
1906\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001907Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001908binary format used in low-level network functions.";
1909
1910static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001911PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001912{
Guido van Rossuma2e48551999-09-09 15:42:59 +00001913#ifndef INADDR_NONE
1914#define INADDR_NONE (-1)
1915#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001916
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001917 /* Have to use inet_addr() instead */
1918 char *ip_addr;
1919 long packed_addr;
1920
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001921 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001922 return NULL;
1923 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00001924#ifdef USE_GUSI1
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001925 packed_addr = (long)inet_addr(ip_addr).s_addr;
1926#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001927 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001928#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001929
1930 if (packed_addr == INADDR_NONE) { /* invalid address */
1931 PyErr_SetString(PySocket_Error,
1932 "illegal IP address string passed to inet_aton");
1933 return NULL;
1934 }
1935
1936 return PyString_FromStringAndSize((char *) &packed_addr,
1937 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001938}
1939
1940static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00001941"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001942\n\
1943Convert an IP address from 32-bit packed binary format to string format";
1944
1945static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001946PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001947{
1948 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001949 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001950 struct in_addr packed_addr;
1951
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001952 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001953 return NULL;
1954 }
1955
1956 if (addr_len != sizeof(packed_addr)) {
1957 PyErr_SetString(PySocket_Error,
1958 "packed IP wrong length for inet_ntoa");
1959 return NULL;
1960 }
1961
1962 memcpy(&packed_addr, packed_str, addr_len);
1963
1964 return PyString_FromString(inet_ntoa(packed_addr));
1965}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001966
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001967
1968#ifdef USE_SSL
1969
1970/* This is a C function to be called for new object initialization */
1971static SSLObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001972newSSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001973{
1974 SSLObject *self;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001975
Guido van Rossumb18618d2000-05-03 23:44:39 +00001976 self = PyObject_New(SSLObject, &SSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001977 if (self == NULL){
1978 PyErr_SetObject(SSLErrorObject,
1979 PyString_FromString("newSSLObject error"));
1980 return NULL;
1981 }
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001982 memset(self->server, '\0', sizeof(char) * 256);
1983 memset(self->issuer, '\0', sizeof(char) * 256);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001984
1985 self->x_attr = PyDict_New();
1986 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
1987 if (self->ctx == NULL) {
1988 PyErr_SetObject(SSLErrorObject,
1989 PyString_FromString("SSL_CTX_new error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00001990 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001991 return NULL;
1992 }
1993
1994 if ( (key_file && !cert_file) || (!key_file && cert_file) )
1995 {
1996 PyErr_SetObject(SSLErrorObject,
1997 PyString_FromString(
1998 "Both the key & certificate files must be specified"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00001999 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002000 return NULL;
2001 }
2002
2003 if (key_file && cert_file)
2004 {
2005 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
2006 SSL_FILETYPE_PEM) < 1)
2007 {
2008 PyErr_SetObject(SSLErrorObject,
2009 PyString_FromString(
2010 "SSL_CTX_use_PrivateKey_file 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 (SSL_CTX_use_certificate_chain_file(self->ctx,
2016 cert_file) < 1)
2017 {
2018 PyErr_SetObject(SSLErrorObject,
2019 PyString_FromString(
2020 "SSL_CTX_use_certificate_chain_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002021 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002022 return NULL;
2023 }
2024 }
2025
2026 SSL_CTX_set_verify(self->ctx,
2027 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2028 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2029 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2030 SSL_set_connect_state(self->ssl);
2031
2032 if ((SSL_connect(self->ssl)) == -1) {
2033 /* Actually negotiate SSL connection */
2034 PyErr_SetObject(SSLErrorObject,
2035 PyString_FromString("SSL_connect error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002036 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002037 return NULL;
2038 }
2039 self->ssl->debug = 1;
2040
2041 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2042 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
2043 self->server, 256);
2044 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2045 self->issuer, 256);
2046 }
2047 self->x_attr = NULL;
2048 self->Socket = Sock;
2049 Py_INCREF(self->Socket);
2050 return self;
2051}
2052
2053/* This is the Python function called for new object initialization */
2054static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002055PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002056{
2057 SSLObject *rv;
2058 PySocketSockObject *Sock;
2059 char *key_file;
2060 char *cert_file;
2061
Guido van Rossum43713e52000-02-29 13:59:29 +00002062 if (!PyArg_ParseTuple(args, "O!zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002063 &PySocketSock_Type, (PyObject*)&Sock,
2064 &key_file, &cert_file) )
2065 return NULL;
2066
2067 rv = newSSLObject(Sock, key_file, cert_file);
2068 if ( rv == NULL )
2069 return NULL;
2070 return (PyObject *)rv;
2071}
2072
2073static char ssl_doc[] =
2074"ssl(socket, keyfile, certfile) -> sslobject";
2075
2076static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002077SSL_server(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002078{
2079 return PyString_FromString(self->server);
2080}
2081
2082static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002083SSL_issuer(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002084{
2085 return PyString_FromString(self->issuer);
2086}
2087
2088
2089/* SSL object methods */
2090
2091static PyMethodDef SSLMethods[] = {
2092 { "write", (PyCFunction)SSL_SSLwrite, 1 },
2093 { "read", (PyCFunction)SSL_SSLread, 1 },
2094 { "server", (PyCFunction)SSL_server, 1 },
2095 { "issuer", (PyCFunction)SSL_issuer, 1 },
2096 { NULL, NULL}
2097};
2098
2099static void SSL_dealloc(SSLObject *self)
2100{
2101 if (self->server_cert) /* Possible not to have one? */
2102 X509_free (self->server_cert);
2103 SSL_CTX_free(self->ctx);
2104 SSL_free(self->ssl);
2105 Py_XDECREF(self->x_attr);
2106 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002107 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002108}
2109
2110static PyObject *SSL_getattr(SSLObject *self, char *name)
2111{
2112 return Py_FindMethod(SSLMethods, (PyObject *)self, name);
2113}
2114
2115staticforward PyTypeObject SSL_Type = {
2116 PyObject_HEAD_INIT(&PyType_Type)
2117 0, /*ob_size*/
2118 "SSL", /*tp_name*/
2119 sizeof(SSLObject), /*tp_basicsize*/
2120 0, /*tp_itemsize*/
2121 /* methods */
2122 (destructor)SSL_dealloc, /*tp_dealloc*/
2123 0, /*tp_print*/
2124 (getattrfunc)SSL_getattr, /*tp_getattr*/
2125 0, /*tp_setattr*/
2126 0, /*tp_compare*/
2127 0, /*tp_repr*/
2128 0, /*tp_as_number*/
2129 0, /*tp_as_sequence*/
2130 0, /*tp_as_mapping*/
2131 0, /*tp_hash*/
2132};
2133
2134
2135
2136static PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args)
2137{
2138 char *data;
Fred Drakea04eaad2000-06-30 02:46:07 +00002139 size_t len = 0;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002140
Guido van Rossum43713e52000-02-29 13:59:29 +00002141 if (!PyArg_ParseTuple(args, "s|i:write", &data, &len))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002142 return NULL;
2143
2144 if (!len)
2145 len = strlen(data);
2146
2147 len = SSL_write(self->ssl, data, len);
2148 return PyInt_FromLong((long)len);
2149}
2150
2151static PyObject *SSL_SSLread(SSLObject *self, PyObject *args)
2152{
2153 PyObject *buf;
2154 int count = 0;
2155 int len = 1024;
2156 int res;
2157
Guido van Rossum43713e52000-02-29 13:59:29 +00002158 PyArg_ParseTuple(args, "|i:read", &len);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002159
2160 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2161 return NULL; /* Error object should already be set */
2162
2163 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2164 res = SSL_get_error(self->ssl, count);
2165
2166 switch (res) {
2167 case 0: /* Good return value! */
2168 break;
2169 case 6:
2170 PyErr_SetString(SSLErrorObject, "EOF");
2171 Py_DECREF(buf);
2172 return NULL;
2173 break;
2174 case 5:
2175 default:
2176 return PyErr_SetFromErrno(SSLErrorObject);
2177 break;
2178 }
2179
2180 fflush(stderr);
2181
2182 if (count < 0) {
2183 Py_DECREF(buf);
2184 return PyErr_SetFromErrno(SSLErrorObject);
2185 }
2186
2187 if (count != len && _PyString_Resize(&buf, count) < 0)
2188 return NULL;
2189 return buf;
2190}
2191
2192#endif /* USE_SSL */
2193
2194
Guido van Rossum30a685f1991-06-27 15:51:29 +00002195/* List of functions exported by this module. */
2196
Guido van Rossum73624e91994-10-10 17:59:00 +00002197static PyMethodDef PySocket_methods[] = {
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002198 {"gethostbyname", PySocket_gethostbyname,
2199 METH_VARARGS, gethostbyname_doc},
2200 {"gethostbyname_ex", PySocket_gethostbyname_ex,
2201 METH_VARARGS, ghbn_ex_doc},
2202 {"gethostbyaddr", PySocket_gethostbyaddr,
2203 METH_VARARGS, gethostbyaddr_doc},
2204 {"gethostname", PySocket_gethostname,
2205 METH_VARARGS, gethostname_doc},
2206 {"getservbyname", PySocket_getservbyname,
2207 METH_VARARGS, getservbyname_doc},
2208 {"getprotobyname", PySocket_getprotobyname,
2209 METH_VARARGS,getprotobyname_doc},
2210 {"socket", PySocket_socket,
2211 METH_VARARGS, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002212#ifndef NO_DUP
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002213 {"fromfd", PySocket_fromfd,
2214 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002215#endif
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002216 {"ntohs", PySocket_ntohs,
2217 METH_VARARGS, ntohs_doc},
2218 {"ntohl", PySocket_ntohl,
2219 METH_VARARGS, ntohl_doc},
2220 {"htons", PySocket_htons,
2221 METH_VARARGS, htons_doc},
2222 {"htonl", PySocket_htonl,
2223 METH_VARARGS, htonl_doc},
2224 {"inet_aton", PySocket_inet_aton,
2225 METH_VARARGS, inet_aton_doc},
2226 {"inet_ntoa", PySocket_inet_ntoa,
2227 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002228#ifdef USE_SSL
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002229 {"ssl", PySocket_ssl,
2230 METH_VARARGS, ssl_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002231#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002232 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002233};
2234
Guido van Rossum30a685f1991-06-27 15:51:29 +00002235
2236/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002237 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002238 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002239 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002240static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002241insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002242{
Guido van Rossum73624e91994-10-10 17:59:00 +00002243 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002244 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002245 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002246
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002247 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002248}
2249
Guido van Rossum30a685f1991-06-27 15:51:29 +00002250
Guido van Rossum8d665e61996-06-26 18:22:49 +00002251#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002252
2253/* Additional initialization and cleanup for NT/Windows */
2254
2255static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002256NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002257{
2258 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002259}
2260
2261static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002262NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002263{
2264 WSADATA WSAData;
2265 int ret;
2266 char buf[100];
2267 ret = WSAStartup(0x0101, &WSAData);
2268 switch (ret) {
2269 case 0: /* no error */
2270 atexit(NTcleanup);
2271 return 1;
2272 case WSASYSNOTREADY:
2273 PyErr_SetString(PyExc_ImportError,
2274 "WSAStartup failed: network not ready");
2275 break;
2276 case WSAVERNOTSUPPORTED:
2277 case WSAEINVAL:
2278 PyErr_SetString(PyExc_ImportError,
2279 "WSAStartup failed: requested version not supported");
2280 break;
2281 default:
2282 sprintf(buf, "WSAStartup failed: error code %d", ret);
2283 PyErr_SetString(PyExc_ImportError, buf);
2284 break;
2285 }
2286 return 0;
2287}
2288
Guido van Rossum8d665e61996-06-26 18:22:49 +00002289#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002290
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002291#if defined(PYOS_OS2)
2292
2293/* Additional initialization and cleanup for OS/2 */
2294
2295static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002296OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002297{
2298 /* No cleanup is necessary for OS/2 Sockets */
2299}
2300
2301static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002302OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002303{
2304 char reason[64];
2305 int rc = sock_init();
2306
2307 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002308 atexit(OS2cleanup);
2309 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002310 }
2311
2312 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2313 PyErr_SetString(PyExc_ImportError, reason);
2314
Guido van Rossum32c575d1997-12-02 20:37:32 +00002315 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002316}
2317
2318#endif /* PYOS_OS2 */
2319
Guido van Rossum30a685f1991-06-27 15:51:29 +00002320/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002321 * This is called when the first 'import socket' is done,
2322 * via a table in config.c, if config.c is compiled with USE_SOCKET
2323 * defined.
2324 *
2325 * For MS_WINDOWS (which means any Windows variant), this module
2326 * is actually called "_socket", and there's a wrapper "socket.py"
2327 * which implements some missing functionality (such as makefile(),
2328 * dup() and fromfd()). The import of "_socket" may fail with an
2329 * ImportError exception if initialization of WINSOCK fails. When
2330 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2331 * scheduled to be made at exit time.
2332 *
2333 * For OS/2, this module is also called "_socket" and uses a wrapper
2334 * "socket.py" which implements that functionality that is missing
2335 * when PC operating systems don't put socket descriptors in the
2336 * operating system's filesystem layer.
2337 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002338
Guido van Rossum82a5c661998-07-07 20:45:43 +00002339static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00002340"Implementation module for socket operations. See the socket module\n\
2341for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00002342
2343static char sockettype_doc[] =
2344"A socket represents one endpoint of a network connection.\n\
2345\n\
2346Methods:\n\
2347\n\
2348accept() -- accept a connection, returning new socket and client address\n\
2349bind() -- bind the socket to a local address\n\
2350close() -- close the socket\n\
2351connect() -- connect the socket to a remote address\n\
2352connect_ex() -- connect, return an error code instead of an exception \n\
2353dup() -- return a new socket object identical to the current one (*)\n\
2354fileno() -- return underlying file descriptor\n\
2355getpeername() -- return remote address (*)\n\
2356getsockname() -- return local address\n\
2357getsockopt() -- get socket options\n\
2358listen() -- start listening for incoming connections\n\
2359makefile() -- return a file object corresponding tot the socket (*)\n\
2360recv() -- receive data\n\
2361recvfrom() -- receive data and sender's address\n\
2362send() -- send data\n\
2363sendto() -- send data to a given address\n\
2364setblocking() -- set or clear the blocking I/O flag\n\
2365setsockopt() -- set socket options\n\
2366shutdown() -- shut down traffic in one or both directions\n\
2367\n\
2368(*) not available on all platforms!)";
2369
Guido van Rossum3886bb61998-12-04 18:50:17 +00002370DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002371init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002372{
Guido van Rossum73624e91994-10-10 17:59:00 +00002373 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00002374#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002375 if (!NTinit())
2376 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002377#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002378#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002379 if (!OS2init())
2380 return;
Fred Drakea136d492000-08-16 14:18:30 +00002381#endif /* __TOS_OS2__ */
2382#endif /* MS_WINDOWS */
Guido van Rossum82a5c661998-07-07 20:45:43 +00002383 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00002384 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002385 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2386 if (PySocket_Error == NULL)
2387 return;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002388#ifdef USE_SSL
2389 SSL_load_error_strings();
2390 SSLeay_add_ssl_algorithms();
2391 SSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2392 if (SSLErrorObject == NULL)
2393 return;
2394 PyDict_SetItemString(d, "sslerror", SSLErrorObject);
2395 Py_INCREF(&SSL_Type);
2396 if (PyDict_SetItemString(d, "SSLType",
2397 (PyObject *)&SSL_Type) != 0)
2398 return;
2399#endif /* USE_SSL */
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002400 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002401 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002402 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002403 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002404 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002405 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002406 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002407
2408 /* Address families (we only support AF_INET and AF_UNIX) */
2409#ifdef AF_UNSPEC
2410 insint(d, "AF_UNSPEC", AF_UNSPEC);
2411#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002412 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002413#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002414 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002415#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002416#ifdef AF_AX25
2417 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2418#endif
2419#ifdef AF_IPX
2420 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2421#endif
2422#ifdef AF_APPLETALK
2423 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2424#endif
2425#ifdef AF_NETROM
2426 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2427#endif
2428#ifdef AF_BRIDGE
2429 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2430#endif
2431#ifdef AF_AAL5
2432 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2433#endif
2434#ifdef AF_X25
2435 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2436#endif
2437#ifdef AF_INET6
2438 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2439#endif
2440#ifdef AF_ROSE
2441 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2442#endif
2443
2444 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002445 insint(d, "SOCK_STREAM", SOCK_STREAM);
2446 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002447#ifndef __BEOS__
2448/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002449 insint(d, "SOCK_RAW", SOCK_RAW);
2450 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2451 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002452#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002453
2454#ifdef SO_DEBUG
2455 insint(d, "SO_DEBUG", SO_DEBUG);
2456#endif
2457#ifdef SO_ACCEPTCONN
2458 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2459#endif
2460#ifdef SO_REUSEADDR
2461 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2462#endif
2463#ifdef SO_KEEPALIVE
2464 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2465#endif
2466#ifdef SO_DONTROUTE
2467 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2468#endif
2469#ifdef SO_BROADCAST
2470 insint(d, "SO_BROADCAST", SO_BROADCAST);
2471#endif
2472#ifdef SO_USELOOPBACK
2473 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2474#endif
2475#ifdef SO_LINGER
2476 insint(d, "SO_LINGER", SO_LINGER);
2477#endif
2478#ifdef SO_OOBINLINE
2479 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2480#endif
2481#ifdef SO_REUSEPORT
2482 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2483#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002484#ifdef SO_SNDBUF
2485 insint(d, "SO_SNDBUF", SO_SNDBUF);
2486#endif
2487#ifdef SO_RCVBUF
2488 insint(d, "SO_RCVBUF", SO_RCVBUF);
2489#endif
2490#ifdef SO_SNDLOWAT
2491 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2492#endif
2493#ifdef SO_RCVLOWAT
2494 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2495#endif
2496#ifdef SO_SNDTIMEO
2497 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2498#endif
2499#ifdef SO_RCVTIMEO
2500 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2501#endif
2502#ifdef SO_ERROR
2503 insint(d, "SO_ERROR", SO_ERROR);
2504#endif
2505#ifdef SO_TYPE
2506 insint(d, "SO_TYPE", SO_TYPE);
2507#endif
2508
2509 /* Maximum number of connections for "listen" */
2510#ifdef SOMAXCONN
2511 insint(d, "SOMAXCONN", SOMAXCONN);
2512#else
2513 insint(d, "SOMAXCONN", 5); /* Common value */
2514#endif
2515
2516 /* Flags for send, recv */
2517#ifdef MSG_OOB
2518 insint(d, "MSG_OOB", MSG_OOB);
2519#endif
2520#ifdef MSG_PEEK
2521 insint(d, "MSG_PEEK", MSG_PEEK);
2522#endif
2523#ifdef MSG_DONTROUTE
2524 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2525#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002526#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00002527 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002528#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002529#ifdef MSG_EOR
2530 insint(d, "MSG_EOR", MSG_EOR);
2531#endif
2532#ifdef MSG_TRUNC
2533 insint(d, "MSG_TRUNC", MSG_TRUNC);
2534#endif
2535#ifdef MSG_CTRUNC
2536 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2537#endif
2538#ifdef MSG_WAITALL
2539 insint(d, "MSG_WAITALL", MSG_WAITALL);
2540#endif
2541#ifdef MSG_BTAG
2542 insint(d, "MSG_BTAG", MSG_BTAG);
2543#endif
2544#ifdef MSG_ETAG
2545 insint(d, "MSG_ETAG", MSG_ETAG);
2546#endif
2547
2548 /* Protocol level and numbers, usable for [gs]etsockopt */
2549#ifdef SOL_SOCKET
2550 insint(d, "SOL_SOCKET", SOL_SOCKET);
2551#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002552#ifdef SOL_IP
2553 insint(d, "SOL_IP", SOL_IP);
2554#else
2555 insint(d, "SOL_IP", 0);
2556#endif
2557#ifdef SOL_IPX
2558 insint(d, "SOL_IPX", SOL_IPX);
2559#endif
2560#ifdef SOL_AX25
2561 insint(d, "SOL_AX25", SOL_AX25);
2562#endif
2563#ifdef SOL_ATALK
2564 insint(d, "SOL_ATALK", SOL_ATALK);
2565#endif
2566#ifdef SOL_NETROM
2567 insint(d, "SOL_NETROM", SOL_NETROM);
2568#endif
2569#ifdef SOL_ROSE
2570 insint(d, "SOL_ROSE", SOL_ROSE);
2571#endif
2572#ifdef SOL_TCP
2573 insint(d, "SOL_TCP", SOL_TCP);
2574#else
2575 insint(d, "SOL_TCP", 6);
2576#endif
2577#ifdef SOL_UDP
2578 insint(d, "SOL_UDP", SOL_UDP);
2579#else
2580 insint(d, "SOL_UDP", 17);
2581#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002582#ifdef IPPROTO_IP
2583 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002584#else
2585 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002586#endif
2587#ifdef IPPROTO_ICMP
2588 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002589#else
2590 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002591#endif
2592#ifdef IPPROTO_IGMP
2593 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2594#endif
2595#ifdef IPPROTO_GGP
2596 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2597#endif
2598#ifdef IPPROTO_TCP
2599 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002600#else
2601 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002602#endif
2603#ifdef IPPROTO_EGP
2604 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2605#endif
2606#ifdef IPPROTO_PUP
2607 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2608#endif
2609#ifdef IPPROTO_UDP
2610 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002611#else
2612 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002613#endif
2614#ifdef IPPROTO_IDP
2615 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2616#endif
2617#ifdef IPPROTO_HELLO
2618 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2619#endif
2620#ifdef IPPROTO_ND
2621 insint(d, "IPPROTO_ND", IPPROTO_ND);
2622#endif
2623#ifdef IPPROTO_TP
2624 insint(d, "IPPROTO_TP", IPPROTO_TP);
2625#endif
2626#ifdef IPPROTO_XTP
2627 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2628#endif
2629#ifdef IPPROTO_EON
2630 insint(d, "IPPROTO_EON", IPPROTO_EON);
2631#endif
2632#ifdef IPPROTO_BIP
2633 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2634#endif
2635/**/
2636#ifdef IPPROTO_RAW
2637 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002638#else
2639 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002640#endif
2641#ifdef IPPROTO_MAX
2642 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2643#endif
2644
2645 /* Some port configuration */
2646#ifdef IPPORT_RESERVED
2647 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2648#else
2649 insint(d, "IPPORT_RESERVED", 1024);
2650#endif
2651#ifdef IPPORT_USERRESERVED
2652 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2653#else
2654 insint(d, "IPPORT_USERRESERVED", 5000);
2655#endif
2656
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002657 /* Some reserved IP v.4 addresses */
2658#ifdef INADDR_ANY
2659 insint(d, "INADDR_ANY", INADDR_ANY);
2660#else
2661 insint(d, "INADDR_ANY", 0x00000000);
2662#endif
2663#ifdef INADDR_BROADCAST
2664 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2665#else
2666 insint(d, "INADDR_BROADCAST", 0xffffffff);
2667#endif
2668#ifdef INADDR_LOOPBACK
2669 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2670#else
2671 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2672#endif
2673#ifdef INADDR_UNSPEC_GROUP
2674 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2675#else
2676 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2677#endif
2678#ifdef INADDR_ALLHOSTS_GROUP
2679 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2680#else
2681 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2682#endif
2683#ifdef INADDR_MAX_LOCAL_GROUP
2684 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2685#else
2686 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2687#endif
2688#ifdef INADDR_NONE
2689 insint(d, "INADDR_NONE", INADDR_NONE);
2690#else
2691 insint(d, "INADDR_NONE", 0xffffffff);
2692#endif
2693
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002694 /* IP [gs]etsockopt options */
2695#ifdef IP_OPTIONS
2696 insint(d, "IP_OPTIONS", IP_OPTIONS);
2697#endif
2698#ifdef IP_HDRINCL
2699 insint(d, "IP_HDRINCL", IP_HDRINCL);
2700#endif
2701#ifdef IP_TOS
2702 insint(d, "IP_TOS", IP_TOS);
2703#endif
2704#ifdef IP_TTL
2705 insint(d, "IP_TTL", IP_TTL);
2706#endif
2707#ifdef IP_RECVOPTS
2708 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2709#endif
2710#ifdef IP_RECVRETOPTS
2711 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2712#endif
2713#ifdef IP_RECVDSTADDR
2714 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2715#endif
2716#ifdef IP_RETOPTS
2717 insint(d, "IP_RETOPTS", IP_RETOPTS);
2718#endif
2719#ifdef IP_MULTICAST_IF
2720 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2721#endif
2722#ifdef IP_MULTICAST_TTL
2723 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2724#endif
2725#ifdef IP_MULTICAST_LOOP
2726 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2727#endif
2728#ifdef IP_ADD_MEMBERSHIP
2729 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2730#endif
2731#ifdef IP_DROP_MEMBERSHIP
2732 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2733#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002734#ifdef IP_DEFAULT_MULTICAST_TTL
2735 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
2736#endif
2737#ifdef IP_DEFAULT_MULTICAST_LOOP
2738 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
2739#endif
2740#ifdef IP_MAX_MEMBERSHIPS
2741 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
2742#endif
2743
2744 /* TCP options */
2745#ifdef TCP_NODELAY
2746 insint(d, "TCP_NODELAY", TCP_NODELAY);
2747#endif
2748#ifdef TCP_MAXSEG
2749 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
2750#endif
2751
2752 /* IPX options */
2753#ifdef IPX_TYPE
2754 insint(d, "IPX_TYPE", IPX_TYPE);
2755#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002756
2757 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002758#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002759 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002760#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002761}