blob: 7e14743a893974b21c5aad749def92f93a7f0a1d [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
Jeremy Hylton22308652001-02-02 03:23:09 +000010- only AF_INET and AF_UNIX address families are supported in a
11 portable manner, though AF_PACKET is supported under Linux.
Guido van Rossum81194471991-07-27 21:42:02 +000012- no read/write operations (use send/recv or makefile instead)
Guido van Rossumbe32c891996-06-20 16:25:29 +000013- additional restrictions apply on Windows
Guido van Rossum6574b3e1991-06-25 21:36:08 +000014
Guido van Rossum27e177d1995-03-16 15:43:47 +000015Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000016
Guido van Rossum27e177d1995-03-16 15:43:47 +000017- socket.error: exception raised for socket specific errors
Guido van Rossum30a685f1991-06-27 15:51:29 +000018- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000019- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000020- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000021- socket.getprotobyname(protocolname) --> protocol number
Guido van Rossum27e177d1995-03-16 15:43:47 +000022- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000023- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum006bf911996-06-12 04:04:55 +000024- socket.ntohs(16 bit value) --> new int object
25- socket.ntohl(32 bit value) --> new int object
26- socket.htons(16 bit value) --> new int object
27- socket.htonl(32 bit value) --> new int object
Guido van Rossum27e177d1995-03-16 15:43:47 +000028- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +000029- socket.inet_aton(IP address) -> 32-bit packed IP representation
30- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum09c8b6c1999-12-07 21:37:17 +000031- socket.ssl(socket, keyfile, certfile) -> new ssl object
Guido van Rossum6574b3e1991-06-25 21:36:08 +000032- an Internet socket address is a pair (hostname, port)
33 where hostname can be anything recognized by gethostbyname()
34 (including the dd.dd.dd.dd notation) and port is in host byte order
35- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000036- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000037- an AF_PACKET socket address is a tuple containing a string
38 specifying the ethernet interface and an integer specifying
39 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000040 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
41 specify packet-type and ha-type/addr -- these are ignored by
Jeremy Hylton22308652001-02-02 03:23:09 +000042 networking code, but accepted since they are returned by the
43 getsockname() method.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000044
Guido van Rossum30a685f1991-06-27 15:51:29 +000045Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000046
Guido van Rossum81194471991-07-27 21:42:02 +000047- s.accept() --> new socket object, sockaddr
Fred Drake728819a2000-07-01 03:40:12 +000048- s.bind(sockaddr) --> None
Guido van Rossum27e177d1995-03-16 15:43:47 +000049- s.close() --> None
Fred Drake728819a2000-07-01 03:40:12 +000050- s.connect(sockaddr) --> None
51- s.connect_ex(sockaddr) --> 0 or errno (handy for e.g. async connect)
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- s.fileno() --> file descriptor
Guido van Rossumbe32c891996-06-20 16:25:29 +000053- s.dup() --> same as socket.fromfd(os.dup(s.fileno(), ...)
Guido van Rossumc89705d1992-11-26 08:54:07 +000054- s.getpeername() --> sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000055- s.getsockname() --> sockaddr
56- s.getsockopt(level, optname[, buflen]) --> int or string
57- s.listen(backlog) --> None
Guido van Rossum6b144911995-03-14 15:05:13 +000058- s.makefile([mode[, bufsize]]) --> file object
Guido van Rossum27e177d1995-03-16 15:43:47 +000059- s.recv(buflen [,flags]) --> string
60- s.recvfrom(buflen [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000061- s.send(string [,flags]) --> nbytes
62- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum27e177d1995-03-16 15:43:47 +000063- s.setblocking(0 | 1) --> None
64- s.setsockopt(level, optname, value) --> None
65- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000066- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000067
Guido van Rossum6574b3e1991-06-25 21:36:08 +000068*/
69
Guido van Rossum73624e91994-10-10 17:59:00 +000070#include "Python.h"
Guido van Rossum3baaa131999-03-22 21:44:51 +000071
Guido van Rossum9376b741999-09-15 22:01:40 +000072/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
73 script doesn't get this right, so we hardcode some platform checks below.
74 On the other hand, not all Linux versions agree, so there the settings
75 computed by the configure script are needed! */
76
77#ifndef linux
Guido van Rossume7de2061999-03-24 17:24:33 +000078#undef HAVE_GETHOSTBYNAME_R_3_ARG
79#undef HAVE_GETHOSTBYNAME_R_5_ARG
80#undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +000081#endif
Guido van Rossume7de2061999-03-24 17:24:33 +000082
Guido van Rossum7a122991999-04-13 04:07:32 +000083#ifndef WITH_THREAD
84#undef HAVE_GETHOSTBYNAME_R
85#endif
86
Guido van Rossume7de2061999-03-24 17:24:33 +000087#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +000088#if defined(_AIX) || defined(__osf__)
Guido van Rossume7de2061999-03-24 17:24:33 +000089#define HAVE_GETHOSTBYNAME_R_3_ARG
90#elif defined(__sun__) || defined(__sgi)
91#define HAVE_GETHOSTBYNAME_R_5_ARG
92#elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +000093/* Rely on the configure script */
Guido van Rossume7de2061999-03-24 17:24:33 +000094#else
95#undef HAVE_GETHOSTBYNAME_R
96#endif
97#endif
98
Guido van Rossum3baaa131999-03-22 21:44:51 +000099#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && !defined(MS_WINDOWS)
100#define USE_GETHOSTBYNAME_LOCK
101#endif
102
103#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum49b56061998-10-01 20:42:43 +0000104#include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000105#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000106
Guido van Rossuma376cc51996-12-05 23:43:35 +0000107#ifdef HAVE_UNISTD_H
108#include <unistd.h>
109#endif
110
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000111#if defined(PYCC_VACPP)
112#include <types.h>
113#include <io.h>
114#include <sys/ioctl.h>
115#include <utils.h>
116#include <ctype.h>
117#endif
118
119#if defined(PYOS_OS2)
120#define INCL_DOS
121#define INCL_DOSERRORS
122#define INCL_NOPMAPI
123#include <os2.h>
124#endif
125
Guido van Rossum48a680c2001-03-02 06:34:14 +0000126#ifdef RISCOS
127#define NO_DUP
128#undef off_t
129#undef uid_t
130#undef gid_t
131#undef errno
132#include <signal.h>
133#include "socklib.h"
134#include "inetlib.h"
135#include "netdb.h"
136#include "unixlib.h"
137#include "netinet/in.h"
138#include "sys/ioctl.h"
139#else /*RISCOS*/
140
Guido van Rossumb6775db1994-08-01 11:34:53 +0000141#include <sys/types.h>
Guido van Rossumed233a51992-06-23 09:07:03 +0000142
Guido van Rossum81194471991-07-27 21:42:02 +0000143#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000144#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000145#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000146#include <sys/socket.h>
147#include <netinet/in.h>
Fred Drake51d90362000-10-06 15:37:06 +0000148#if !(defined(__BEOS__) || defined(__CYGWIN__))
Andrew M. Kuchling52a644c2000-03-31 17:24:30 +0000149#include <netinet/tcp.h>
Fred Drake11b09362000-05-16 13:30:12 +0000150#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000151
Guido van Rossum9376b741999-09-15 22:01:40 +0000152/* Headers needed for inet_ntoa() and inet_addr() */
153#ifdef __BEOS__
154#include <net/netdb.h>
155#else
Guido van Rossumff3ab422000-04-24 15:16:03 +0000156#ifndef USE_GUSI1
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000157#include <arpa/inet.h>
Guido van Rossum9376b741999-09-15 22:01:40 +0000158#endif
Guido van Rossum1b6e4631999-11-04 18:22:29 +0000159#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000160
Guido van Rossume4485b01994-09-07 14:32:49 +0000161#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000162#else
163#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000164#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000165#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000166
167#endif /*RISCOS*/
168
Guido van Rossumb6775db1994-08-01 11:34:53 +0000169#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000170#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000171#else
172#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000173#endif
174
Jeremy Hylton22308652001-02-02 03:23:09 +0000175#if defined(linux) && defined(AF_PACKET)
176#include <sys/ioctl.h>
177#include <net/if.h>
178#include <netpacket/packet.h>
179#endif
180
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000181#ifndef O_NDELAY
182#define O_NDELAY O_NONBLOCK /* For QNX only? */
183#endif
184
Guido van Rossumff3ab422000-04-24 15:16:03 +0000185#ifdef USE_GUSI1
Jack Jansen508537b1996-02-14 15:57:45 +0000186/* fdopen() isn't declared in stdio.h (sigh) */
187#include <GUSI.h>
188#endif
189
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000190#ifdef USE_SSL
Andrew M. Kuchling697a0b02001-01-18 17:41:41 +0000191#include "openssl/rsa.h"
192#include "openssl/crypto.h"
193#include "openssl/x509.h"
194#include "openssl/pem.h"
195#include "openssl/ssl.h"
196#include "openssl/err.h"
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000197#endif /* USE_SSL */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000198
Guido van Rossumbcc20741998-08-04 22:53:56 +0000199#if defined(MS_WINDOWS) || defined(__BEOS__)
200/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000201/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000202#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000203#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000204#endif
205
Fred Drakea04eaad2000-06-30 02:46:07 +0000206/* abstract the socket file descriptor type */
207#ifdef MS_WINDOWS
208typedef SOCKET SOCKET_T;
209# ifdef MS_WIN64
210# define SIZEOF_SOCKET_T 8
211# else
212# define SIZEOF_SOCKET_T 4
213# endif
214#else
215typedef int SOCKET_T;
216# define SIZEOF_SOCKET_T SIZEOF_INT
217#endif
218
219
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000220#if defined(PYOS_OS2)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000221#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000222#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000223#endif
224
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000225#ifndef SOCKETCLOSE
226#define SOCKETCLOSE close
227#endif
228
Guido van Rossum30a685f1991-06-27 15:51:29 +0000229/* Global variable holding the exception type for errors detected
230 by this module (but not argument type or memory errors, etc.). */
231
Guido van Rossum73624e91994-10-10 17:59:00 +0000232static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000233
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000234#ifdef USE_SSL
235static PyObject *SSLErrorObject;
236#endif /* USE_SSL */
237
Guido van Rossum30a685f1991-06-27 15:51:29 +0000238
Guido van Rossum48a680c2001-03-02 06:34:14 +0000239#ifdef RISCOS
240/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
241static int taskwindow;
242#endif
243
244
Guido van Rossum30a685f1991-06-27 15:51:29 +0000245/* Convenience function to raise an error according to errno
246 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000247
Guido van Rossum73624e91994-10-10 17:59:00 +0000248static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000249PySocket_Err(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000250{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000251#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000252 int err_no = WSAGetLastError();
253 if (err_no) {
254 static struct { int no; const char *msg; } *msgp, msgs[] = {
255 { WSAEINTR, "Interrupted system call" },
256 { WSAEBADF, "Bad file descriptor" },
257 { WSAEACCES, "Permission denied" },
258 { WSAEFAULT, "Bad address" },
259 { WSAEINVAL, "Invalid argument" },
260 { WSAEMFILE, "Too many open files" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000261 { WSAEWOULDBLOCK,
Mark Hammond46a733d2000-07-24 01:45:11 +0000262 "The socket operation could not complete "
263 "without blocking" },
264 { WSAEINPROGRESS, "Operation now in progress" },
265 { WSAEALREADY, "Operation already in progress" },
266 { WSAENOTSOCK, "Socket operation on non-socket" },
267 { WSAEDESTADDRREQ, "Destination address required" },
268 { WSAEMSGSIZE, "Message too long" },
269 { WSAEPROTOTYPE, "Protocol wrong type for socket" },
270 { WSAENOPROTOOPT, "Protocol not available" },
271 { WSAEPROTONOSUPPORT, "Protocol not supported" },
272 { WSAESOCKTNOSUPPORT, "Socket type not supported" },
273 { WSAEOPNOTSUPP, "Operation not supported" },
274 { WSAEPFNOSUPPORT, "Protocol family not supported" },
275 { WSAEAFNOSUPPORT, "Address family not supported" },
276 { WSAEADDRINUSE, "Address already in use" },
277 { WSAEADDRNOTAVAIL,
278 "Can't assign requested address" },
279 { WSAENETDOWN, "Network is down" },
280 { WSAENETUNREACH, "Network is unreachable" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000281 { WSAENETRESET,
Mark Hammond46a733d2000-07-24 01:45:11 +0000282 "Network dropped connection on reset" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000283 { WSAECONNABORTED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000284 "Software caused connection abort" },
285 { WSAECONNRESET, "Connection reset by peer" },
286 { WSAENOBUFS, "No buffer space available" },
287 { WSAEISCONN, "Socket is already connected" },
288 { WSAENOTCONN, "Socket is not connected" },
289 { WSAESHUTDOWN, "Can't send after socket shutdown" },
290 { WSAETOOMANYREFS,
291 "Too many references: can't splice" },
292 { WSAETIMEDOUT, "Operation timed out" },
293 { WSAECONNREFUSED, "Connection refused" },
294 { WSAELOOP, "Too many levels of symbolic links" },
295 { WSAENAMETOOLONG, "File name too long" },
296 { WSAEHOSTDOWN, "Host is down" },
297 { WSAEHOSTUNREACH, "No route to host" },
298 { WSAENOTEMPTY, "Directory not empty" },
299 { WSAEPROCLIM, "Too many processes" },
300 { WSAEUSERS, "Too many users" },
301 { WSAEDQUOT, "Disc quota exceeded" },
302 { WSAESTALE, "Stale NFS file handle" },
303 { WSAEREMOTE, "Too many levels of remote in path" },
304 { WSASYSNOTREADY,
305 "Network subsystem is unvailable" },
306 { WSAVERNOTSUPPORTED,
307 "WinSock version is not supported" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000308 { WSANOTINITIALISED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000309 "Successful WSAStartup() not yet performed" },
310 { WSAEDISCON, "Graceful shutdown in progress" },
311 /* Resolver errors */
312 { WSAHOST_NOT_FOUND, "No such host is known" },
313 { WSATRY_AGAIN, "Host not found, or server failed" },
314 { WSANO_RECOVERY,
315 "Unexpected server error encountered" },
316 { WSANO_DATA, "Valid name without requested data" },
317 { WSANO_ADDRESS, "No address, look for MX record" },
318 { 0, NULL }
319 };
Guido van Rossum73624e91994-10-10 17:59:00 +0000320 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000321 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000322
Mark Hammond46a733d2000-07-24 01:45:11 +0000323 for (msgp = msgs; msgp->msg; msgp++) {
324 if (err_no == msgp->no) {
325 msg = msgp->msg;
326 break;
327 }
328 }
329
330 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000331 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000332 PyErr_SetObject(PySocket_Error, v);
333 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000334 }
335 return NULL;
336 }
337 else
338#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000339
340#if defined(PYOS_OS2)
341 if (sock_errno() != NO_ERROR) {
342 APIRET rc;
343 ULONG msglen;
344 char outbuf[100];
345 int myerrorcode = sock_errno();
346
347 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
348 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
349 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
350 if (rc == NO_ERROR) {
351 PyObject *v;
352
353 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
354 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
355 char *lastc = &outbuf[ strlen(outbuf)-1 ];
356 while (lastc > outbuf && isspace(*lastc))
357 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
358 }
359 v = Py_BuildValue("(is)", myerrorcode, outbuf);
360 if (v != NULL) {
361 PyErr_SetObject(PySocket_Error, v);
362 Py_DECREF(v);
363 }
364 return NULL;
365 }
366 }
367#endif
368
Guido van Rossum73624e91994-10-10 17:59:00 +0000369 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000370}
371
Guido van Rossum30a685f1991-06-27 15:51:29 +0000372
373/* The object holding a socket. It holds some extra information,
374 like the address family, which is used to decode socket address
375 arguments properly. */
376
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000377typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000378 PyObject_HEAD
Fred Drakea04eaad2000-06-30 02:46:07 +0000379 SOCKET_T sock_fd; /* Socket file descriptor */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000380 int sock_family; /* Address family, e.g., AF_INET */
381 int sock_type; /* Socket type, e.g., SOCK_STREAM */
382 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000383 union sock_addr {
384 struct sockaddr_in in;
385#ifdef AF_UNIX
386 struct sockaddr_un un;
387#endif
Jeremy Hylton22308652001-02-02 03:23:09 +0000388#if defined(linux) && defined(AF_PACKET)
389 struct sockaddr_ll ll;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000390#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000391 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000392} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000393
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000394#ifdef USE_SSL
Guido van Rossum30a685f1991-06-27 15:51:29 +0000395
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000396typedef struct {
397 PyObject_HEAD
398 PySocketSockObject *Socket; /* Socket on which we're layered */
399 PyObject *x_attr; /* Attributes dictionary */
400 SSL_CTX* ctx;
401 SSL* ssl;
402 X509* server_cert;
403 BIO* sbio;
404 char server[256];
405 char issuer[256];
406
407} SSLObject;
408
409staticforward PyTypeObject SSL_Type;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000410staticforward PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args);
411staticforward PyObject *SSL_SSLread(SSLObject *self, PyObject *args);
412
413#define SSLObject_Check(v) ((v)->ob_type == &SSL_Type)
414
415#endif /* USE_SSL */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000416
Guido van Rossum30a685f1991-06-27 15:51:29 +0000417/* A forward reference to the Socktype type object.
418 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000419 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000420 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000421
Guido van Rossum73624e91994-10-10 17:59:00 +0000422staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000423
Guido van Rossum30a685f1991-06-27 15:51:29 +0000424
425/* Create a new socket object.
426 This just creates the object and initializes it.
427 If the creation fails, return NULL and set an exception (implicit
428 in NEWOBJ()). */
429
Guido van Rossum73624e91994-10-10 17:59:00 +0000430static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000431PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000432{
Guido van Rossum48a680c2001-03-02 06:34:14 +0000433#ifdef RISCOS
434 int block = 1;
435#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000436 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000437 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000438 s = PyObject_New(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000439 if (s != NULL) {
440 s->sock_fd = fd;
441 s->sock_family = family;
442 s->sock_type = type;
443 s->sock_proto = proto;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000444#ifdef RISCOS
445 if(taskwindow) {
446 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
447 }
448#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000449 }
450 return s;
451}
452
Guido van Rossum30a685f1991-06-27 15:51:29 +0000453
Guido van Rossum48a680c2001-03-02 06:34:14 +0000454/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000455 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000456#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000457PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000458#endif
459
460
Guido van Rossum30a685f1991-06-27 15:51:29 +0000461/* Convert a string specifying a host name or one of a few symbolic
462 names to a numeric IP address. This usually calls gethostbyname()
463 to do the work; the names "" and "<broadcast>" are special.
464 Return the length (should always be 4 bytes), or negative if
465 an error occurred; then an exception is raised. */
466
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000467static int
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000468setipaddr(char* name, struct sockaddr_in * addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000469{
470 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000471 int d1, d2, d3, d4;
Guido van Rossum955becc1999-03-22 20:14:53 +0000472 int h_length;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000473 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000474#ifdef HAVE_GETHOSTBYNAME_R
475 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000476#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
477 struct hostent_data data;
478#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000479 char buf[1001];
480 int buf_len = (sizeof buf) - 1;
481 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000482#endif
483#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000484 int result;
485#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000486#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000487
Guido van Rossuma376cc51996-12-05 23:43:35 +0000488 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000489 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000490 addr_ret->sin_addr.s_addr = INADDR_ANY;
491 return 4;
492 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000493 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000494 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
495 return 4;
496 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000497 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
498 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
499 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
500 addr_ret->sin_addr.s_addr = htonl(
501 ((long) d1 << 24) | ((long) d2 << 16) |
502 ((long) d3 << 8) | ((long) d4 << 0));
503 return 4;
504 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000505 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000506#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000507#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000508 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &hp, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000509#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000510 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000511#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +0000512 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000513 result = gethostbyname_r(name, &hp_allocated, &data);
514 hp = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000515#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000516#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000517#ifdef USE_GETHOSTBYNAME_LOCK
518 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000519#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000520 hp = gethostbyname(name);
521#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000522 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000523
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000524 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000525#ifdef HAVE_HSTRERROR
Guido van Rossum48a680c2001-03-02 06:34:14 +0000526 /* Let's get real error message to return */
527 extern int h_errno;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000528 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
529#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000530 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000531#endif
Guido van Rossum3baaa131999-03-22 21:44:51 +0000532#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000533 PyThread_release_lock(gethostbyname_lock);
534#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000535 return -1;
536 }
537 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
Guido van Rossum955becc1999-03-22 20:14:53 +0000538 h_length = hp->h_length;
Guido van Rossum3baaa131999-03-22 21:44:51 +0000539#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000540 PyThread_release_lock(gethostbyname_lock);
541#endif
542 return h_length;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000543}
544
Guido van Rossum30a685f1991-06-27 15:51:29 +0000545
Guido van Rossum30a685f1991-06-27 15:51:29 +0000546/* Create a string object representing an IP address.
547 This is always a string of the form 'dd.dd.dd.dd' (with variable
548 size numbers). */
549
Guido van Rossum73624e91994-10-10 17:59:00 +0000550static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000551makeipaddr(struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000552{
553 long x = ntohl(addr->sin_addr.s_addr);
554 char buf[100];
555 sprintf(buf, "%d.%d.%d.%d",
556 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
557 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000558 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000559}
560
561
562/* Create an object representing the given socket address,
563 suitable for passing it back to bind(), connect() etc.
564 The family field of the sockaddr structure is inspected
565 to determine what kind of address it really is. */
566
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000567/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000568static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000569makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000570{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000571 if (addrlen == 0) {
572 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000573 Py_INCREF(Py_None);
574 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000575 }
576
Guido van Rossumbcc20741998-08-04 22:53:56 +0000577#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000578 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000579 addr->sa_family = AF_INET;
580#endif
581
Guido van Rossum30a685f1991-06-27 15:51:29 +0000582 switch (addr->sa_family) {
583
584 case AF_INET:
585 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000586 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000587 PyObject *addrobj = makeipaddr(a);
588 PyObject *ret = NULL;
589 if (addrobj) {
590 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
591 Py_DECREF(addrobj);
592 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000593 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000594 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000595
Guido van Rossumb6775db1994-08-01 11:34:53 +0000596#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000597 case AF_UNIX:
598 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000599 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000600 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000601 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000602#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000603
Jeremy Hylton22308652001-02-02 03:23:09 +0000604#if defined(linux) && defined(AF_PACKET)
605 case AF_PACKET:
606 {
607 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
608 char *ifname = "";
609 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000610 /* need to look up interface name give index */
611 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000612 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000613 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000614 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000615 }
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000616 return Py_BuildValue("shbhs#", ifname, ntohs(a->sll_protocol),
Guido van Rossum48a680c2001-03-02 06:34:14 +0000617 a->sll_pkttype, a->sll_hatype,
618 a->sll_addr, a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000619 }
620#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000621
Guido van Rossum30a685f1991-06-27 15:51:29 +0000622 /* More cases here... */
623
624 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000625 /* If we don't know the address family, don't raise an
626 exception -- return it as a tuple. */
627 return Py_BuildValue("is#",
628 addr->sa_family,
629 addr->sa_data,
630 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000631
Guido van Rossum30a685f1991-06-27 15:51:29 +0000632 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000633}
634
Guido van Rossum30a685f1991-06-27 15:51:29 +0000635
636/* Parse a socket address argument according to the socket object's
637 address family. Return 1 if the address was in the proper format,
638 0 of not. The address is returned through addr_ret, its length
639 through len_ret. */
640
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000641static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000642getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000643 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000644{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000645 switch (s->sock_family) {
646
Guido van Rossumb6775db1994-08-01 11:34:53 +0000647#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000648 case AF_UNIX:
649 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000650 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000651 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000652 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000653 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000654 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000655 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000656 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000657 PyErr_SetString(PySocket_Error,
658 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000659 return 0;
660 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000661 addr->sun_family = AF_UNIX;
662 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000663 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000664 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000665 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000666 return 1;
667 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000668#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000669
Guido van Rossum30a685f1991-06-27 15:51:29 +0000670 case AF_INET:
671 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000672 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000673 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000674 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000675 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000676 if (!PyTuple_Check(args)) {
677 PyErr_Format(PyExc_TypeError,
678 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
679 args->ob_type->tp_name);
680 return 0;
681 }
682 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000683 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000684 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000685 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000686 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000687 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000688 *addr_ret = (struct sockaddr *) addr;
689 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000690 return 1;
691 }
692
Jeremy Hylton22308652001-02-02 03:23:09 +0000693#if defined(linux) && defined(AF_PACKET)
694 case AF_PACKET:
695 {
696 struct sockaddr_ll* addr;
697 struct ifreq ifr;
698 char *interfaceName;
699 int protoNumber;
700 int hatype = 0;
701 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000702 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000703
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000704 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
705 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000706 return 0;
707 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
708 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000709 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
710 PyErr_SetFromErrno(PySocket_Error);
Jeremy Hylton22308652001-02-02 03:23:09 +0000711 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000712 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000713 addr = &(s->sock_addr.ll);
714 addr->sll_family = AF_PACKET;
715 addr->sll_protocol = htons((short)protoNumber);
716 addr->sll_ifindex = ifr.ifr_ifindex;
717 addr->sll_pkttype = pkttype;
718 addr->sll_hatype = hatype;
719 *addr_ret = (struct sockaddr *) addr;
720 *len_ret = sizeof *addr;
721 return 1;
722 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000723#endif
724
725
Guido van Rossum30a685f1991-06-27 15:51:29 +0000726 /* More cases here... */
727
728 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000729 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000730 return 0;
731
732 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000733}
734
Guido van Rossum30a685f1991-06-27 15:51:29 +0000735
Guido van Rossum48a680c2001-03-02 06:34:14 +0000736/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000737 Return 1 if the family is known, 0 otherwise. The length is returned
738 through len_ret. */
739
740static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000741getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000742{
743 switch (s->sock_family) {
744
Guido van Rossumb6775db1994-08-01 11:34:53 +0000745#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000746 case AF_UNIX:
747 {
748 *len_ret = sizeof (struct sockaddr_un);
749 return 1;
750 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000751#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000752
753 case AF_INET:
754 {
755 *len_ret = sizeof (struct sockaddr_in);
756 return 1;
757 }
758
Jeremy Hylton22308652001-02-02 03:23:09 +0000759#if defined(linux) && defined(AF_PACKET)
760 case AF_PACKET:
761 {
762 *len_ret = sizeof (struct sockaddr_ll);
763 return 1;
764 }
765#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000766
Guido van Rossum710e1df1992-06-12 10:39:36 +0000767 /* More cases here... */
768
769 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000770 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000771 return 0;
772
773 }
774}
775
776
Guido van Rossum30a685f1991-06-27 15:51:29 +0000777/* s.accept() method */
778
Guido van Rossum73624e91994-10-10 17:59:00 +0000779static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000780PySocketSock_accept(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000781{
782 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000783 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000784 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000785 PyObject *sock = NULL;
786 PyObject *addr = NULL;
787 PyObject *res = NULL;
788
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000789 if (!PyArg_ParseTuple(args, ":accept"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000790 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000791 if (!getsockaddrlen(s, &addrlen))
792 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000793 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000794 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000795 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000796 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000797#ifdef MS_WINDOWS
798 if (newfd == INVALID_SOCKET)
799#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000800 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000801#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000802 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000803
Guido van Rossum30a685f1991-06-27 15:51:29 +0000804 /* Create the new object with unspecified family,
805 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000806 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000807 s->sock_family,
808 s->sock_type,
809 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000810 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000811 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000812 goto finally;
813 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000814 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000815 addrlen);
816 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +0000817 goto finally;
818
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000819 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000820
821 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000822 Py_XDECREF(sock);
823 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000824 return res;
825}
826
Guido van Rossum82a5c661998-07-07 20:45:43 +0000827static char accept_doc[] =
828"accept() -> (socket object, address info)\n\
829\n\
830Wait for an incoming connection. Return a new socket representing the\n\
831connection, and the address of the client. For IP sockets, the address\n\
832info is a pair (hostaddr, port).";
833
Guido van Rossum30a685f1991-06-27 15:51:29 +0000834
Guido van Rossume4485b01994-09-07 14:32:49 +0000835/* s.setblocking(1 | 0) method */
836
Guido van Rossum73624e91994-10-10 17:59:00 +0000837static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000838PySocketSock_setblocking(PySocketSockObject *s, PyObject *args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000839{
840 int block;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000841#ifndef RISCOS
Guido van Rossum644a12b1997-04-09 19:24:53 +0000842#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000843 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000844#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000845#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000846 if (!PyArg_ParseTuple(args, "i:setblocking", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000847 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000848 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000849#ifdef __BEOS__
850 block = !block;
851 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
852 (void *)(&block), sizeof( int ) );
853#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000854#ifndef RISCOS
Guido van Rossum6f489d91996-06-28 20:15:15 +0000855#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000856#ifdef PYOS_OS2
857 block = !block;
858 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
859#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000860 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
861 if (block)
862 delay_flag &= (~O_NDELAY);
863 else
864 delay_flag |= O_NDELAY;
865 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000866#endif /* !PYOS_OS2 */
867#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000868 block = !block;
869 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000870#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000871#endif /* __BEOS__ */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000872#endif /* RISCOS */
Guido van Rossum73624e91994-10-10 17:59:00 +0000873 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000874
Guido van Rossum73624e91994-10-10 17:59:00 +0000875 Py_INCREF(Py_None);
876 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000877}
Guido van Rossume4485b01994-09-07 14:32:49 +0000878
Guido van Rossum82a5c661998-07-07 20:45:43 +0000879static char setblocking_doc[] =
880"setblocking(flag)\n\
881\n\
882Set the socket to blocking (flag is true) or non-blocking (false).\n\
883This uses the FIONBIO ioctl with the O_NDELAY flag.";
884
Guido van Rossume4485b01994-09-07 14:32:49 +0000885
Guido van Rossum48a680c2001-03-02 06:34:14 +0000886#ifdef RISCOS
887/* s.sleeptaskw(1 | 0) method */
888
889static PyObject *
890PySocketSock_sleeptaskw(PySocketSockObject *s,PyObject *args)
891{
892 int block;
893 int delay_flag;
894 if (!PyArg_GetInt(args, &block))
895 return NULL;
896 Py_BEGIN_ALLOW_THREADS
897 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
898 Py_END_ALLOW_THREADS
899
900 Py_INCREF(Py_None);
901 return Py_None;
902}
903static char sleeptaskw_doc[] =
904"sleeptaskw(flag)\n\
905\n\
906Allow sleeps in taskwindows.";
907#endif
908
909
Guido van Rossumaee08791992-09-08 09:05:33 +0000910/* s.setsockopt() method.
911 With an integer third argument, sets an integer option.
912 With a string third argument, sets an option from a buffer;
913 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000914
Guido van Rossum73624e91994-10-10 17:59:00 +0000915static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000916PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000917{
918 int level;
919 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000920 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000921 char *buf;
922 int buflen;
923 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000924
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000925 if (PyArg_ParseTuple(args, "iii:setsockopt",
926 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000927 buf = (char *) &flag;
928 buflen = sizeof flag;
929 }
930 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000931 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000932 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
933 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000934 return NULL;
935 }
Thomas Wouters334fb892000-07-25 12:56:38 +0000936 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000937 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000938 return PySocket_Err();
939 Py_INCREF(Py_None);
940 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000941}
942
Guido van Rossum82a5c661998-07-07 20:45:43 +0000943static char setsockopt_doc[] =
944"setsockopt(level, option, value)\n\
945\n\
946Set a socket option. See the Unix manual for level and option.\n\
947The value argument can either be an integer or a string.";
948
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000949
Guido van Rossumaee08791992-09-08 09:05:33 +0000950/* s.getsockopt() method.
951 With two arguments, retrieves an integer option.
952 With a third integer argument, retrieves a string buffer of that size;
953 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000954
Guido van Rossum73624e91994-10-10 17:59:00 +0000955static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000956PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000957{
958 int level;
959 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000960 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000961 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000962 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000963
Guido van Rossumbcc20741998-08-04 22:53:56 +0000964#ifdef __BEOS__
965/* We have incomplete socket support. */
966 PyErr_SetString( PySocket_Error, "getsockopt not supported" );
967 return NULL;
968#else
969
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000970 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
971 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +0000972 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000973
Guido van Rossumbe32c891996-06-20 16:25:29 +0000974 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000975 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000976 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000977 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +0000978 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000979 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000980 return PySocket_Err();
981 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000982 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000983 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000984 PyErr_SetString(PySocket_Error,
985 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000986 return NULL;
987 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000988 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000989 if (buf == NULL)
990 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000991 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +0000992 (void *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000993 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000994 Py_DECREF(buf);
995 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000996 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000997 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000998 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000999#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001000}
1001
Guido van Rossum82a5c661998-07-07 20:45:43 +00001002static char getsockopt_doc[] =
1003"getsockopt(level, option[, buffersize]) -> value\n\
1004\n\
1005Get a socket option. See the Unix manual for level and option.\n\
1006If a nonzero buffersize argument is given, the return value is a\n\
1007string of that length; otherwise it is an integer.";
1008
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001009
Fred Drake728819a2000-07-01 03:40:12 +00001010/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001011
Guido van Rossum73624e91994-10-10 17:59:00 +00001012static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001013PySocketSock_bind(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001014{
1015 struct sockaddr *addr;
1016 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001017 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001018 PyObject *addro;
1019 if (!PyArg_ParseTuple(args, "O:bind", &addro))
1020 return NULL;
1021 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001022 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001023 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001024 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001025 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001026 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001027 return PySocket_Err();
1028 Py_INCREF(Py_None);
1029 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001030}
1031
Guido van Rossum82a5c661998-07-07 20:45:43 +00001032static char bind_doc[] =
1033"bind(address)\n\
1034\n\
1035Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001036pair (host, port); the host must refer to the local host. For raw packet\n\
1037sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001038
Guido van Rossum30a685f1991-06-27 15:51:29 +00001039
1040/* s.close() method.
1041 Set the file descriptor to -1 so operations tried subsequently
1042 will surely fail. */
1043
Guido van Rossum73624e91994-10-10 17:59:00 +00001044static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001045PySocketSock_close(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001046{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001047 SOCKET_T fd;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001048 if (!PyArg_ParseTuple(args, ":close"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001049 return NULL;
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001050 if ((fd = s->sock_fd) != -1) {
1051 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001052 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001053 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001054 Py_END_ALLOW_THREADS
1055 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001056 Py_INCREF(Py_None);
1057 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001058}
1059
Guido van Rossum82a5c661998-07-07 20:45:43 +00001060static char close_doc[] =
1061"close()\n\
1062\n\
1063Close the socket. It cannot be used after this call.";
1064
Guido van Rossum30a685f1991-06-27 15:51:29 +00001065
Fred Drake728819a2000-07-01 03:40:12 +00001066/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001067
Guido van Rossum73624e91994-10-10 17:59:00 +00001068static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001069PySocketSock_connect(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001070{
1071 struct sockaddr *addr;
1072 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001073 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001074 PyObject *addro;
1075 if (!PyArg_ParseTuple(args, "O:connect", &addro))
1076 return NULL;
1077 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001078 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001079 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001080 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001081 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001082 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001083 return PySocket_Err();
1084 Py_INCREF(Py_None);
1085 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001086}
1087
Guido van Rossum82a5c661998-07-07 20:45:43 +00001088static char connect_doc[] =
1089"connect(address)\n\
1090\n\
1091Connect the socket to a remote address. For IP sockets, the address\n\
1092is a pair (host, port).";
1093
Guido van Rossum30a685f1991-06-27 15:51:29 +00001094
Fred Drake728819a2000-07-01 03:40:12 +00001095/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001096
1097static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001098PySocketSock_connect_ex(PySocketSockObject *s, PyObject *args)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001099{
1100 struct sockaddr *addr;
1101 int addrlen;
1102 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001103 PyObject *addro;
1104 if (!PyArg_ParseTuple(args, "O:connect_ex", &addro))
1105 return NULL;
1106 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001107 return NULL;
1108 Py_BEGIN_ALLOW_THREADS
1109 res = connect(s->sock_fd, addr, addrlen);
1110 Py_END_ALLOW_THREADS
1111 if (res != 0)
1112 res = errno;
1113 return PyInt_FromLong((long) res);
1114}
1115
Guido van Rossum82a5c661998-07-07 20:45:43 +00001116static char connect_ex_doc[] =
1117"connect_ex(address)\n\
1118\n\
1119This is like connect(address), but returns an error code (the errno value)\n\
1120instead of raising an exception when an error occurs.";
1121
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001122
Guido van Rossumed233a51992-06-23 09:07:03 +00001123/* s.fileno() method */
1124
Guido van Rossum73624e91994-10-10 17:59:00 +00001125static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001126PySocketSock_fileno(PySocketSockObject *s, PyObject *args)
Guido van Rossumed233a51992-06-23 09:07:03 +00001127{
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001128 if (!PyArg_ParseTuple(args, ":fileno"))
Guido van Rossumed233a51992-06-23 09:07:03 +00001129 return NULL;
Fred Drakea04eaad2000-06-30 02:46:07 +00001130#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001131 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001132#else
1133 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1134#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001135}
1136
Guido van Rossum82a5c661998-07-07 20:45:43 +00001137static char fileno_doc[] =
1138"fileno() -> integer\n\
1139\n\
1140Return the integer file descriptor of the socket.";
1141
Guido van Rossumed233a51992-06-23 09:07:03 +00001142
Guido van Rossumbe32c891996-06-20 16:25:29 +00001143#ifndef NO_DUP
1144/* s.dup() method */
1145
1146static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001147PySocketSock_dup(PySocketSockObject *s, PyObject *args)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001148{
Fred Drakea04eaad2000-06-30 02:46:07 +00001149 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001150 PyObject *sock;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001151 if (!PyArg_ParseTuple(args, ":dup"))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001152 return NULL;
1153 newfd = dup(s->sock_fd);
1154 if (newfd < 0)
1155 return PySocket_Err();
1156 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001157 s->sock_family,
1158 s->sock_type,
1159 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001160 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001161 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001162 return sock;
1163}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001164
1165static char dup_doc[] =
1166"dup() -> socket object\n\
1167\n\
1168Return a new socket object connected to the same system resource.";
1169
Guido van Rossumbe32c891996-06-20 16:25:29 +00001170#endif
1171
1172
Guido van Rossumc89705d1992-11-26 08:54:07 +00001173/* s.getsockname() method */
1174
Guido van Rossum73624e91994-10-10 17:59:00 +00001175static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001176PySocketSock_getsockname(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001177{
1178 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001179 int res;
1180 socklen_t addrlen;
1181
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001182 if (!PyArg_ParseTuple(args, ":getsockname"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001183 return NULL;
1184 if (!getsockaddrlen(s, &addrlen))
1185 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001186 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001187 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001188 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001189 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001190 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001191 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001192 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001193}
1194
Guido van Rossum82a5c661998-07-07 20:45:43 +00001195static char getsockname_doc[] =
1196"getsockname() -> address info\n\
1197\n\
1198Return the address of the local endpoint. For IP sockets, the address\n\
1199info is a pair (hostaddr, port).";
1200
Guido van Rossumc89705d1992-11-26 08:54:07 +00001201
Guido van Rossumb6775db1994-08-01 11:34:53 +00001202#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001203/* s.getpeername() method */
1204
Guido van Rossum73624e91994-10-10 17:59:00 +00001205static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001206PySocketSock_getpeername(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001207{
1208 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001209 int res;
1210 socklen_t addrlen;
1211
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001212 if (!PyArg_ParseTuple(args, ":getpeername"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001213 return NULL;
1214 if (!getsockaddrlen(s, &addrlen))
1215 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001216 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001217 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001218 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001219 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001220 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001221 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001222 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001223}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001224
1225static char getpeername_doc[] =
1226"getpeername() -> address info\n\
1227\n\
1228Return the address of the remote endpoint. For IP sockets, the address\n\
1229info is a pair (hostaddr, port).";
1230
Guido van Rossumb6775db1994-08-01 11:34:53 +00001231#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001232
1233
Guido van Rossum30a685f1991-06-27 15:51:29 +00001234/* s.listen(n) method */
1235
Guido van Rossum73624e91994-10-10 17:59:00 +00001236static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001237PySocketSock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001238{
1239 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001240 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001241 if (!PyArg_ParseTuple(args, "i:listen", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001242 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001243 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001244 if (backlog < 1)
1245 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001246 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001247 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001248 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001249 return PySocket_Err();
1250 Py_INCREF(Py_None);
1251 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001252}
1253
Guido van Rossum82a5c661998-07-07 20:45:43 +00001254static char listen_doc[] =
1255"listen(backlog)\n\
1256\n\
1257Enable a server to accept connections. The backlog argument must be at\n\
1258least 1; it specifies the number of unaccepted connection that the system\n\
1259will allow before refusing new connections.";
1260
1261
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001262#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001263/* s.makefile(mode) method.
1264 Create a new open file object referring to a dupped version of
1265 the socket's file descriptor. (The dup() call is necessary so
1266 that the open file and socket objects may be closed independent
1267 of each other.)
1268 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1269
Guido van Rossum73624e91994-10-10 17:59:00 +00001270static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001271PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001272{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001273 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001274 char *mode = "r";
1275 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001276#ifdef MS_WIN32
1277 intptr_t fd;
1278#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001279 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001280#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001281 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001282 PyObject *f;
1283
Guido van Rossum43713e52000-02-29 13:59:29 +00001284 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001285 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001286#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001287 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1288 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001289#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001290 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001291#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001292 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001293 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001294 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001295 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001296 }
1297 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1298 if (f != NULL)
1299 PyFile_SetBufSize(f, bufsize);
1300 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001301}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001302
1303static char makefile_doc[] =
1304"makefile([mode[, buffersize]]) -> file object\n\
1305\n\
1306Return a regular file object corresponding to the socket.\n\
1307The mode and buffersize arguments are as for the built-in open() function.";
1308
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001309#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001310
Guido van Rossum48a680c2001-03-02 06:34:14 +00001311
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001312/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001313
Guido van Rossum73624e91994-10-10 17:59:00 +00001314static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001315PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001316{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001317 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001318 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001319 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001320 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001321 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001322 if (buf == NULL)
1323 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001324 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001325 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001326 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001327 if (n < 0) {
1328 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001329 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001330 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001331 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001332 return NULL;
1333 return buf;
1334}
1335
Guido van Rossum82a5c661998-07-07 20:45:43 +00001336static char recv_doc[] =
1337"recv(buffersize[, flags]) -> data\n\
1338\n\
1339Receive up to buffersize bytes from the socket. For the optional flags\n\
1340argument, see the Unix manual. When no data is available, block until\n\
1341at least one byte is available or until the remote end is closed. When\n\
1342the remote end is closed and all data is read, return the empty string.";
1343
Guido van Rossum30a685f1991-06-27 15:51:29 +00001344
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001345/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001346
Guido van Rossum73624e91994-10-10 17:59:00 +00001347static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001348PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001349{
1350 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001351 PyObject *buf = NULL;
1352 PyObject *addr = NULL;
1353 PyObject *ret = NULL;
1354
Guido van Rossumff3ab422000-04-24 15:16:03 +00001355 int len, n, flags = 0;
1356 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001357 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001358 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001359 if (!getsockaddrlen(s, &addrlen))
1360 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001361 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001362 if (buf == NULL)
1363 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001364 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001365 memset(addrbuf, 0, addrlen);
1366 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001367#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001368#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001369 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001370#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001371 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001372#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001373#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001374 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001375#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001376 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001377 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001378 if (n < 0) {
1379 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001380 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001381 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001382 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001383 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001384
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001385 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001386 goto finally;
1387
Guido van Rossum73624e91994-10-10 17:59:00 +00001388 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001389 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001390 Py_XDECREF(addr);
1391 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001392 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001393}
1394
Guido van Rossum82a5c661998-07-07 20:45:43 +00001395static char recvfrom_doc[] =
1396"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1397\n\
1398Like recv(buffersize, flags) but also return the sender's address info.";
1399
Guido van Rossum30a685f1991-06-27 15:51:29 +00001400
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001401/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001402
Guido van Rossum73624e91994-10-10 17:59:00 +00001403static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001404PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001405{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001406 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001407 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001408 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001409 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001410 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001411 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001412 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001413 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001414 return PySocket_Err();
1415 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001416}
1417
Guido van Rossum82a5c661998-07-07 20:45:43 +00001418static char send_doc[] =
1419"send(data[, flags])\n\
1420\n\
1421Send a data string to the socket. For the optional flags\n\
1422argument, see the Unix manual.";
1423
Guido van Rossum30a685f1991-06-27 15:51:29 +00001424
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001425/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001426
Guido van Rossum73624e91994-10-10 17:59:00 +00001427static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001428PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001429{
Guido van Rossum73624e91994-10-10 17:59:00 +00001430 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001431 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001432 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001433 int addrlen, len, n, flags;
1434 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001435 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001436 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001437 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1438 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001439 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001440 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001441 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001442 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001443 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001444 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001445 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001446 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001447 return PySocket_Err();
1448 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001449}
1450
Guido van Rossum82a5c661998-07-07 20:45:43 +00001451static char sendto_doc[] =
1452"sendto(data[, flags], address)\n\
1453\n\
1454Like send(data, flags) but allows specifying the destination address.\n\
1455For IP sockets, the address is a pair (hostaddr, port).";
1456
Guido van Rossum30a685f1991-06-27 15:51:29 +00001457
1458/* s.shutdown(how) method */
1459
Guido van Rossum73624e91994-10-10 17:59:00 +00001460static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001461PySocketSock_shutdown(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001462{
1463 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001464 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001465 if (!PyArg_ParseTuple(args, "i:shutdown", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001466 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001467 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001468 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001469 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001470 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001471 return PySocket_Err();
1472 Py_INCREF(Py_None);
1473 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001474}
1475
Guido van Rossum82a5c661998-07-07 20:45:43 +00001476static char shutdown_doc[] =
1477"shutdown(flag)\n\
1478\n\
1479Shut down the reading side of the socket (flag == 0), the writing side\n\
1480of the socket (flag == 1), or both ends (flag == 2).";
1481
Guido van Rossum30a685f1991-06-27 15:51:29 +00001482
1483/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001484
Guido van Rossum73624e91994-10-10 17:59:00 +00001485static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001486 {"accept", (PyCFunction)PySocketSock_accept, METH_VARARGS,
1487 accept_doc},
1488 {"bind", (PyCFunction)PySocketSock_bind, METH_VARARGS,
1489 bind_doc},
1490 {"close", (PyCFunction)PySocketSock_close, METH_VARARGS,
1491 close_doc},
1492 {"connect", (PyCFunction)PySocketSock_connect, METH_VARARGS,
1493 connect_doc},
1494 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_VARARGS,
1495 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001496#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001497 {"dup", (PyCFunction)PySocketSock_dup, METH_VARARGS,
1498 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001499#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001500 {"fileno", (PyCFunction)PySocketSock_fileno, METH_VARARGS,
1501 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001502#ifdef HAVE_GETPEERNAME
Guido van Rossum48a680c2001-03-02 06:34:14 +00001503 {"getpeername", (PyCFunction)PySocketSock_getpeername, METH_VARARGS,
1504 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001505#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001506 {"getsockname", (PyCFunction)PySocketSock_getsockname, METH_VARARGS,
1507 getsockname_doc},
1508 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1509 getsockopt_doc},
1510 {"listen", (PyCFunction)PySocketSock_listen, METH_VARARGS,
1511 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001512#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001513 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1514 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001515#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001516 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1517 recv_doc},
1518 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1519 recvfrom_doc},
1520 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1521 send_doc},
1522 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1523 sendto_doc},
1524 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_VARARGS,
1525 setblocking_doc},
1526 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1527 setsockopt_doc},
1528 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_VARARGS,
1529 shutdown_doc},
1530#ifdef RISCOS
1531 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1532 sleeptaskw_doc},
1533#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001534 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001535};
1536
Guido van Rossum30a685f1991-06-27 15:51:29 +00001537
Guido van Rossum73624e91994-10-10 17:59:00 +00001538/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001539 First close the file description. */
1540
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001541static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001542PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001543{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001544 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001545 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001546 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001547}
1548
Guido van Rossum30a685f1991-06-27 15:51:29 +00001549
1550/* Return a socket object's named attribute. */
1551
Guido van Rossum73624e91994-10-10 17:59:00 +00001552static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001553PySocketSock_getattr(PySocketSockObject *s, char *name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001554{
Guido van Rossum73624e91994-10-10 17:59:00 +00001555 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001556}
1557
Guido van Rossum30a685f1991-06-27 15:51:29 +00001558
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001559static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001560PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001561{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001562 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001563#if SIZEOF_SOCKET_T > SIZEOF_LONG
1564 if (s->sock_fd > LONG_MAX) {
1565 /* this can occur on Win64, and actually there is a special
1566 ugly printf formatter for decimal pointer length integer
1567 printing, only bother if necessary*/
1568 PyErr_SetString(PyExc_OverflowError,
1569 "no printf formatter to display the socket descriptor in decimal");
1570 return NULL;
1571 }
1572#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001573 sprintf(buf,
1574 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
Fred Drakea04eaad2000-06-30 02:46:07 +00001575 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001576 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001577}
1578
1579
Guido van Rossumb6775db1994-08-01 11:34:53 +00001580/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001581
Guido van Rossum73624e91994-10-10 17:59:00 +00001582static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001583 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001584 0,
1585 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001586 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001587 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001588 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001589 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001590 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001591 0, /*tp_setattr*/
1592 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001593 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001594 0, /*tp_as_number*/
1595 0, /*tp_as_sequence*/
1596 0, /*tp_as_mapping*/
1597};
1598
Guido van Rossum30a685f1991-06-27 15:51:29 +00001599
Guido van Rossum81194471991-07-27 21:42:02 +00001600/* Python interface to gethostname(). */
1601
1602/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001603static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001604PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001605{
1606 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001607 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001608 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001609 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001610 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001611 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001612 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001613 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001614 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001615 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001616 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001617}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001618
Guido van Rossum82a5c661998-07-07 20:45:43 +00001619static char gethostname_doc[] =
1620"gethostname() -> string\n\
1621\n\
1622Return the current host name.";
1623
Guido van Rossumff4949e1992-08-05 19:58:53 +00001624
Guido van Rossum30a685f1991-06-27 15:51:29 +00001625/* Python interface to gethostbyname(name). */
1626
1627/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001628static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001629PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001630{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001631 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001632 struct sockaddr_in addrbuf;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001633 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001634 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001635 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001636 return NULL;
1637 return makeipaddr(&addrbuf);
1638}
1639
Guido van Rossum82a5c661998-07-07 20:45:43 +00001640static char gethostbyname_doc[] =
1641"gethostbyname(host) -> address\n\
1642\n\
1643Return the IP address (a string of the form '255.255.255.255') for a host.";
1644
1645
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001646/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1647
1648static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001649gethost_common(struct hostent *h, struct sockaddr_in *addr)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001650{
1651 char **pch;
1652 PyObject *rtn_tuple = (PyObject *)NULL;
1653 PyObject *name_list = (PyObject *)NULL;
1654 PyObject *addr_list = (PyObject *)NULL;
1655 PyObject *tmp;
1656 if (h == NULL) {
1657#ifdef HAVE_HSTRERROR
Guido van Rossum48a680c2001-03-02 06:34:14 +00001658 /* Let's get real error message to return */
1659 extern int h_errno;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001660 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1661#else
1662 PyErr_SetString(PySocket_Error, "host not found");
1663#endif
1664 return NULL;
1665 }
1666 if ((name_list = PyList_New(0)) == NULL)
1667 goto err;
1668 if ((addr_list = PyList_New(0)) == NULL)
1669 goto err;
1670 for (pch = h->h_aliases; *pch != NULL; pch++) {
1671 int status;
1672 tmp = PyString_FromString(*pch);
1673 if (tmp == NULL)
1674 goto err;
1675 status = PyList_Append(name_list, tmp);
1676 Py_DECREF(tmp);
1677 if (status)
1678 goto err;
1679 }
1680 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1681 int status;
1682 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1683 tmp = makeipaddr(addr);
1684 if (tmp == NULL)
1685 goto err;
1686 status = PyList_Append(addr_list, tmp);
1687 Py_DECREF(tmp);
1688 if (status)
1689 goto err;
1690 }
1691 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1692 err:
1693 Py_XDECREF(name_list);
1694 Py_XDECREF(addr_list);
1695 return rtn_tuple;
1696}
1697
1698
1699/* Python interface to gethostbyname_ex(name). */
1700
1701/*ARGSUSED*/
1702static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001703PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001704{
1705 char *name;
1706 struct hostent *h;
1707 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001708 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001709#ifdef HAVE_GETHOSTBYNAME_R
1710 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001711#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1712 struct hostent_data data;
1713#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001714 char buf[16384];
1715 int buf_len = (sizeof buf) - 1;
1716 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001717#endif
1718#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001719 int result;
1720#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001721#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001722 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001723 return NULL;
1724 if (setipaddr(name, &addr) < 0)
1725 return NULL;
1726 Py_BEGIN_ALLOW_THREADS
1727#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001728#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001729 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001730#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001731 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001732#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001733 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001734 result = gethostbyname_r(name, &hp_allocated, &data);
1735 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001736#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001737#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001738#ifdef USE_GETHOSTBYNAME_LOCK
1739 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001740#endif
1741 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001742#endif /* HAVE_GETHOSTBYNAME_R */
1743 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001744 ret = gethost_common(h, &addr);
1745#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001746 PyThread_release_lock(gethostbyname_lock);
1747#endif
1748 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001749}
1750
1751static char ghbn_ex_doc[] =
1752"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1753\n\
1754Return the true host name, a list of aliases, and a list of IP addresses,\n\
1755for a host. The host argument is a string giving a host name or IP number.";
1756
1757
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001758/* Python interface to gethostbyaddr(IP). */
1759
1760/*ARGSUSED*/
1761static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001762PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001763{
Guido van Rossum48a680c2001-03-02 06:34:14 +00001764 struct sockaddr_in addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001765 char *ip_num;
1766 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001767 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001768#ifdef HAVE_GETHOSTBYNAME_R
1769 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001770#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1771 struct hostent_data data;
1772#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001773 char buf[16384];
1774 int buf_len = (sizeof buf) - 1;
1775 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001776#endif
1777#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001778 int result;
1779#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001780#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001781
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001782 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001783 return NULL;
1784 if (setipaddr(ip_num, &addr) < 0)
1785 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001786 Py_BEGIN_ALLOW_THREADS
1787#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001788#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001789 result = gethostbyaddr_r((char *)&addr.sin_addr,
1790 sizeof(addr.sin_addr),
1791 AF_INET, &hp_allocated, buf, buf_len,
1792 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001793#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001794 h = gethostbyaddr_r((char *)&addr.sin_addr,
1795 sizeof(addr.sin_addr),
Guido van Rossum48a680c2001-03-02 06:34:14 +00001796 AF_INET,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001797 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001798#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001799 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001800 result = gethostbyaddr_r((char *)&addr.sin_addr,
1801 sizeof(addr.sin_addr),
1802 AF_INET, &hp_allocated, &data);
1803 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001804#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001805#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001806#ifdef USE_GETHOSTBYNAME_LOCK
1807 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001808#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001809 h = gethostbyaddr((char *)&addr.sin_addr,
1810 sizeof(addr.sin_addr),
1811 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001812#endif /* HAVE_GETHOSTBYNAME_R */
1813 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001814 ret = gethost_common(h, &addr);
1815#ifdef USE_GETHOSTBYNAME_LOCK
1816 PyThread_release_lock(gethostbyname_lock);
1817#endif
1818 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001819}
1820
Guido van Rossum82a5c661998-07-07 20:45:43 +00001821static char gethostbyaddr_doc[] =
1822"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1823\n\
1824Return the true host name, a list of aliases, and a list of IP addresses,\n\
1825for a host. The host argument is a string giving a host name or IP number.";
1826
Guido van Rossum30a685f1991-06-27 15:51:29 +00001827
1828/* Python interface to getservbyname(name).
1829 This only returns the port number, since the other info is already
1830 known or not useful (like the list of aliases). */
1831
1832/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001833static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001834PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001835{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001836 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001837 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001838 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001839 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001840 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001841 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001842 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001843 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001844 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001845 return NULL;
1846 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001847 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001848}
1849
Guido van Rossum82a5c661998-07-07 20:45:43 +00001850static char getservbyname_doc[] =
1851"getservbyname(servicename, protocolname) -> integer\n\
1852\n\
1853Return a port number from a service name and protocol name.\n\
1854The protocol name should be 'tcp' or 'udp'.";
1855
Guido van Rossum30a685f1991-06-27 15:51:29 +00001856
Guido van Rossum3901d851996-12-19 16:35:04 +00001857/* Python interface to getprotobyname(name).
1858 This only returns the protocol number, since the other info is
1859 already known or not useful (like the list of aliases). */
1860
1861/*ARGSUSED*/
1862static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001863PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00001864{
1865 char *name;
1866 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001867#ifdef __BEOS__
1868/* Not available in BeOS yet. - [cjh] */
1869 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1870 return NULL;
1871#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001872 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00001873 return NULL;
1874 Py_BEGIN_ALLOW_THREADS
1875 sp = getprotobyname(name);
1876 Py_END_ALLOW_THREADS
1877 if (sp == NULL) {
1878 PyErr_SetString(PySocket_Error, "protocol not found");
1879 return NULL;
1880 }
1881 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001882#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001883}
1884
Guido van Rossum82a5c661998-07-07 20:45:43 +00001885static char getprotobyname_doc[] =
1886"getprotobyname(name) -> integer\n\
1887\n\
1888Return the protocol number for the named protocol. (Rarely used.)";
1889
Guido van Rossum3901d851996-12-19 16:35:04 +00001890
Guido van Rossum30a685f1991-06-27 15:51:29 +00001891/* Python interface to socket(family, type, proto).
1892 The third (protocol) argument is optional.
1893 Return a new socket object. */
1894
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001895/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001896static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001897PySocket_socket(PyObject *self, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001898{
Guido van Rossum73624e91994-10-10 17:59:00 +00001899 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001900 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001901 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001902 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001903 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001904 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001905 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001906 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001907#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001908 if (fd == INVALID_SOCKET)
1909#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001910 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001911#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001912 return PySocket_Err();
1913 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001914 /* If the object can't be created, don't forget to close the
1915 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001916 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001917 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001918 /* From now on, ignore SIGPIPE and let the error checking
1919 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001920#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001921 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00001922#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001923 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001924}
1925
Guido van Rossum82a5c661998-07-07 20:45:43 +00001926static char socket_doc[] =
1927"socket(family, type[, proto]) -> socket object\n\
1928\n\
1929Open a socket of the given type. The family argument specifies the\n\
1930address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1931The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1932or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1933specifying the default protocol.";
1934
1935
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001936#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001937/* Create a socket object from a numeric file description.
1938 Useful e.g. if stdin is a socket.
1939 Additional arguments as for socket(). */
1940
1941/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001942static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001943PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001944{
Guido van Rossum73624e91994-10-10 17:59:00 +00001945 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001946 SOCKET_T fd;
1947 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001948 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
1949 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001950 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001951 /* Dup the fd so it and the socket can be closed independently */
1952 fd = dup(fd);
1953 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001954 return PySocket_Err();
1955 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001956 /* From now on, ignore SIGPIPE and let the error checking
1957 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001958#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001959 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00001960#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001961 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001962}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001963
1964static char fromfd_doc[] =
1965"fromfd(fd, family, type[, proto]) -> socket object\n\
1966\n\
1967Create a socket object from the given file descriptor.\n\
1968The remaining arguments are the same as for socket().";
1969
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001970#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001971
Guido van Rossum82a5c661998-07-07 20:45:43 +00001972
Guido van Rossum006bf911996-06-12 04:04:55 +00001973static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001974PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001975{
1976 int x1, x2;
1977
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001978 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001979 return NULL;
1980 }
1981 x2 = (int)ntohs((short)x1);
1982 return PyInt_FromLong(x2);
1983}
1984
Guido van Rossum82a5c661998-07-07 20:45:43 +00001985static char ntohs_doc[] =
1986"ntohs(integer) -> integer\n\
1987\n\
1988Convert a 16-bit integer from network to host byte order.";
1989
1990
Guido van Rossum006bf911996-06-12 04:04:55 +00001991static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001992PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001993{
1994 int x1, x2;
1995
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001996 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001997 return NULL;
1998 }
1999 x2 = ntohl(x1);
2000 return PyInt_FromLong(x2);
2001}
2002
Guido van Rossum82a5c661998-07-07 20:45:43 +00002003static char ntohl_doc[] =
2004"ntohl(integer) -> integer\n\
2005\n\
2006Convert a 32-bit integer from network to host byte order.";
2007
2008
Guido van Rossum006bf911996-06-12 04:04:55 +00002009static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002010PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002011{
2012 int x1, x2;
2013
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002014 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002015 return NULL;
2016 }
2017 x2 = (int)htons((short)x1);
2018 return PyInt_FromLong(x2);
2019}
2020
Guido van Rossum82a5c661998-07-07 20:45:43 +00002021static char htons_doc[] =
2022"htons(integer) -> integer\n\
2023\n\
2024Convert a 16-bit integer from host to network byte order.";
2025
2026
Guido van Rossum006bf911996-06-12 04:04:55 +00002027static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002028PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002029{
2030 int x1, x2;
2031
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002032 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002033 return NULL;
2034 }
2035 x2 = htonl(x1);
2036 return PyInt_FromLong(x2);
2037}
2038
Guido van Rossum82a5c661998-07-07 20:45:43 +00002039static char htonl_doc[] =
2040"htonl(integer) -> integer\n\
2041\n\
2042Convert a 32-bit integer from host to network byte order.";
2043
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002044/*
2045 * socket.inet_aton() and socket.inet_ntoa() functions
2046 *
2047 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2048 *
2049 */
2050
Guido van Rossum48a680c2001-03-02 06:34:14 +00002051static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002052"inet_aton(string) -> packed 32-bit IP representation\n\
2053\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002054Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002055binary format used in low-level network functions.";
2056
2057static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002058PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002059{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002060#ifndef INADDR_NONE
2061#define INADDR_NONE (-1)
2062#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002063
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002064 /* Have to use inet_addr() instead */
2065 char *ip_addr;
2066 long packed_addr;
2067
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002068 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002069 return NULL;
2070 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00002071#ifdef USE_GUSI1
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002072 packed_addr = (long)inet_addr(ip_addr).s_addr;
2073#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002074 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002075#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002076
2077 if (packed_addr == INADDR_NONE) { /* invalid address */
2078 PyErr_SetString(PySocket_Error,
2079 "illegal IP address string passed to inet_aton");
2080 return NULL;
2081 }
2082
2083 return PyString_FromStringAndSize((char *) &packed_addr,
2084 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002085}
2086
Guido van Rossum48a680c2001-03-02 06:34:14 +00002087static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002088"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002089\n\
2090Convert an IP address from 32-bit packed binary format to string format";
2091
2092static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002093PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002094{
2095 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002096 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002097 struct in_addr packed_addr;
2098
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002099 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002100 return NULL;
2101 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002102
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002103 if (addr_len != sizeof(packed_addr)) {
2104 PyErr_SetString(PySocket_Error,
2105 "packed IP wrong length for inet_ntoa");
2106 return NULL;
2107 }
2108
2109 memcpy(&packed_addr, packed_str, addr_len);
2110
2111 return PyString_FromString(inet_ntoa(packed_addr));
2112}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002113
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002114
2115#ifdef USE_SSL
2116
2117/* This is a C function to be called for new object initialization */
2118static SSLObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002119newSSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002120{
2121 SSLObject *self;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002122
Guido van Rossumb18618d2000-05-03 23:44:39 +00002123 self = PyObject_New(SSLObject, &SSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002124 if (self == NULL){
2125 PyErr_SetObject(SSLErrorObject,
2126 PyString_FromString("newSSLObject error"));
2127 return NULL;
2128 }
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002129 memset(self->server, '\0', sizeof(char) * 256);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002130 memset(self->issuer, '\0', sizeof(char) * 256);
2131
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002132 self->x_attr = PyDict_New();
2133 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
2134 if (self->ctx == NULL) {
2135 PyErr_SetObject(SSLErrorObject,
2136 PyString_FromString("SSL_CTX_new error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002137 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002138 return NULL;
2139 }
2140
2141 if ( (key_file && !cert_file) || (!key_file && cert_file) )
2142 {
2143 PyErr_SetObject(SSLErrorObject,
2144 PyString_FromString(
2145 "Both the key & certificate files must be specified"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002146 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002147 return NULL;
2148 }
2149
2150 if (key_file && cert_file)
2151 {
2152 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
2153 SSL_FILETYPE_PEM) < 1)
2154 {
2155 PyErr_SetObject(SSLErrorObject,
2156 PyString_FromString(
2157 "SSL_CTX_use_PrivateKey_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002158 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002159 return NULL;
2160 }
2161
2162 if (SSL_CTX_use_certificate_chain_file(self->ctx,
2163 cert_file) < 1)
2164 {
2165 PyErr_SetObject(SSLErrorObject,
2166 PyString_FromString(
2167 "SSL_CTX_use_certificate_chain_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002168 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002169 return NULL;
2170 }
2171 }
2172
2173 SSL_CTX_set_verify(self->ctx,
2174 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2175 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2176 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2177 SSL_set_connect_state(self->ssl);
2178
2179 if ((SSL_connect(self->ssl)) == -1) {
2180 /* Actually negotiate SSL connection */
2181 PyErr_SetObject(SSLErrorObject,
2182 PyString_FromString("SSL_connect error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002183 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002184 return NULL;
2185 }
2186 self->ssl->debug = 1;
2187
2188 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2189 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
2190 self->server, 256);
2191 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2192 self->issuer, 256);
2193 }
2194 self->x_attr = NULL;
2195 self->Socket = Sock;
2196 Py_INCREF(self->Socket);
2197 return self;
2198}
2199
2200/* This is the Python function called for new object initialization */
2201static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002202PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002203{
2204 SSLObject *rv;
2205 PySocketSockObject *Sock;
2206 char *key_file;
2207 char *cert_file;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002208
Guido van Rossum43713e52000-02-29 13:59:29 +00002209 if (!PyArg_ParseTuple(args, "O!zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002210 &PySocketSock_Type, (PyObject*)&Sock,
2211 &key_file, &cert_file) )
2212 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002213
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002214 rv = newSSLObject(Sock, key_file, cert_file);
2215 if ( rv == NULL )
2216 return NULL;
2217 return (PyObject *)rv;
2218}
2219
2220static char ssl_doc[] =
2221"ssl(socket, keyfile, certfile) -> sslobject";
2222
2223static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002224SSL_server(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002225{
2226 return PyString_FromString(self->server);
2227}
2228
2229static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002230SSL_issuer(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002231{
2232 return PyString_FromString(self->issuer);
2233}
2234
2235
2236/* SSL object methods */
2237
2238static PyMethodDef SSLMethods[] = {
2239 { "write", (PyCFunction)SSL_SSLwrite, 1 },
2240 { "read", (PyCFunction)SSL_SSLread, 1 },
2241 { "server", (PyCFunction)SSL_server, 1 },
2242 { "issuer", (PyCFunction)SSL_issuer, 1 },
2243 { NULL, NULL}
2244};
2245
2246static void SSL_dealloc(SSLObject *self)
2247{
2248 if (self->server_cert) /* Possible not to have one? */
2249 X509_free (self->server_cert);
2250 SSL_CTX_free(self->ctx);
2251 SSL_free(self->ssl);
2252 Py_XDECREF(self->x_attr);
2253 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002254 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002255}
2256
2257static PyObject *SSL_getattr(SSLObject *self, char *name)
2258{
2259 return Py_FindMethod(SSLMethods, (PyObject *)self, name);
2260}
2261
2262staticforward PyTypeObject SSL_Type = {
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002263 PyObject_HEAD_INIT(NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002264 0, /*ob_size*/
2265 "SSL", /*tp_name*/
2266 sizeof(SSLObject), /*tp_basicsize*/
2267 0, /*tp_itemsize*/
2268 /* methods */
2269 (destructor)SSL_dealloc, /*tp_dealloc*/
2270 0, /*tp_print*/
2271 (getattrfunc)SSL_getattr, /*tp_getattr*/
2272 0, /*tp_setattr*/
2273 0, /*tp_compare*/
2274 0, /*tp_repr*/
2275 0, /*tp_as_number*/
2276 0, /*tp_as_sequence*/
2277 0, /*tp_as_mapping*/
2278 0, /*tp_hash*/
2279};
2280
2281
2282
2283static PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args)
2284{
2285 char *data;
Andrew M. Kuchlingb38175e2001-02-07 20:41:17 +00002286 size_t len;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002287
Andrew M. Kuchlingb38175e2001-02-07 20:41:17 +00002288 if (!PyArg_ParseTuple(args, "s#:write", &data, &len))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002289 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002290
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002291 len = SSL_write(self->ssl, data, len);
2292 return PyInt_FromLong((long)len);
2293}
2294
2295static PyObject *SSL_SSLread(SSLObject *self, PyObject *args)
2296{
2297 PyObject *buf;
2298 int count = 0;
2299 int len = 1024;
2300 int res;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002301
Guido van Rossum43713e52000-02-29 13:59:29 +00002302 PyArg_ParseTuple(args, "|i:read", &len);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002303
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002304 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2305 return NULL; /* Error object should already be set */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002306
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002307 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2308 res = SSL_get_error(self->ssl, count);
2309
2310 switch (res) {
Jeremy Hylton42dd01a2001-02-01 23:35:20 +00002311 case SSL_ERROR_NONE:
2312 assert(count > 0);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002313 break;
Jeremy Hylton42dd01a2001-02-01 23:35:20 +00002314 case SSL_ERROR_ZERO_RETURN: /* normal EOF */
2315 assert(count == 0);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002316 break;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002317 default:
2318 return PyErr_SetFromErrno(SSLErrorObject);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002319 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002320
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002321 fflush(stderr);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002322
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002323 if (count < 0) {
2324 Py_DECREF(buf);
2325 return PyErr_SetFromErrno(SSLErrorObject);
2326 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002327
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002328 if (count != len && _PyString_Resize(&buf, count) < 0)
2329 return NULL;
2330 return buf;
2331}
2332
2333#endif /* USE_SSL */
2334
2335
Guido van Rossum30a685f1991-06-27 15:51:29 +00002336/* List of functions exported by this module. */
2337
Guido van Rossum73624e91994-10-10 17:59:00 +00002338static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002339 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002340 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002341 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002342 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002343 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002344 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002345 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002346 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002347 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002348 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002349 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002350 METH_VARARGS,getprotobyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002351 {"socket", PySocket_socket,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002352 METH_VARARGS, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002353#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002354 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002355 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002356#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002357 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002358 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002359 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002360 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002361 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002362 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002363 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002364 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002365 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002366 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002367 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002368 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002369#ifdef USE_SSL
Guido van Rossum48a680c2001-03-02 06:34:14 +00002370 {"ssl", PySocket_ssl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002371 METH_VARARGS, ssl_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002372#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002373 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002374};
2375
Guido van Rossum30a685f1991-06-27 15:51:29 +00002376
2377/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002378 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002379 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002380 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002381static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002382insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002383{
Guido van Rossum73624e91994-10-10 17:59:00 +00002384 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002385 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002386 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002387
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002388 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002389}
2390
Guido van Rossum30a685f1991-06-27 15:51:29 +00002391
Guido van Rossum8d665e61996-06-26 18:22:49 +00002392#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002393
2394/* Additional initialization and cleanup for NT/Windows */
2395
2396static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002397NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002398{
2399 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002400}
2401
2402static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002403NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002404{
2405 WSADATA WSAData;
2406 int ret;
2407 char buf[100];
2408 ret = WSAStartup(0x0101, &WSAData);
2409 switch (ret) {
2410 case 0: /* no error */
2411 atexit(NTcleanup);
2412 return 1;
2413 case WSASYSNOTREADY:
2414 PyErr_SetString(PyExc_ImportError,
2415 "WSAStartup failed: network not ready");
2416 break;
2417 case WSAVERNOTSUPPORTED:
2418 case WSAEINVAL:
2419 PyErr_SetString(PyExc_ImportError,
2420 "WSAStartup failed: requested version not supported");
2421 break;
2422 default:
2423 sprintf(buf, "WSAStartup failed: error code %d", ret);
2424 PyErr_SetString(PyExc_ImportError, buf);
2425 break;
2426 }
2427 return 0;
2428}
2429
Guido van Rossum8d665e61996-06-26 18:22:49 +00002430#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002431
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002432#if defined(PYOS_OS2)
2433
2434/* Additional initialization and cleanup for OS/2 */
2435
2436static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002437OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002438{
2439 /* No cleanup is necessary for OS/2 Sockets */
2440}
2441
2442static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002443OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002444{
2445 char reason[64];
2446 int rc = sock_init();
2447
2448 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002449 atexit(OS2cleanup);
2450 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002451 }
2452
2453 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2454 PyErr_SetString(PyExc_ImportError, reason);
2455
Guido van Rossum32c575d1997-12-02 20:37:32 +00002456 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002457}
2458
2459#endif /* PYOS_OS2 */
2460
Guido van Rossum30a685f1991-06-27 15:51:29 +00002461/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002462 * This is called when the first 'import socket' is done,
2463 * via a table in config.c, if config.c is compiled with USE_SOCKET
2464 * defined.
2465 *
2466 * For MS_WINDOWS (which means any Windows variant), this module
2467 * is actually called "_socket", and there's a wrapper "socket.py"
2468 * which implements some missing functionality (such as makefile(),
2469 * dup() and fromfd()). The import of "_socket" may fail with an
2470 * ImportError exception if initialization of WINSOCK fails. When
2471 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2472 * scheduled to be made at exit time.
2473 *
2474 * For OS/2, this module is also called "_socket" and uses a wrapper
2475 * "socket.py" which implements that functionality that is missing
2476 * when PC operating systems don't put socket descriptors in the
2477 * operating system's filesystem layer.
2478 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002479
Guido van Rossum82a5c661998-07-07 20:45:43 +00002480static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00002481"Implementation module for socket operations. See the socket module\n\
2482for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00002483
2484static char sockettype_doc[] =
2485"A socket represents one endpoint of a network connection.\n\
2486\n\
2487Methods:\n\
2488\n\
2489accept() -- accept a connection, returning new socket and client address\n\
2490bind() -- bind the socket to a local address\n\
2491close() -- close the socket\n\
2492connect() -- connect the socket to a remote address\n\
2493connect_ex() -- connect, return an error code instead of an exception \n\
2494dup() -- return a new socket object identical to the current one (*)\n\
2495fileno() -- return underlying file descriptor\n\
2496getpeername() -- return remote address (*)\n\
2497getsockname() -- return local address\n\
2498getsockopt() -- get socket options\n\
2499listen() -- start listening for incoming connections\n\
2500makefile() -- return a file object corresponding tot the socket (*)\n\
2501recv() -- receive data\n\
2502recvfrom() -- receive data and sender's address\n\
2503send() -- send data\n\
2504sendto() -- send data to a given address\n\
2505setblocking() -- set or clear the blocking I/O flag\n\
2506setsockopt() -- set socket options\n\
2507shutdown() -- shut down traffic in one or both directions\n\
2508\n\
2509(*) not available on all platforms!)";
2510
Guido van Rossum3886bb61998-12-04 18:50:17 +00002511DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002512init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002513{
Guido van Rossum73624e91994-10-10 17:59:00 +00002514 PyObject *m, *d;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002515#ifdef RISCOS
2516 _kernel_swi_regs r;
2517 r.r[0]=0;
2518 _kernel_swi(0x43380, &r, &r);
2519 taskwindow = r.r[0];
2520#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00002521#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002522 if (!NTinit())
2523 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002524#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002525#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002526 if (!OS2init())
2527 return;
Fred Drakea136d492000-08-16 14:18:30 +00002528#endif /* __TOS_OS2__ */
2529#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002530#endif /* RISCOS */
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002531#ifdef USE_SSL
2532 SSL_Type.ob_type = &PyType_Type;
2533#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00002534 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00002535 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002536 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2537 if (PySocket_Error == NULL)
2538 return;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002539#ifdef USE_SSL
2540 SSL_load_error_strings();
2541 SSLeay_add_ssl_algorithms();
2542 SSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2543 if (SSLErrorObject == NULL)
2544 return;
2545 PyDict_SetItemString(d, "sslerror", SSLErrorObject);
2546 Py_INCREF(&SSL_Type);
2547 if (PyDict_SetItemString(d, "SSLType",
2548 (PyObject *)&SSL_Type) != 0)
2549 return;
2550#endif /* USE_SSL */
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002551 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002552 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002553 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002554 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002555 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002556 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002557 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002558
2559 /* Address families (we only support AF_INET and AF_UNIX) */
2560#ifdef AF_UNSPEC
2561 insint(d, "AF_UNSPEC", AF_UNSPEC);
2562#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002563 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002564#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002565 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002566#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002567#ifdef AF_AX25
2568 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2569#endif
2570#ifdef AF_IPX
2571 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2572#endif
2573#ifdef AF_APPLETALK
2574 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2575#endif
2576#ifdef AF_NETROM
2577 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2578#endif
2579#ifdef AF_BRIDGE
2580 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2581#endif
2582#ifdef AF_AAL5
2583 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2584#endif
2585#ifdef AF_X25
2586 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2587#endif
2588#ifdef AF_INET6
2589 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2590#endif
2591#ifdef AF_ROSE
2592 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2593#endif
Jeremy Hylton22308652001-02-02 03:23:09 +00002594#if defined(linux) && defined(AF_PACKET)
2595 insint(d, "AF_PACKET", AF_PACKET);
2596 insint(d, "PF_PACKET", PF_PACKET);
2597 insint(d, "PACKET_HOST", PACKET_HOST);
2598 insint(d, "PACKET_BROADCAST", PACKET_BROADCAST);
2599 insint(d, "PACKET_MULTICAST", PACKET_MULTICAST);
2600 insint(d, "PACKET_OTHERHOST", PACKET_OTHERHOST);
2601 insint(d, "PACKET_OUTGOING", PACKET_OUTGOING);
2602 insint(d, "PACKET_LOOPBACK", PACKET_LOOPBACK);
2603 insint(d, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002604#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002605
2606 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002607 insint(d, "SOCK_STREAM", SOCK_STREAM);
2608 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002609#ifndef __BEOS__
2610/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002611 insint(d, "SOCK_RAW", SOCK_RAW);
2612 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2613 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002614#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002615
2616#ifdef SO_DEBUG
2617 insint(d, "SO_DEBUG", SO_DEBUG);
2618#endif
2619#ifdef SO_ACCEPTCONN
2620 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2621#endif
2622#ifdef SO_REUSEADDR
2623 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2624#endif
2625#ifdef SO_KEEPALIVE
2626 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2627#endif
2628#ifdef SO_DONTROUTE
2629 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2630#endif
2631#ifdef SO_BROADCAST
2632 insint(d, "SO_BROADCAST", SO_BROADCAST);
2633#endif
2634#ifdef SO_USELOOPBACK
2635 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2636#endif
2637#ifdef SO_LINGER
2638 insint(d, "SO_LINGER", SO_LINGER);
2639#endif
2640#ifdef SO_OOBINLINE
2641 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2642#endif
2643#ifdef SO_REUSEPORT
2644 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2645#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002646#ifdef SO_SNDBUF
2647 insint(d, "SO_SNDBUF", SO_SNDBUF);
2648#endif
2649#ifdef SO_RCVBUF
2650 insint(d, "SO_RCVBUF", SO_RCVBUF);
2651#endif
2652#ifdef SO_SNDLOWAT
2653 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2654#endif
2655#ifdef SO_RCVLOWAT
2656 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2657#endif
2658#ifdef SO_SNDTIMEO
2659 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2660#endif
2661#ifdef SO_RCVTIMEO
2662 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2663#endif
2664#ifdef SO_ERROR
2665 insint(d, "SO_ERROR", SO_ERROR);
2666#endif
2667#ifdef SO_TYPE
2668 insint(d, "SO_TYPE", SO_TYPE);
2669#endif
2670
2671 /* Maximum number of connections for "listen" */
2672#ifdef SOMAXCONN
2673 insint(d, "SOMAXCONN", SOMAXCONN);
2674#else
2675 insint(d, "SOMAXCONN", 5); /* Common value */
2676#endif
2677
2678 /* Flags for send, recv */
2679#ifdef MSG_OOB
2680 insint(d, "MSG_OOB", MSG_OOB);
2681#endif
2682#ifdef MSG_PEEK
2683 insint(d, "MSG_PEEK", MSG_PEEK);
2684#endif
2685#ifdef MSG_DONTROUTE
2686 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2687#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002688#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00002689 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002690#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002691#ifdef MSG_EOR
2692 insint(d, "MSG_EOR", MSG_EOR);
2693#endif
2694#ifdef MSG_TRUNC
2695 insint(d, "MSG_TRUNC", MSG_TRUNC);
2696#endif
2697#ifdef MSG_CTRUNC
2698 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2699#endif
2700#ifdef MSG_WAITALL
2701 insint(d, "MSG_WAITALL", MSG_WAITALL);
2702#endif
2703#ifdef MSG_BTAG
2704 insint(d, "MSG_BTAG", MSG_BTAG);
2705#endif
2706#ifdef MSG_ETAG
2707 insint(d, "MSG_ETAG", MSG_ETAG);
2708#endif
2709
2710 /* Protocol level and numbers, usable for [gs]etsockopt */
2711#ifdef SOL_SOCKET
2712 insint(d, "SOL_SOCKET", SOL_SOCKET);
2713#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002714#ifdef SOL_IP
2715 insint(d, "SOL_IP", SOL_IP);
2716#else
2717 insint(d, "SOL_IP", 0);
2718#endif
2719#ifdef SOL_IPX
2720 insint(d, "SOL_IPX", SOL_IPX);
2721#endif
2722#ifdef SOL_AX25
2723 insint(d, "SOL_AX25", SOL_AX25);
2724#endif
2725#ifdef SOL_ATALK
2726 insint(d, "SOL_ATALK", SOL_ATALK);
2727#endif
2728#ifdef SOL_NETROM
2729 insint(d, "SOL_NETROM", SOL_NETROM);
2730#endif
2731#ifdef SOL_ROSE
2732 insint(d, "SOL_ROSE", SOL_ROSE);
2733#endif
2734#ifdef SOL_TCP
2735 insint(d, "SOL_TCP", SOL_TCP);
2736#else
2737 insint(d, "SOL_TCP", 6);
2738#endif
2739#ifdef SOL_UDP
2740 insint(d, "SOL_UDP", SOL_UDP);
2741#else
2742 insint(d, "SOL_UDP", 17);
2743#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002744#ifdef IPPROTO_IP
2745 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002746#else
2747 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002748#endif
2749#ifdef IPPROTO_ICMP
2750 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002751#else
2752 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002753#endif
2754#ifdef IPPROTO_IGMP
2755 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2756#endif
2757#ifdef IPPROTO_GGP
2758 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2759#endif
2760#ifdef IPPROTO_TCP
2761 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002762#else
2763 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002764#endif
2765#ifdef IPPROTO_EGP
2766 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2767#endif
2768#ifdef IPPROTO_PUP
2769 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2770#endif
2771#ifdef IPPROTO_UDP
2772 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002773#else
2774 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002775#endif
2776#ifdef IPPROTO_IDP
2777 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2778#endif
2779#ifdef IPPROTO_HELLO
2780 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2781#endif
2782#ifdef IPPROTO_ND
2783 insint(d, "IPPROTO_ND", IPPROTO_ND);
2784#endif
2785#ifdef IPPROTO_TP
2786 insint(d, "IPPROTO_TP", IPPROTO_TP);
2787#endif
2788#ifdef IPPROTO_XTP
2789 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2790#endif
2791#ifdef IPPROTO_EON
2792 insint(d, "IPPROTO_EON", IPPROTO_EON);
2793#endif
2794#ifdef IPPROTO_BIP
2795 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2796#endif
2797/**/
2798#ifdef IPPROTO_RAW
2799 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002800#else
2801 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002802#endif
2803#ifdef IPPROTO_MAX
2804 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2805#endif
2806
2807 /* Some port configuration */
2808#ifdef IPPORT_RESERVED
2809 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2810#else
2811 insint(d, "IPPORT_RESERVED", 1024);
2812#endif
2813#ifdef IPPORT_USERRESERVED
2814 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2815#else
2816 insint(d, "IPPORT_USERRESERVED", 5000);
2817#endif
2818
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002819 /* Some reserved IP v.4 addresses */
2820#ifdef INADDR_ANY
2821 insint(d, "INADDR_ANY", INADDR_ANY);
2822#else
2823 insint(d, "INADDR_ANY", 0x00000000);
2824#endif
2825#ifdef INADDR_BROADCAST
2826 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2827#else
2828 insint(d, "INADDR_BROADCAST", 0xffffffff);
2829#endif
2830#ifdef INADDR_LOOPBACK
2831 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2832#else
2833 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2834#endif
2835#ifdef INADDR_UNSPEC_GROUP
2836 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2837#else
2838 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2839#endif
2840#ifdef INADDR_ALLHOSTS_GROUP
2841 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2842#else
2843 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2844#endif
2845#ifdef INADDR_MAX_LOCAL_GROUP
2846 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2847#else
2848 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2849#endif
2850#ifdef INADDR_NONE
2851 insint(d, "INADDR_NONE", INADDR_NONE);
2852#else
2853 insint(d, "INADDR_NONE", 0xffffffff);
2854#endif
2855
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002856 /* IP [gs]etsockopt options */
2857#ifdef IP_OPTIONS
2858 insint(d, "IP_OPTIONS", IP_OPTIONS);
2859#endif
2860#ifdef IP_HDRINCL
2861 insint(d, "IP_HDRINCL", IP_HDRINCL);
2862#endif
2863#ifdef IP_TOS
2864 insint(d, "IP_TOS", IP_TOS);
2865#endif
2866#ifdef IP_TTL
2867 insint(d, "IP_TTL", IP_TTL);
2868#endif
2869#ifdef IP_RECVOPTS
2870 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2871#endif
2872#ifdef IP_RECVRETOPTS
2873 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2874#endif
2875#ifdef IP_RECVDSTADDR
2876 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2877#endif
2878#ifdef IP_RETOPTS
2879 insint(d, "IP_RETOPTS", IP_RETOPTS);
2880#endif
2881#ifdef IP_MULTICAST_IF
2882 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2883#endif
2884#ifdef IP_MULTICAST_TTL
2885 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2886#endif
2887#ifdef IP_MULTICAST_LOOP
2888 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2889#endif
2890#ifdef IP_ADD_MEMBERSHIP
2891 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2892#endif
2893#ifdef IP_DROP_MEMBERSHIP
2894 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2895#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002896#ifdef IP_DEFAULT_MULTICAST_TTL
2897 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
2898#endif
2899#ifdef IP_DEFAULT_MULTICAST_LOOP
2900 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
2901#endif
2902#ifdef IP_MAX_MEMBERSHIPS
2903 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
2904#endif
2905
2906 /* TCP options */
2907#ifdef TCP_NODELAY
2908 insint(d, "TCP_NODELAY", TCP_NODELAY);
2909#endif
2910#ifdef TCP_MAXSEG
2911 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
2912#endif
2913
2914 /* IPX options */
2915#ifdef IPX_TYPE
2916 insint(d, "IPX_TYPE", IPX_TYPE);
2917#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002918
2919 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002920#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002921 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002922#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002923}