blob: 11e87bc5ec9d344bb53fafd238cd7729039a0d1c [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 Rossum20d3fc02000-12-18 22:23:44 +0000907 SOCKET_T fd;
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000908 if (!PyArg_ParseTuple(args, ":close"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000909 return NULL;
Guido van Rossum20d3fc02000-12-18 22:23:44 +0000910 if ((fd = s->sock_fd) != -1) {
911 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +0000912 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +0000913 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +0000914 Py_END_ALLOW_THREADS
915 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000916 Py_INCREF(Py_None);
917 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000918}
919
Guido van Rossum82a5c661998-07-07 20:45:43 +0000920static char close_doc[] =
921"close()\n\
922\n\
923Close the socket. It cannot be used after this call.";
924
Guido van Rossum30a685f1991-06-27 15:51:29 +0000925
Fred Drake728819a2000-07-01 03:40:12 +0000926/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000927
Guido van Rossum73624e91994-10-10 17:59:00 +0000928static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000929PySocketSock_connect(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000930{
931 struct sockaddr *addr;
932 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000933 int res;
Fred Drake728819a2000-07-01 03:40:12 +0000934 PyObject *addro;
935 if (!PyArg_ParseTuple(args, "O:connect", &addro))
936 return NULL;
937 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000938 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000939 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000940 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000941 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000942 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000943 return PySocket_Err();
944 Py_INCREF(Py_None);
945 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000946}
947
Guido van Rossum82a5c661998-07-07 20:45:43 +0000948static char connect_doc[] =
949"connect(address)\n\
950\n\
951Connect the socket to a remote address. For IP sockets, the address\n\
952is a pair (host, port).";
953
Guido van Rossum30a685f1991-06-27 15:51:29 +0000954
Fred Drake728819a2000-07-01 03:40:12 +0000955/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000956
957static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000958PySocketSock_connect_ex(PySocketSockObject *s, PyObject *args)
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000959{
960 struct sockaddr *addr;
961 int addrlen;
962 int res;
Fred Drake728819a2000-07-01 03:40:12 +0000963 PyObject *addro;
964 if (!PyArg_ParseTuple(args, "O:connect_ex", &addro))
965 return NULL;
966 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000967 return NULL;
968 Py_BEGIN_ALLOW_THREADS
969 res = connect(s->sock_fd, addr, addrlen);
970 Py_END_ALLOW_THREADS
971 if (res != 0)
972 res = errno;
973 return PyInt_FromLong((long) res);
974}
975
Guido van Rossum82a5c661998-07-07 20:45:43 +0000976static char connect_ex_doc[] =
977"connect_ex(address)\n\
978\n\
979This is like connect(address), but returns an error code (the errno value)\n\
980instead of raising an exception when an error occurs.";
981
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000982
Guido van Rossumed233a51992-06-23 09:07:03 +0000983/* s.fileno() method */
984
Guido van Rossum73624e91994-10-10 17:59:00 +0000985static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000986PySocketSock_fileno(PySocketSockObject *s, PyObject *args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000987{
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000988 if (!PyArg_ParseTuple(args, ":fileno"))
Guido van Rossumed233a51992-06-23 09:07:03 +0000989 return NULL;
Fred Drakea04eaad2000-06-30 02:46:07 +0000990#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +0000991 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +0000992#else
993 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
994#endif
Guido van Rossumed233a51992-06-23 09:07:03 +0000995}
996
Guido van Rossum82a5c661998-07-07 20:45:43 +0000997static char fileno_doc[] =
998"fileno() -> integer\n\
999\n\
1000Return the integer file descriptor of the socket.";
1001
Guido van Rossumed233a51992-06-23 09:07:03 +00001002
Guido van Rossumbe32c891996-06-20 16:25:29 +00001003#ifndef NO_DUP
1004/* s.dup() method */
1005
1006static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001007PySocketSock_dup(PySocketSockObject *s, PyObject *args)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001008{
Fred Drakea04eaad2000-06-30 02:46:07 +00001009 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001010 PyObject *sock;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001011 if (!PyArg_ParseTuple(args, ":dup"))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001012 return NULL;
1013 newfd = dup(s->sock_fd);
1014 if (newfd < 0)
1015 return PySocket_Err();
1016 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001017 s->sock_family,
1018 s->sock_type,
1019 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001020 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001021 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001022 return sock;
1023}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001024
1025static char dup_doc[] =
1026"dup() -> socket object\n\
1027\n\
1028Return a new socket object connected to the same system resource.";
1029
Guido van Rossumbe32c891996-06-20 16:25:29 +00001030#endif
1031
1032
Guido van Rossumc89705d1992-11-26 08:54:07 +00001033/* s.getsockname() method */
1034
Guido van Rossum73624e91994-10-10 17:59:00 +00001035static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001036PySocketSock_getsockname(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001037{
1038 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001039 int res;
1040 socklen_t addrlen;
1041
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001042 if (!PyArg_ParseTuple(args, ":getsockname"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001043 return NULL;
1044 if (!getsockaddrlen(s, &addrlen))
1045 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001046 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001047 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001048 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001049 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001050 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001051 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001052 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1053}
1054
Guido van Rossum82a5c661998-07-07 20:45:43 +00001055static char getsockname_doc[] =
1056"getsockname() -> address info\n\
1057\n\
1058Return the address of the local endpoint. For IP sockets, the address\n\
1059info is a pair (hostaddr, port).";
1060
Guido van Rossumc89705d1992-11-26 08:54:07 +00001061
Guido van Rossumb6775db1994-08-01 11:34:53 +00001062#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001063/* s.getpeername() method */
1064
Guido van Rossum73624e91994-10-10 17:59:00 +00001065static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001066PySocketSock_getpeername(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001067{
1068 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001069 int res;
1070 socklen_t addrlen;
1071
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001072 if (!PyArg_ParseTuple(args, ":getpeername"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001073 return NULL;
1074 if (!getsockaddrlen(s, &addrlen))
1075 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001076 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001077 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001078 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001079 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001080 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001081 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1082}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001083
1084static char getpeername_doc[] =
1085"getpeername() -> address info\n\
1086\n\
1087Return the address of the remote endpoint. For IP sockets, the address\n\
1088info is a pair (hostaddr, port).";
1089
Guido van Rossumb6775db1994-08-01 11:34:53 +00001090#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001091
1092
Guido van Rossum30a685f1991-06-27 15:51:29 +00001093/* s.listen(n) method */
1094
Guido van Rossum73624e91994-10-10 17:59:00 +00001095static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001096PySocketSock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001097{
1098 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001099 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001100 if (!PyArg_ParseTuple(args, "i:listen", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001101 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001102 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001103 if (backlog < 1)
1104 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001105 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001106 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001107 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001108 return PySocket_Err();
1109 Py_INCREF(Py_None);
1110 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001111}
1112
Guido van Rossum82a5c661998-07-07 20:45:43 +00001113static char listen_doc[] =
1114"listen(backlog)\n\
1115\n\
1116Enable a server to accept connections. The backlog argument must be at\n\
1117least 1; it specifies the number of unaccepted connection that the system\n\
1118will allow before refusing new connections.";
1119
1120
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001121#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001122/* s.makefile(mode) method.
1123 Create a new open file object referring to a dupped version of
1124 the socket's file descriptor. (The dup() call is necessary so
1125 that the open file and socket objects may be closed independent
1126 of each other.)
1127 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1128
Guido van Rossum73624e91994-10-10 17:59:00 +00001129static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001130PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001131{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001132 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001133 char *mode = "r";
1134 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001135#ifdef MS_WIN32
1136 intptr_t fd;
1137#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001138 int fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001139#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001140 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001141 PyObject *f;
1142
Guido van Rossum43713e52000-02-29 13:59:29 +00001143 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001144 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001145#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001146 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1147 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001148#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001149 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001150#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001151 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001152 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001153 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001154 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001155 }
1156 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1157 if (f != NULL)
1158 PyFile_SetBufSize(f, bufsize);
1159 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001160}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001161
1162static char makefile_doc[] =
1163"makefile([mode[, buffersize]]) -> file object\n\
1164\n\
1165Return a regular file object corresponding to the socket.\n\
1166The mode and buffersize arguments are as for the built-in open() function.";
1167
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001168#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001169
Guido van Rossum82a5c661998-07-07 20:45:43 +00001170
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001171/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001172
Guido van Rossum73624e91994-10-10 17:59:00 +00001173static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001174PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001175{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001176 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001177 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001178 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001179 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001180 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001181 if (buf == NULL)
1182 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001183 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001184 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001185 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001186 if (n < 0) {
1187 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001188 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001189 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001190 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001191 return NULL;
1192 return buf;
1193}
1194
Guido van Rossum82a5c661998-07-07 20:45:43 +00001195static char recv_doc[] =
1196"recv(buffersize[, flags]) -> data\n\
1197\n\
1198Receive up to buffersize bytes from the socket. For the optional flags\n\
1199argument, see the Unix manual. When no data is available, block until\n\
1200at least one byte is available or until the remote end is closed. When\n\
1201the remote end is closed and all data is read, return the empty string.";
1202
Guido van Rossum30a685f1991-06-27 15:51:29 +00001203
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001204/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001205
Guido van Rossum73624e91994-10-10 17:59:00 +00001206static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001207PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001208{
1209 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001210 PyObject *buf = NULL;
1211 PyObject *addr = NULL;
1212 PyObject *ret = NULL;
1213
Guido van Rossumff3ab422000-04-24 15:16:03 +00001214 int len, n, flags = 0;
1215 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001216 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001217 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001218 if (!getsockaddrlen(s, &addrlen))
1219 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001220 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001221 if (buf == NULL)
1222 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001223 Py_BEGIN_ALLOW_THREADS
1224 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001225#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001226#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001227 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001228#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001229 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001230#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001231#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001232 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001233#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001234 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001235 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001236 if (n < 0) {
1237 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001238 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001239 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001240 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001241 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00001242
1243 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
1244 goto finally;
1245
Guido van Rossum73624e91994-10-10 17:59:00 +00001246 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001247 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001248 Py_XDECREF(addr);
1249 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001250 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001251}
1252
Guido van Rossum82a5c661998-07-07 20:45:43 +00001253static char recvfrom_doc[] =
1254"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1255\n\
1256Like recv(buffersize, flags) but also return the sender's address info.";
1257
Guido van Rossum30a685f1991-06-27 15:51:29 +00001258
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001259/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001260
Guido van Rossum73624e91994-10-10 17:59:00 +00001261static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001262PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001263{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001264 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001265 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001266 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001267 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001268 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001269 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001270 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001271 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001272 return PySocket_Err();
1273 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001274}
1275
Guido van Rossum82a5c661998-07-07 20:45:43 +00001276static char send_doc[] =
1277"send(data[, flags])\n\
1278\n\
1279Send a data string to the socket. For the optional flags\n\
1280argument, see the Unix manual.";
1281
Guido van Rossum30a685f1991-06-27 15:51:29 +00001282
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001283/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001284
Guido van Rossum73624e91994-10-10 17:59:00 +00001285static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001286PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001287{
Guido van Rossum73624e91994-10-10 17:59:00 +00001288 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001289 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001290 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001291 int addrlen, len, n, flags;
1292 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001293 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001294 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001295 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1296 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001297 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001298 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001299 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001300 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001301 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001302 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001303 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001304 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001305 return PySocket_Err();
1306 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001307}
1308
Guido van Rossum82a5c661998-07-07 20:45:43 +00001309static char sendto_doc[] =
1310"sendto(data[, flags], address)\n\
1311\n\
1312Like send(data, flags) but allows specifying the destination address.\n\
1313For IP sockets, the address is a pair (hostaddr, port).";
1314
Guido van Rossum30a685f1991-06-27 15:51:29 +00001315
1316/* s.shutdown(how) method */
1317
Guido van Rossum73624e91994-10-10 17:59:00 +00001318static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001319PySocketSock_shutdown(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001320{
1321 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001322 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001323 if (!PyArg_ParseTuple(args, "i:shutdown", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001324 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001325 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001326 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001327 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001328 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001329 return PySocket_Err();
1330 Py_INCREF(Py_None);
1331 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001332}
1333
Guido van Rossum82a5c661998-07-07 20:45:43 +00001334static char shutdown_doc[] =
1335"shutdown(flag)\n\
1336\n\
1337Shut down the reading side of the socket (flag == 0), the writing side\n\
1338of the socket (flag == 1), or both ends (flag == 2).";
1339
Guido van Rossum30a685f1991-06-27 15:51:29 +00001340
1341/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001342
Guido van Rossum73624e91994-10-10 17:59:00 +00001343static PyMethodDef PySocketSock_methods[] = {
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001344 {"accept", (PyCFunction)PySocketSock_accept, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001345 accept_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001346 {"bind", (PyCFunction)PySocketSock_bind, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001347 bind_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001348 {"close", (PyCFunction)PySocketSock_close, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001349 close_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001350 {"connect", (PyCFunction)PySocketSock_connect, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001351 connect_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001352 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001353 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001354#ifndef NO_DUP
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001355 {"dup", (PyCFunction)PySocketSock_dup, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001356 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001357#endif
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001358 {"fileno", (PyCFunction)PySocketSock_fileno, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001359 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001360#ifdef HAVE_GETPEERNAME
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001361 {"getpeername", (PyCFunction)PySocketSock_getpeername, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001362 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001363#endif
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001364 {"getsockname", (PyCFunction)PySocketSock_getsockname, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001365 getsockname_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001366 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001367 getsockopt_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001368 {"listen", (PyCFunction)PySocketSock_listen, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001369 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001370#ifndef NO_DUP
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001371 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001372 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001373#endif
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001374 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001375 recv_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001376 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001377 recvfrom_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001378 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001379 send_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001380 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001381 sendto_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001382 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001383 setblocking_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001384 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001385 setsockopt_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001386 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001387 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001388 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001389};
1390
Guido van Rossum30a685f1991-06-27 15:51:29 +00001391
Guido van Rossum73624e91994-10-10 17:59:00 +00001392/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001393 First close the file description. */
1394
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001395static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001396PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001397{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001398 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001399 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001400 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001401}
1402
Guido van Rossum30a685f1991-06-27 15:51:29 +00001403
1404/* Return a socket object's named attribute. */
1405
Guido van Rossum73624e91994-10-10 17:59:00 +00001406static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001407PySocketSock_getattr(PySocketSockObject *s, char *name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001408{
Guido van Rossum73624e91994-10-10 17:59:00 +00001409 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001410}
1411
Guido van Rossum30a685f1991-06-27 15:51:29 +00001412
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001413static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001414PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001415{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001416 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001417#if SIZEOF_SOCKET_T > SIZEOF_LONG
1418 if (s->sock_fd > LONG_MAX) {
1419 /* this can occur on Win64, and actually there is a special
1420 ugly printf formatter for decimal pointer length integer
1421 printing, only bother if necessary*/
1422 PyErr_SetString(PyExc_OverflowError,
1423 "no printf formatter to display the socket descriptor in decimal");
1424 return NULL;
1425 }
1426#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001427 sprintf(buf,
Fred Drakea04eaad2000-06-30 02:46:07 +00001428 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
1429 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001430 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001431}
1432
1433
Guido van Rossumb6775db1994-08-01 11:34:53 +00001434/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001435
Guido van Rossum73624e91994-10-10 17:59:00 +00001436static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001437 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001438 0,
1439 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001440 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001441 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001442 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001443 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001444 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001445 0, /*tp_setattr*/
1446 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001447 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001448 0, /*tp_as_number*/
1449 0, /*tp_as_sequence*/
1450 0, /*tp_as_mapping*/
1451};
1452
Guido van Rossum30a685f1991-06-27 15:51:29 +00001453
Guido van Rossum81194471991-07-27 21:42:02 +00001454/* Python interface to gethostname(). */
1455
1456/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001457static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001458PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001459{
1460 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001461 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001462 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001463 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001464 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001465 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001466 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001467 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001468 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001469 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001470 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001471}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001472
Guido van Rossum82a5c661998-07-07 20:45:43 +00001473static char gethostname_doc[] =
1474"gethostname() -> string\n\
1475\n\
1476Return the current host name.";
1477
Guido van Rossumff4949e1992-08-05 19:58:53 +00001478
Guido van Rossum30a685f1991-06-27 15:51:29 +00001479/* Python interface to gethostbyname(name). */
1480
1481/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001482static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001483PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001484{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001485 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001486 struct sockaddr_in addrbuf;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001487 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001488 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001489 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001490 return NULL;
1491 return makeipaddr(&addrbuf);
1492}
1493
Guido van Rossum82a5c661998-07-07 20:45:43 +00001494static char gethostbyname_doc[] =
1495"gethostbyname(host) -> address\n\
1496\n\
1497Return the IP address (a string of the form '255.255.255.255') for a host.";
1498
1499
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001500/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1501
1502static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001503gethost_common(struct hostent *h, struct sockaddr_in *addr)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001504{
1505 char **pch;
1506 PyObject *rtn_tuple = (PyObject *)NULL;
1507 PyObject *name_list = (PyObject *)NULL;
1508 PyObject *addr_list = (PyObject *)NULL;
1509 PyObject *tmp;
1510 if (h == NULL) {
1511#ifdef HAVE_HSTRERROR
1512 /* Let's get real error message to return */
1513 extern int h_errno;
1514 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1515#else
1516 PyErr_SetString(PySocket_Error, "host not found");
1517#endif
1518 return NULL;
1519 }
1520 if ((name_list = PyList_New(0)) == NULL)
1521 goto err;
1522 if ((addr_list = PyList_New(0)) == NULL)
1523 goto err;
1524 for (pch = h->h_aliases; *pch != NULL; pch++) {
1525 int status;
1526 tmp = PyString_FromString(*pch);
1527 if (tmp == NULL)
1528 goto err;
1529 status = PyList_Append(name_list, tmp);
1530 Py_DECREF(tmp);
1531 if (status)
1532 goto err;
1533 }
1534 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1535 int status;
1536 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1537 tmp = makeipaddr(addr);
1538 if (tmp == NULL)
1539 goto err;
1540 status = PyList_Append(addr_list, tmp);
1541 Py_DECREF(tmp);
1542 if (status)
1543 goto err;
1544 }
1545 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1546 err:
1547 Py_XDECREF(name_list);
1548 Py_XDECREF(addr_list);
1549 return rtn_tuple;
1550}
1551
1552
1553/* Python interface to gethostbyname_ex(name). */
1554
1555/*ARGSUSED*/
1556static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001557PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001558{
1559 char *name;
1560 struct hostent *h;
1561 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001562 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001563#ifdef HAVE_GETHOSTBYNAME_R
1564 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001565#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1566 struct hostent_data data;
1567#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001568 char buf[16384];
1569 int buf_len = (sizeof buf) - 1;
1570 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001571#endif
1572#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001573 int result;
1574#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001575#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001576 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001577 return NULL;
1578 if (setipaddr(name, &addr) < 0)
1579 return NULL;
1580 Py_BEGIN_ALLOW_THREADS
1581#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001582#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001583 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001584#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001585 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001586#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001587 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001588 result = gethostbyname_r(name, &hp_allocated, &data);
1589 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001590#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001591#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001592#ifdef USE_GETHOSTBYNAME_LOCK
1593 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001594#endif
1595 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001596#endif /* HAVE_GETHOSTBYNAME_R */
1597 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001598 ret = gethost_common(h, &addr);
1599#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001600 PyThread_release_lock(gethostbyname_lock);
1601#endif
1602 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001603}
1604
1605static char ghbn_ex_doc[] =
1606"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1607\n\
1608Return the true host name, a list of aliases, and a list of IP addresses,\n\
1609for a host. The host argument is a string giving a host name or IP number.";
1610
1611
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001612/* Python interface to gethostbyaddr(IP). */
1613
1614/*ARGSUSED*/
1615static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001616PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001617{
1618 struct sockaddr_in addr;
1619 char *ip_num;
1620 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001621 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001622#ifdef HAVE_GETHOSTBYNAME_R
1623 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001624#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1625 struct hostent_data data;
1626#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001627 char buf[16384];
1628 int buf_len = (sizeof buf) - 1;
1629 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001630#endif
1631#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001632 int result;
1633#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001634#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001635
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001636 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001637 return NULL;
1638 if (setipaddr(ip_num, &addr) < 0)
1639 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001640 Py_BEGIN_ALLOW_THREADS
1641#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001642#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001643 result = gethostbyaddr_r((char *)&addr.sin_addr,
1644 sizeof(addr.sin_addr),
1645 AF_INET, &hp_allocated, buf, buf_len,
1646 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001647#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001648 h = gethostbyaddr_r((char *)&addr.sin_addr,
1649 sizeof(addr.sin_addr),
1650 AF_INET,
1651 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001652#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001653 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001654 result = gethostbyaddr_r((char *)&addr.sin_addr,
1655 sizeof(addr.sin_addr),
1656 AF_INET, &hp_allocated, &data);
1657 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001658#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001659#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001660#ifdef USE_GETHOSTBYNAME_LOCK
1661 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001662#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001663 h = gethostbyaddr((char *)&addr.sin_addr,
1664 sizeof(addr.sin_addr),
1665 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001666#endif /* HAVE_GETHOSTBYNAME_R */
1667 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001668 ret = gethost_common(h, &addr);
1669#ifdef USE_GETHOSTBYNAME_LOCK
1670 PyThread_release_lock(gethostbyname_lock);
1671#endif
1672 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001673}
1674
Guido van Rossum82a5c661998-07-07 20:45:43 +00001675static char gethostbyaddr_doc[] =
1676"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1677\n\
1678Return the true host name, a list of aliases, and a list of IP addresses,\n\
1679for a host. The host argument is a string giving a host name or IP number.";
1680
Guido van Rossum30a685f1991-06-27 15:51:29 +00001681
1682/* Python interface to getservbyname(name).
1683 This only returns the port number, since the other info is already
1684 known or not useful (like the list of aliases). */
1685
1686/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001687static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001688PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001689{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001690 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001691 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001692 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001693 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001694 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001695 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001696 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001697 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001698 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001699 return NULL;
1700 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001701 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001702}
1703
Guido van Rossum82a5c661998-07-07 20:45:43 +00001704static char getservbyname_doc[] =
1705"getservbyname(servicename, protocolname) -> integer\n\
1706\n\
1707Return a port number from a service name and protocol name.\n\
1708The protocol name should be 'tcp' or 'udp'.";
1709
Guido van Rossum30a685f1991-06-27 15:51:29 +00001710
Guido van Rossum3901d851996-12-19 16:35:04 +00001711/* Python interface to getprotobyname(name).
1712 This only returns the protocol number, since the other info is
1713 already known or not useful (like the list of aliases). */
1714
1715/*ARGSUSED*/
1716static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001717PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00001718{
1719 char *name;
1720 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001721#ifdef __BEOS__
1722/* Not available in BeOS yet. - [cjh] */
1723 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1724 return NULL;
1725#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001726 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00001727 return NULL;
1728 Py_BEGIN_ALLOW_THREADS
1729 sp = getprotobyname(name);
1730 Py_END_ALLOW_THREADS
1731 if (sp == NULL) {
1732 PyErr_SetString(PySocket_Error, "protocol not found");
1733 return NULL;
1734 }
1735 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001736#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001737}
1738
Guido van Rossum82a5c661998-07-07 20:45:43 +00001739static char getprotobyname_doc[] =
1740"getprotobyname(name) -> integer\n\
1741\n\
1742Return the protocol number for the named protocol. (Rarely used.)";
1743
Guido van Rossum3901d851996-12-19 16:35:04 +00001744
Guido van Rossum30a685f1991-06-27 15:51:29 +00001745/* Python interface to socket(family, type, proto).
1746 The third (protocol) argument is optional.
1747 Return a new socket object. */
1748
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001749/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001750static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001751PySocket_socket(PyObject *self, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001752{
Guido van Rossum73624e91994-10-10 17:59:00 +00001753 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001754 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001755 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001756 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001757 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001758 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001759 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001760 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001761#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001762 if (fd == INVALID_SOCKET)
1763#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001764 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001765#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001766 return PySocket_Err();
1767 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001768 /* If the object can't be created, don't forget to close the
1769 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001770 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001771 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001772 /* From now on, ignore SIGPIPE and let the error checking
1773 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001774#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001775 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001776#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001777 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001778}
1779
Guido van Rossum82a5c661998-07-07 20:45:43 +00001780static char socket_doc[] =
1781"socket(family, type[, proto]) -> socket object\n\
1782\n\
1783Open a socket of the given type. The family argument specifies the\n\
1784address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1785The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1786or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1787specifying the default protocol.";
1788
1789
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001790#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001791/* Create a socket object from a numeric file description.
1792 Useful e.g. if stdin is a socket.
1793 Additional arguments as for socket(). */
1794
1795/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001796static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001797PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001798{
Guido van Rossum73624e91994-10-10 17:59:00 +00001799 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001800 SOCKET_T fd;
1801 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001802 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
1803 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001804 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001805 /* Dup the fd so it and the socket can be closed independently */
1806 fd = dup(fd);
1807 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001808 return PySocket_Err();
1809 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001810 /* From now on, ignore SIGPIPE and let the error checking
1811 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001812#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001813 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001814#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001815 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001816}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001817
1818static char fromfd_doc[] =
1819"fromfd(fd, family, type[, proto]) -> socket object\n\
1820\n\
1821Create a socket object from the given file descriptor.\n\
1822The remaining arguments are the same as for socket().";
1823
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001824#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001825
Guido van Rossum82a5c661998-07-07 20:45:43 +00001826
Guido van Rossum006bf911996-06-12 04:04:55 +00001827static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001828PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001829{
1830 int x1, x2;
1831
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001832 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001833 return NULL;
1834 }
1835 x2 = (int)ntohs((short)x1);
1836 return PyInt_FromLong(x2);
1837}
1838
Guido van Rossum82a5c661998-07-07 20:45:43 +00001839static char ntohs_doc[] =
1840"ntohs(integer) -> integer\n\
1841\n\
1842Convert a 16-bit integer from network to host byte order.";
1843
1844
Guido van Rossum006bf911996-06-12 04:04:55 +00001845static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001846PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001847{
1848 int x1, x2;
1849
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001850 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001851 return NULL;
1852 }
1853 x2 = ntohl(x1);
1854 return PyInt_FromLong(x2);
1855}
1856
Guido van Rossum82a5c661998-07-07 20:45:43 +00001857static char ntohl_doc[] =
1858"ntohl(integer) -> integer\n\
1859\n\
1860Convert a 32-bit integer from network to host byte order.";
1861
1862
Guido van Rossum006bf911996-06-12 04:04:55 +00001863static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001864PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001865{
1866 int x1, x2;
1867
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001868 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001869 return NULL;
1870 }
1871 x2 = (int)htons((short)x1);
1872 return PyInt_FromLong(x2);
1873}
1874
Guido van Rossum82a5c661998-07-07 20:45:43 +00001875static char htons_doc[] =
1876"htons(integer) -> integer\n\
1877\n\
1878Convert a 16-bit integer from host to network byte order.";
1879
1880
Guido van Rossum006bf911996-06-12 04:04:55 +00001881static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001882PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001883{
1884 int x1, x2;
1885
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001886 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001887 return NULL;
1888 }
1889 x2 = htonl(x1);
1890 return PyInt_FromLong(x2);
1891}
1892
Guido van Rossum82a5c661998-07-07 20:45:43 +00001893static char htonl_doc[] =
1894"htonl(integer) -> integer\n\
1895\n\
1896Convert a 32-bit integer from host to network byte order.";
1897
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001898/*
1899 * socket.inet_aton() and socket.inet_ntoa() functions
1900 *
1901 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
1902 *
1903 */
1904
1905static char inet_aton_doc[] =
1906"inet_aton(string) -> packed 32-bit IP representation\n\
1907\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001908Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001909binary format used in low-level network functions.";
1910
1911static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001912PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001913{
Guido van Rossuma2e48551999-09-09 15:42:59 +00001914#ifndef INADDR_NONE
1915#define INADDR_NONE (-1)
1916#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001917
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001918 /* Have to use inet_addr() instead */
1919 char *ip_addr;
1920 long packed_addr;
1921
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001922 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001923 return NULL;
1924 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00001925#ifdef USE_GUSI1
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001926 packed_addr = (long)inet_addr(ip_addr).s_addr;
1927#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001928 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001929#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001930
1931 if (packed_addr == INADDR_NONE) { /* invalid address */
1932 PyErr_SetString(PySocket_Error,
1933 "illegal IP address string passed to inet_aton");
1934 return NULL;
1935 }
1936
1937 return PyString_FromStringAndSize((char *) &packed_addr,
1938 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001939}
1940
1941static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00001942"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001943\n\
1944Convert an IP address from 32-bit packed binary format to string format";
1945
1946static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001947PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001948{
1949 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001950 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001951 struct in_addr packed_addr;
1952
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001953 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001954 return NULL;
1955 }
1956
1957 if (addr_len != sizeof(packed_addr)) {
1958 PyErr_SetString(PySocket_Error,
1959 "packed IP wrong length for inet_ntoa");
1960 return NULL;
1961 }
1962
1963 memcpy(&packed_addr, packed_str, addr_len);
1964
1965 return PyString_FromString(inet_ntoa(packed_addr));
1966}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001967
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001968
1969#ifdef USE_SSL
1970
1971/* This is a C function to be called for new object initialization */
1972static SSLObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001973newSSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001974{
1975 SSLObject *self;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001976
Guido van Rossumb18618d2000-05-03 23:44:39 +00001977 self = PyObject_New(SSLObject, &SSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001978 if (self == NULL){
1979 PyErr_SetObject(SSLErrorObject,
1980 PyString_FromString("newSSLObject error"));
1981 return NULL;
1982 }
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001983 memset(self->server, '\0', sizeof(char) * 256);
1984 memset(self->issuer, '\0', sizeof(char) * 256);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001985
1986 self->x_attr = PyDict_New();
1987 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
1988 if (self->ctx == NULL) {
1989 PyErr_SetObject(SSLErrorObject,
1990 PyString_FromString("SSL_CTX_new error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00001991 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001992 return NULL;
1993 }
1994
1995 if ( (key_file && !cert_file) || (!key_file && cert_file) )
1996 {
1997 PyErr_SetObject(SSLErrorObject,
1998 PyString_FromString(
1999 "Both the key & certificate files must be specified"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002000 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002001 return NULL;
2002 }
2003
2004 if (key_file && cert_file)
2005 {
2006 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
2007 SSL_FILETYPE_PEM) < 1)
2008 {
2009 PyErr_SetObject(SSLErrorObject,
2010 PyString_FromString(
2011 "SSL_CTX_use_PrivateKey_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002012 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002013 return NULL;
2014 }
2015
2016 if (SSL_CTX_use_certificate_chain_file(self->ctx,
2017 cert_file) < 1)
2018 {
2019 PyErr_SetObject(SSLErrorObject,
2020 PyString_FromString(
2021 "SSL_CTX_use_certificate_chain_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002022 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002023 return NULL;
2024 }
2025 }
2026
2027 SSL_CTX_set_verify(self->ctx,
2028 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2029 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2030 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2031 SSL_set_connect_state(self->ssl);
2032
2033 if ((SSL_connect(self->ssl)) == -1) {
2034 /* Actually negotiate SSL connection */
2035 PyErr_SetObject(SSLErrorObject,
2036 PyString_FromString("SSL_connect error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002037 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002038 return NULL;
2039 }
2040 self->ssl->debug = 1;
2041
2042 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2043 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
2044 self->server, 256);
2045 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2046 self->issuer, 256);
2047 }
2048 self->x_attr = NULL;
2049 self->Socket = Sock;
2050 Py_INCREF(self->Socket);
2051 return self;
2052}
2053
2054/* This is the Python function called for new object initialization */
2055static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002056PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002057{
2058 SSLObject *rv;
2059 PySocketSockObject *Sock;
2060 char *key_file;
2061 char *cert_file;
2062
Guido van Rossum43713e52000-02-29 13:59:29 +00002063 if (!PyArg_ParseTuple(args, "O!zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002064 &PySocketSock_Type, (PyObject*)&Sock,
2065 &key_file, &cert_file) )
2066 return NULL;
2067
2068 rv = newSSLObject(Sock, key_file, cert_file);
2069 if ( rv == NULL )
2070 return NULL;
2071 return (PyObject *)rv;
2072}
2073
2074static char ssl_doc[] =
2075"ssl(socket, keyfile, certfile) -> sslobject";
2076
2077static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002078SSL_server(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002079{
2080 return PyString_FromString(self->server);
2081}
2082
2083static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002084SSL_issuer(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002085{
2086 return PyString_FromString(self->issuer);
2087}
2088
2089
2090/* SSL object methods */
2091
2092static PyMethodDef SSLMethods[] = {
2093 { "write", (PyCFunction)SSL_SSLwrite, 1 },
2094 { "read", (PyCFunction)SSL_SSLread, 1 },
2095 { "server", (PyCFunction)SSL_server, 1 },
2096 { "issuer", (PyCFunction)SSL_issuer, 1 },
2097 { NULL, NULL}
2098};
2099
2100static void SSL_dealloc(SSLObject *self)
2101{
2102 if (self->server_cert) /* Possible not to have one? */
2103 X509_free (self->server_cert);
2104 SSL_CTX_free(self->ctx);
2105 SSL_free(self->ssl);
2106 Py_XDECREF(self->x_attr);
2107 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002108 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002109}
2110
2111static PyObject *SSL_getattr(SSLObject *self, char *name)
2112{
2113 return Py_FindMethod(SSLMethods, (PyObject *)self, name);
2114}
2115
2116staticforward PyTypeObject SSL_Type = {
2117 PyObject_HEAD_INIT(&PyType_Type)
2118 0, /*ob_size*/
2119 "SSL", /*tp_name*/
2120 sizeof(SSLObject), /*tp_basicsize*/
2121 0, /*tp_itemsize*/
2122 /* methods */
2123 (destructor)SSL_dealloc, /*tp_dealloc*/
2124 0, /*tp_print*/
2125 (getattrfunc)SSL_getattr, /*tp_getattr*/
2126 0, /*tp_setattr*/
2127 0, /*tp_compare*/
2128 0, /*tp_repr*/
2129 0, /*tp_as_number*/
2130 0, /*tp_as_sequence*/
2131 0, /*tp_as_mapping*/
2132 0, /*tp_hash*/
2133};
2134
2135
2136
2137static PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args)
2138{
2139 char *data;
Fred Drakea04eaad2000-06-30 02:46:07 +00002140 size_t len = 0;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002141
Guido van Rossum43713e52000-02-29 13:59:29 +00002142 if (!PyArg_ParseTuple(args, "s|i:write", &data, &len))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002143 return NULL;
2144
2145 if (!len)
2146 len = strlen(data);
2147
2148 len = SSL_write(self->ssl, data, len);
2149 return PyInt_FromLong((long)len);
2150}
2151
2152static PyObject *SSL_SSLread(SSLObject *self, PyObject *args)
2153{
2154 PyObject *buf;
2155 int count = 0;
2156 int len = 1024;
2157 int res;
2158
Guido van Rossum43713e52000-02-29 13:59:29 +00002159 PyArg_ParseTuple(args, "|i:read", &len);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002160
2161 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2162 return NULL; /* Error object should already be set */
2163
2164 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2165 res = SSL_get_error(self->ssl, count);
2166
2167 switch (res) {
2168 case 0: /* Good return value! */
2169 break;
2170 case 6:
2171 PyErr_SetString(SSLErrorObject, "EOF");
2172 Py_DECREF(buf);
2173 return NULL;
2174 break;
2175 case 5:
2176 default:
2177 return PyErr_SetFromErrno(SSLErrorObject);
2178 break;
2179 }
2180
2181 fflush(stderr);
2182
2183 if (count < 0) {
2184 Py_DECREF(buf);
2185 return PyErr_SetFromErrno(SSLErrorObject);
2186 }
2187
2188 if (count != len && _PyString_Resize(&buf, count) < 0)
2189 return NULL;
2190 return buf;
2191}
2192
2193#endif /* USE_SSL */
2194
2195
Guido van Rossum30a685f1991-06-27 15:51:29 +00002196/* List of functions exported by this module. */
2197
Guido van Rossum73624e91994-10-10 17:59:00 +00002198static PyMethodDef PySocket_methods[] = {
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002199 {"gethostbyname", PySocket_gethostbyname,
2200 METH_VARARGS, gethostbyname_doc},
2201 {"gethostbyname_ex", PySocket_gethostbyname_ex,
2202 METH_VARARGS, ghbn_ex_doc},
2203 {"gethostbyaddr", PySocket_gethostbyaddr,
2204 METH_VARARGS, gethostbyaddr_doc},
2205 {"gethostname", PySocket_gethostname,
2206 METH_VARARGS, gethostname_doc},
2207 {"getservbyname", PySocket_getservbyname,
2208 METH_VARARGS, getservbyname_doc},
2209 {"getprotobyname", PySocket_getprotobyname,
2210 METH_VARARGS,getprotobyname_doc},
2211 {"socket", PySocket_socket,
2212 METH_VARARGS, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002213#ifndef NO_DUP
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002214 {"fromfd", PySocket_fromfd,
2215 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002216#endif
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002217 {"ntohs", PySocket_ntohs,
2218 METH_VARARGS, ntohs_doc},
2219 {"ntohl", PySocket_ntohl,
2220 METH_VARARGS, ntohl_doc},
2221 {"htons", PySocket_htons,
2222 METH_VARARGS, htons_doc},
2223 {"htonl", PySocket_htonl,
2224 METH_VARARGS, htonl_doc},
2225 {"inet_aton", PySocket_inet_aton,
2226 METH_VARARGS, inet_aton_doc},
2227 {"inet_ntoa", PySocket_inet_ntoa,
2228 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002229#ifdef USE_SSL
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002230 {"ssl", PySocket_ssl,
2231 METH_VARARGS, ssl_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002232#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002233 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002234};
2235
Guido van Rossum30a685f1991-06-27 15:51:29 +00002236
2237/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002238 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002239 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002240 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002241static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002242insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002243{
Guido van Rossum73624e91994-10-10 17:59:00 +00002244 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002245 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002246 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002247
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002248 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002249}
2250
Guido van Rossum30a685f1991-06-27 15:51:29 +00002251
Guido van Rossum8d665e61996-06-26 18:22:49 +00002252#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002253
2254/* Additional initialization and cleanup for NT/Windows */
2255
2256static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002257NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002258{
2259 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002260}
2261
2262static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002263NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002264{
2265 WSADATA WSAData;
2266 int ret;
2267 char buf[100];
2268 ret = WSAStartup(0x0101, &WSAData);
2269 switch (ret) {
2270 case 0: /* no error */
2271 atexit(NTcleanup);
2272 return 1;
2273 case WSASYSNOTREADY:
2274 PyErr_SetString(PyExc_ImportError,
2275 "WSAStartup failed: network not ready");
2276 break;
2277 case WSAVERNOTSUPPORTED:
2278 case WSAEINVAL:
2279 PyErr_SetString(PyExc_ImportError,
2280 "WSAStartup failed: requested version not supported");
2281 break;
2282 default:
2283 sprintf(buf, "WSAStartup failed: error code %d", ret);
2284 PyErr_SetString(PyExc_ImportError, buf);
2285 break;
2286 }
2287 return 0;
2288}
2289
Guido van Rossum8d665e61996-06-26 18:22:49 +00002290#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002291
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002292#if defined(PYOS_OS2)
2293
2294/* Additional initialization and cleanup for OS/2 */
2295
2296static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002297OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002298{
2299 /* No cleanup is necessary for OS/2 Sockets */
2300}
2301
2302static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002303OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002304{
2305 char reason[64];
2306 int rc = sock_init();
2307
2308 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002309 atexit(OS2cleanup);
2310 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002311 }
2312
2313 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2314 PyErr_SetString(PyExc_ImportError, reason);
2315
Guido van Rossum32c575d1997-12-02 20:37:32 +00002316 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002317}
2318
2319#endif /* PYOS_OS2 */
2320
Guido van Rossum30a685f1991-06-27 15:51:29 +00002321/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002322 * This is called when the first 'import socket' is done,
2323 * via a table in config.c, if config.c is compiled with USE_SOCKET
2324 * defined.
2325 *
2326 * For MS_WINDOWS (which means any Windows variant), this module
2327 * is actually called "_socket", and there's a wrapper "socket.py"
2328 * which implements some missing functionality (such as makefile(),
2329 * dup() and fromfd()). The import of "_socket" may fail with an
2330 * ImportError exception if initialization of WINSOCK fails. When
2331 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2332 * scheduled to be made at exit time.
2333 *
2334 * For OS/2, this module is also called "_socket" and uses a wrapper
2335 * "socket.py" which implements that functionality that is missing
2336 * when PC operating systems don't put socket descriptors in the
2337 * operating system's filesystem layer.
2338 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002339
Guido van Rossum82a5c661998-07-07 20:45:43 +00002340static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00002341"Implementation module for socket operations. See the socket module\n\
2342for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00002343
2344static char sockettype_doc[] =
2345"A socket represents one endpoint of a network connection.\n\
2346\n\
2347Methods:\n\
2348\n\
2349accept() -- accept a connection, returning new socket and client address\n\
2350bind() -- bind the socket to a local address\n\
2351close() -- close the socket\n\
2352connect() -- connect the socket to a remote address\n\
2353connect_ex() -- connect, return an error code instead of an exception \n\
2354dup() -- return a new socket object identical to the current one (*)\n\
2355fileno() -- return underlying file descriptor\n\
2356getpeername() -- return remote address (*)\n\
2357getsockname() -- return local address\n\
2358getsockopt() -- get socket options\n\
2359listen() -- start listening for incoming connections\n\
2360makefile() -- return a file object corresponding tot the socket (*)\n\
2361recv() -- receive data\n\
2362recvfrom() -- receive data and sender's address\n\
2363send() -- send data\n\
2364sendto() -- send data to a given address\n\
2365setblocking() -- set or clear the blocking I/O flag\n\
2366setsockopt() -- set socket options\n\
2367shutdown() -- shut down traffic in one or both directions\n\
2368\n\
2369(*) not available on all platforms!)";
2370
Guido van Rossum3886bb61998-12-04 18:50:17 +00002371DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002372init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002373{
Guido van Rossum73624e91994-10-10 17:59:00 +00002374 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00002375#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002376 if (!NTinit())
2377 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002378#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002379#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002380 if (!OS2init())
2381 return;
Fred Drakea136d492000-08-16 14:18:30 +00002382#endif /* __TOS_OS2__ */
2383#endif /* MS_WINDOWS */
Guido van Rossum82a5c661998-07-07 20:45:43 +00002384 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00002385 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002386 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2387 if (PySocket_Error == NULL)
2388 return;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002389#ifdef USE_SSL
2390 SSL_load_error_strings();
2391 SSLeay_add_ssl_algorithms();
2392 SSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2393 if (SSLErrorObject == NULL)
2394 return;
2395 PyDict_SetItemString(d, "sslerror", SSLErrorObject);
2396 Py_INCREF(&SSL_Type);
2397 if (PyDict_SetItemString(d, "SSLType",
2398 (PyObject *)&SSL_Type) != 0)
2399 return;
2400#endif /* USE_SSL */
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002401 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002402 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002403 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002404 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002405 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002406 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002407 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002408
2409 /* Address families (we only support AF_INET and AF_UNIX) */
2410#ifdef AF_UNSPEC
2411 insint(d, "AF_UNSPEC", AF_UNSPEC);
2412#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002413 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002414#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002415 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002416#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002417#ifdef AF_AX25
2418 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2419#endif
2420#ifdef AF_IPX
2421 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2422#endif
2423#ifdef AF_APPLETALK
2424 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2425#endif
2426#ifdef AF_NETROM
2427 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2428#endif
2429#ifdef AF_BRIDGE
2430 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2431#endif
2432#ifdef AF_AAL5
2433 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2434#endif
2435#ifdef AF_X25
2436 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2437#endif
2438#ifdef AF_INET6
2439 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2440#endif
2441#ifdef AF_ROSE
2442 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2443#endif
2444
2445 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002446 insint(d, "SOCK_STREAM", SOCK_STREAM);
2447 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002448#ifndef __BEOS__
2449/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002450 insint(d, "SOCK_RAW", SOCK_RAW);
2451 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2452 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002453#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002454
2455#ifdef SO_DEBUG
2456 insint(d, "SO_DEBUG", SO_DEBUG);
2457#endif
2458#ifdef SO_ACCEPTCONN
2459 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2460#endif
2461#ifdef SO_REUSEADDR
2462 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2463#endif
2464#ifdef SO_KEEPALIVE
2465 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2466#endif
2467#ifdef SO_DONTROUTE
2468 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2469#endif
2470#ifdef SO_BROADCAST
2471 insint(d, "SO_BROADCAST", SO_BROADCAST);
2472#endif
2473#ifdef SO_USELOOPBACK
2474 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2475#endif
2476#ifdef SO_LINGER
2477 insint(d, "SO_LINGER", SO_LINGER);
2478#endif
2479#ifdef SO_OOBINLINE
2480 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2481#endif
2482#ifdef SO_REUSEPORT
2483 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2484#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002485#ifdef SO_SNDBUF
2486 insint(d, "SO_SNDBUF", SO_SNDBUF);
2487#endif
2488#ifdef SO_RCVBUF
2489 insint(d, "SO_RCVBUF", SO_RCVBUF);
2490#endif
2491#ifdef SO_SNDLOWAT
2492 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2493#endif
2494#ifdef SO_RCVLOWAT
2495 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2496#endif
2497#ifdef SO_SNDTIMEO
2498 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2499#endif
2500#ifdef SO_RCVTIMEO
2501 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2502#endif
2503#ifdef SO_ERROR
2504 insint(d, "SO_ERROR", SO_ERROR);
2505#endif
2506#ifdef SO_TYPE
2507 insint(d, "SO_TYPE", SO_TYPE);
2508#endif
2509
2510 /* Maximum number of connections for "listen" */
2511#ifdef SOMAXCONN
2512 insint(d, "SOMAXCONN", SOMAXCONN);
2513#else
2514 insint(d, "SOMAXCONN", 5); /* Common value */
2515#endif
2516
2517 /* Flags for send, recv */
2518#ifdef MSG_OOB
2519 insint(d, "MSG_OOB", MSG_OOB);
2520#endif
2521#ifdef MSG_PEEK
2522 insint(d, "MSG_PEEK", MSG_PEEK);
2523#endif
2524#ifdef MSG_DONTROUTE
2525 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2526#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002527#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00002528 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002529#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002530#ifdef MSG_EOR
2531 insint(d, "MSG_EOR", MSG_EOR);
2532#endif
2533#ifdef MSG_TRUNC
2534 insint(d, "MSG_TRUNC", MSG_TRUNC);
2535#endif
2536#ifdef MSG_CTRUNC
2537 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2538#endif
2539#ifdef MSG_WAITALL
2540 insint(d, "MSG_WAITALL", MSG_WAITALL);
2541#endif
2542#ifdef MSG_BTAG
2543 insint(d, "MSG_BTAG", MSG_BTAG);
2544#endif
2545#ifdef MSG_ETAG
2546 insint(d, "MSG_ETAG", MSG_ETAG);
2547#endif
2548
2549 /* Protocol level and numbers, usable for [gs]etsockopt */
2550#ifdef SOL_SOCKET
2551 insint(d, "SOL_SOCKET", SOL_SOCKET);
2552#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002553#ifdef SOL_IP
2554 insint(d, "SOL_IP", SOL_IP);
2555#else
2556 insint(d, "SOL_IP", 0);
2557#endif
2558#ifdef SOL_IPX
2559 insint(d, "SOL_IPX", SOL_IPX);
2560#endif
2561#ifdef SOL_AX25
2562 insint(d, "SOL_AX25", SOL_AX25);
2563#endif
2564#ifdef SOL_ATALK
2565 insint(d, "SOL_ATALK", SOL_ATALK);
2566#endif
2567#ifdef SOL_NETROM
2568 insint(d, "SOL_NETROM", SOL_NETROM);
2569#endif
2570#ifdef SOL_ROSE
2571 insint(d, "SOL_ROSE", SOL_ROSE);
2572#endif
2573#ifdef SOL_TCP
2574 insint(d, "SOL_TCP", SOL_TCP);
2575#else
2576 insint(d, "SOL_TCP", 6);
2577#endif
2578#ifdef SOL_UDP
2579 insint(d, "SOL_UDP", SOL_UDP);
2580#else
2581 insint(d, "SOL_UDP", 17);
2582#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002583#ifdef IPPROTO_IP
2584 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002585#else
2586 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002587#endif
2588#ifdef IPPROTO_ICMP
2589 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002590#else
2591 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002592#endif
2593#ifdef IPPROTO_IGMP
2594 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2595#endif
2596#ifdef IPPROTO_GGP
2597 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2598#endif
2599#ifdef IPPROTO_TCP
2600 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002601#else
2602 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002603#endif
2604#ifdef IPPROTO_EGP
2605 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2606#endif
2607#ifdef IPPROTO_PUP
2608 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2609#endif
2610#ifdef IPPROTO_UDP
2611 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002612#else
2613 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002614#endif
2615#ifdef IPPROTO_IDP
2616 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2617#endif
2618#ifdef IPPROTO_HELLO
2619 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2620#endif
2621#ifdef IPPROTO_ND
2622 insint(d, "IPPROTO_ND", IPPROTO_ND);
2623#endif
2624#ifdef IPPROTO_TP
2625 insint(d, "IPPROTO_TP", IPPROTO_TP);
2626#endif
2627#ifdef IPPROTO_XTP
2628 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2629#endif
2630#ifdef IPPROTO_EON
2631 insint(d, "IPPROTO_EON", IPPROTO_EON);
2632#endif
2633#ifdef IPPROTO_BIP
2634 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2635#endif
2636/**/
2637#ifdef IPPROTO_RAW
2638 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002639#else
2640 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002641#endif
2642#ifdef IPPROTO_MAX
2643 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2644#endif
2645
2646 /* Some port configuration */
2647#ifdef IPPORT_RESERVED
2648 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2649#else
2650 insint(d, "IPPORT_RESERVED", 1024);
2651#endif
2652#ifdef IPPORT_USERRESERVED
2653 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2654#else
2655 insint(d, "IPPORT_USERRESERVED", 5000);
2656#endif
2657
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002658 /* Some reserved IP v.4 addresses */
2659#ifdef INADDR_ANY
2660 insint(d, "INADDR_ANY", INADDR_ANY);
2661#else
2662 insint(d, "INADDR_ANY", 0x00000000);
2663#endif
2664#ifdef INADDR_BROADCAST
2665 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2666#else
2667 insint(d, "INADDR_BROADCAST", 0xffffffff);
2668#endif
2669#ifdef INADDR_LOOPBACK
2670 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2671#else
2672 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2673#endif
2674#ifdef INADDR_UNSPEC_GROUP
2675 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2676#else
2677 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2678#endif
2679#ifdef INADDR_ALLHOSTS_GROUP
2680 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2681#else
2682 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2683#endif
2684#ifdef INADDR_MAX_LOCAL_GROUP
2685 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2686#else
2687 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2688#endif
2689#ifdef INADDR_NONE
2690 insint(d, "INADDR_NONE", INADDR_NONE);
2691#else
2692 insint(d, "INADDR_NONE", 0xffffffff);
2693#endif
2694
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002695 /* IP [gs]etsockopt options */
2696#ifdef IP_OPTIONS
2697 insint(d, "IP_OPTIONS", IP_OPTIONS);
2698#endif
2699#ifdef IP_HDRINCL
2700 insint(d, "IP_HDRINCL", IP_HDRINCL);
2701#endif
2702#ifdef IP_TOS
2703 insint(d, "IP_TOS", IP_TOS);
2704#endif
2705#ifdef IP_TTL
2706 insint(d, "IP_TTL", IP_TTL);
2707#endif
2708#ifdef IP_RECVOPTS
2709 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2710#endif
2711#ifdef IP_RECVRETOPTS
2712 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2713#endif
2714#ifdef IP_RECVDSTADDR
2715 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2716#endif
2717#ifdef IP_RETOPTS
2718 insint(d, "IP_RETOPTS", IP_RETOPTS);
2719#endif
2720#ifdef IP_MULTICAST_IF
2721 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2722#endif
2723#ifdef IP_MULTICAST_TTL
2724 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2725#endif
2726#ifdef IP_MULTICAST_LOOP
2727 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2728#endif
2729#ifdef IP_ADD_MEMBERSHIP
2730 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2731#endif
2732#ifdef IP_DROP_MEMBERSHIP
2733 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2734#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002735#ifdef IP_DEFAULT_MULTICAST_TTL
2736 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
2737#endif
2738#ifdef IP_DEFAULT_MULTICAST_LOOP
2739 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
2740#endif
2741#ifdef IP_MAX_MEMBERSHIPS
2742 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
2743#endif
2744
2745 /* TCP options */
2746#ifdef TCP_NODELAY
2747 insint(d, "TCP_NODELAY", TCP_NODELAY);
2748#endif
2749#ifdef TCP_MAXSEG
2750 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
2751#endif
2752
2753 /* IPX options */
2754#ifdef IPX_TYPE
2755 insint(d, "IPX_TYPE", IPX_TYPE);
2756#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002757
2758 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002759#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002760 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002761#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002762}