blob: ce572ff4f4e82c1e9b15ff4f326a0a700252d987 [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;
Guido van Rossum73624e91994-10-10 17:59:00 +0000793 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000794 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000795 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000796#ifdef MS_WINDOWS
797 if (newfd == INVALID_SOCKET)
798#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000799 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000800#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000801 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000802
Guido van Rossum30a685f1991-06-27 15:51:29 +0000803 /* Create the new object with unspecified family,
804 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000805 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000806 s->sock_family,
807 s->sock_type,
808 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000809 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000810 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000811 goto finally;
812 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000813 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000814 addrlen);
815 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +0000816 goto finally;
817
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000818 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000819
820 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000821 Py_XDECREF(sock);
822 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000823 return res;
824}
825
Guido van Rossum82a5c661998-07-07 20:45:43 +0000826static char accept_doc[] =
827"accept() -> (socket object, address info)\n\
828\n\
829Wait for an incoming connection. Return a new socket representing the\n\
830connection, and the address of the client. For IP sockets, the address\n\
831info is a pair (hostaddr, port).";
832
Guido van Rossum30a685f1991-06-27 15:51:29 +0000833
Guido van Rossume4485b01994-09-07 14:32:49 +0000834/* s.setblocking(1 | 0) method */
835
Guido van Rossum73624e91994-10-10 17:59:00 +0000836static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000837PySocketSock_setblocking(PySocketSockObject *s, PyObject *args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000838{
839 int block;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000840#ifndef RISCOS
Guido van Rossum644a12b1997-04-09 19:24:53 +0000841#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000842 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000843#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000844#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000845 if (!PyArg_ParseTuple(args, "i:setblocking", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000846 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000847 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000848#ifdef __BEOS__
849 block = !block;
850 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
851 (void *)(&block), sizeof( int ) );
852#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000853#ifndef RISCOS
Guido van Rossum6f489d91996-06-28 20:15:15 +0000854#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000855#ifdef PYOS_OS2
856 block = !block;
857 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
858#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000859 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
860 if (block)
861 delay_flag &= (~O_NDELAY);
862 else
863 delay_flag |= O_NDELAY;
864 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000865#endif /* !PYOS_OS2 */
866#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000867 block = !block;
868 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000869#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000870#endif /* __BEOS__ */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000871#endif /* RISCOS */
Guido van Rossum73624e91994-10-10 17:59:00 +0000872 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000873
Guido van Rossum73624e91994-10-10 17:59:00 +0000874 Py_INCREF(Py_None);
875 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000876}
Guido van Rossume4485b01994-09-07 14:32:49 +0000877
Guido van Rossum82a5c661998-07-07 20:45:43 +0000878static char setblocking_doc[] =
879"setblocking(flag)\n\
880\n\
881Set the socket to blocking (flag is true) or non-blocking (false).\n\
882This uses the FIONBIO ioctl with the O_NDELAY flag.";
883
Guido van Rossume4485b01994-09-07 14:32:49 +0000884
Guido van Rossum48a680c2001-03-02 06:34:14 +0000885#ifdef RISCOS
886/* s.sleeptaskw(1 | 0) method */
887
888static PyObject *
889PySocketSock_sleeptaskw(PySocketSockObject *s,PyObject *args)
890{
891 int block;
892 int delay_flag;
893 if (!PyArg_GetInt(args, &block))
894 return NULL;
895 Py_BEGIN_ALLOW_THREADS
896 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
897 Py_END_ALLOW_THREADS
898
899 Py_INCREF(Py_None);
900 return Py_None;
901}
902static char sleeptaskw_doc[] =
903"sleeptaskw(flag)\n\
904\n\
905Allow sleeps in taskwindows.";
906#endif
907
908
Guido van Rossumaee08791992-09-08 09:05:33 +0000909/* s.setsockopt() method.
910 With an integer third argument, sets an integer option.
911 With a string third argument, sets an option from a buffer;
912 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000913
Guido van Rossum73624e91994-10-10 17:59:00 +0000914static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000915PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000916{
917 int level;
918 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000919 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000920 char *buf;
921 int buflen;
922 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000923
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000924 if (PyArg_ParseTuple(args, "iii:setsockopt",
925 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000926 buf = (char *) &flag;
927 buflen = sizeof flag;
928 }
929 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000930 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000931 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
932 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000933 return NULL;
934 }
Thomas Wouters334fb892000-07-25 12:56:38 +0000935 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000936 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000937 return PySocket_Err();
938 Py_INCREF(Py_None);
939 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000940}
941
Guido van Rossum82a5c661998-07-07 20:45:43 +0000942static char setsockopt_doc[] =
943"setsockopt(level, option, value)\n\
944\n\
945Set a socket option. See the Unix manual for level and option.\n\
946The value argument can either be an integer or a string.";
947
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000948
Guido van Rossumaee08791992-09-08 09:05:33 +0000949/* s.getsockopt() method.
950 With two arguments, retrieves an integer option.
951 With a third integer argument, retrieves a string buffer of that size;
952 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000953
Guido van Rossum73624e91994-10-10 17:59:00 +0000954static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000955PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000956{
957 int level;
958 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000959 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000960 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000961 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000962
Guido van Rossumbcc20741998-08-04 22:53:56 +0000963#ifdef __BEOS__
964/* We have incomplete socket support. */
965 PyErr_SetString( PySocket_Error, "getsockopt not supported" );
966 return NULL;
967#else
968
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000969 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
970 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +0000971 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000972
Guido van Rossumbe32c891996-06-20 16:25:29 +0000973 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000974 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000975 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000976 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +0000977 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000978 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000979 return PySocket_Err();
980 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000981 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000982 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000983 PyErr_SetString(PySocket_Error,
984 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000985 return NULL;
986 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000987 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000988 if (buf == NULL)
989 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000990 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +0000991 (void *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000992 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000993 Py_DECREF(buf);
994 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000995 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000996 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000997 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000998#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000999}
1000
Guido van Rossum82a5c661998-07-07 20:45:43 +00001001static char getsockopt_doc[] =
1002"getsockopt(level, option[, buffersize]) -> value\n\
1003\n\
1004Get a socket option. See the Unix manual for level and option.\n\
1005If a nonzero buffersize argument is given, the return value is a\n\
1006string of that length; otherwise it is an integer.";
1007
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001008
Fred Drake728819a2000-07-01 03:40:12 +00001009/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001010
Guido van Rossum73624e91994-10-10 17:59:00 +00001011static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001012PySocketSock_bind(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001013{
1014 struct sockaddr *addr;
1015 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001016 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001017 PyObject *addro;
1018 if (!PyArg_ParseTuple(args, "O:bind", &addro))
1019 return NULL;
1020 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001021 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001022 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001023 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001024 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001025 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001026 return PySocket_Err();
1027 Py_INCREF(Py_None);
1028 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001029}
1030
Guido van Rossum82a5c661998-07-07 20:45:43 +00001031static char bind_doc[] =
1032"bind(address)\n\
1033\n\
1034Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001035pair (host, port); the host must refer to the local host. For raw packet\n\
1036sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001037
Guido van Rossum30a685f1991-06-27 15:51:29 +00001038
1039/* s.close() method.
1040 Set the file descriptor to -1 so operations tried subsequently
1041 will surely fail. */
1042
Guido van Rossum73624e91994-10-10 17:59:00 +00001043static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001044PySocketSock_close(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001045{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001046 SOCKET_T fd;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001047 if (!PyArg_ParseTuple(args, ":close"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001048 return NULL;
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001049 if ((fd = s->sock_fd) != -1) {
1050 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001051 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001052 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001053 Py_END_ALLOW_THREADS
1054 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001055 Py_INCREF(Py_None);
1056 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001057}
1058
Guido van Rossum82a5c661998-07-07 20:45:43 +00001059static char close_doc[] =
1060"close()\n\
1061\n\
1062Close the socket. It cannot be used after this call.";
1063
Guido van Rossum30a685f1991-06-27 15:51:29 +00001064
Fred Drake728819a2000-07-01 03:40:12 +00001065/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001066
Guido van Rossum73624e91994-10-10 17:59:00 +00001067static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001068PySocketSock_connect(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001069{
1070 struct sockaddr *addr;
1071 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001072 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001073 PyObject *addro;
1074 if (!PyArg_ParseTuple(args, "O:connect", &addro))
1075 return NULL;
1076 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001077 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001078 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001079 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001080 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001081 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001082 return PySocket_Err();
1083 Py_INCREF(Py_None);
1084 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001085}
1086
Guido van Rossum82a5c661998-07-07 20:45:43 +00001087static char connect_doc[] =
1088"connect(address)\n\
1089\n\
1090Connect the socket to a remote address. For IP sockets, the address\n\
1091is a pair (host, port).";
1092
Guido van Rossum30a685f1991-06-27 15:51:29 +00001093
Fred Drake728819a2000-07-01 03:40:12 +00001094/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001095
1096static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001097PySocketSock_connect_ex(PySocketSockObject *s, PyObject *args)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001098{
1099 struct sockaddr *addr;
1100 int addrlen;
1101 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001102 PyObject *addro;
1103 if (!PyArg_ParseTuple(args, "O:connect_ex", &addro))
1104 return NULL;
1105 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001106 return NULL;
1107 Py_BEGIN_ALLOW_THREADS
1108 res = connect(s->sock_fd, addr, addrlen);
1109 Py_END_ALLOW_THREADS
1110 if (res != 0)
1111 res = errno;
1112 return PyInt_FromLong((long) res);
1113}
1114
Guido van Rossum82a5c661998-07-07 20:45:43 +00001115static char connect_ex_doc[] =
1116"connect_ex(address)\n\
1117\n\
1118This is like connect(address), but returns an error code (the errno value)\n\
1119instead of raising an exception when an error occurs.";
1120
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001121
Guido van Rossumed233a51992-06-23 09:07:03 +00001122/* s.fileno() method */
1123
Guido van Rossum73624e91994-10-10 17:59:00 +00001124static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001125PySocketSock_fileno(PySocketSockObject *s, PyObject *args)
Guido van Rossumed233a51992-06-23 09:07:03 +00001126{
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001127 if (!PyArg_ParseTuple(args, ":fileno"))
Guido van Rossumed233a51992-06-23 09:07:03 +00001128 return NULL;
Fred Drakea04eaad2000-06-30 02:46:07 +00001129#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001130 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001131#else
1132 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1133#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001134}
1135
Guido van Rossum82a5c661998-07-07 20:45:43 +00001136static char fileno_doc[] =
1137"fileno() -> integer\n\
1138\n\
1139Return the integer file descriptor of the socket.";
1140
Guido van Rossumed233a51992-06-23 09:07:03 +00001141
Guido van Rossumbe32c891996-06-20 16:25:29 +00001142#ifndef NO_DUP
1143/* s.dup() method */
1144
1145static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001146PySocketSock_dup(PySocketSockObject *s, PyObject *args)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001147{
Fred Drakea04eaad2000-06-30 02:46:07 +00001148 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001149 PyObject *sock;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001150 if (!PyArg_ParseTuple(args, ":dup"))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001151 return NULL;
1152 newfd = dup(s->sock_fd);
1153 if (newfd < 0)
1154 return PySocket_Err();
1155 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001156 s->sock_family,
1157 s->sock_type,
1158 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001159 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001160 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001161 return sock;
1162}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001163
1164static char dup_doc[] =
1165"dup() -> socket object\n\
1166\n\
1167Return a new socket object connected to the same system resource.";
1168
Guido van Rossumbe32c891996-06-20 16:25:29 +00001169#endif
1170
1171
Guido van Rossumc89705d1992-11-26 08:54:07 +00001172/* s.getsockname() method */
1173
Guido van Rossum73624e91994-10-10 17:59:00 +00001174static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001175PySocketSock_getsockname(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001176{
1177 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001178 int res;
1179 socklen_t addrlen;
1180
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001181 if (!PyArg_ParseTuple(args, ":getsockname"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001182 return NULL;
1183 if (!getsockaddrlen(s, &addrlen))
1184 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001185 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001186 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001187 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001188 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001189 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001190 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001191 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001192}
1193
Guido van Rossum82a5c661998-07-07 20:45:43 +00001194static char getsockname_doc[] =
1195"getsockname() -> address info\n\
1196\n\
1197Return the address of the local endpoint. For IP sockets, the address\n\
1198info is a pair (hostaddr, port).";
1199
Guido van Rossumc89705d1992-11-26 08:54:07 +00001200
Guido van Rossumb6775db1994-08-01 11:34:53 +00001201#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001202/* s.getpeername() method */
1203
Guido van Rossum73624e91994-10-10 17:59:00 +00001204static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001205PySocketSock_getpeername(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001206{
1207 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001208 int res;
1209 socklen_t addrlen;
1210
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001211 if (!PyArg_ParseTuple(args, ":getpeername"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001212 return NULL;
1213 if (!getsockaddrlen(s, &addrlen))
1214 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001215 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001216 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001217 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001218 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001219 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001220 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001221}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001222
1223static char getpeername_doc[] =
1224"getpeername() -> address info\n\
1225\n\
1226Return the address of the remote endpoint. For IP sockets, the address\n\
1227info is a pair (hostaddr, port).";
1228
Guido van Rossumb6775db1994-08-01 11:34:53 +00001229#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001230
1231
Guido van Rossum30a685f1991-06-27 15:51:29 +00001232/* s.listen(n) method */
1233
Guido van Rossum73624e91994-10-10 17:59:00 +00001234static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001235PySocketSock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001236{
1237 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001238 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001239 if (!PyArg_ParseTuple(args, "i:listen", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001240 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001241 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001242 if (backlog < 1)
1243 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001244 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001245 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001246 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001247 return PySocket_Err();
1248 Py_INCREF(Py_None);
1249 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001250}
1251
Guido van Rossum82a5c661998-07-07 20:45:43 +00001252static char listen_doc[] =
1253"listen(backlog)\n\
1254\n\
1255Enable a server to accept connections. The backlog argument must be at\n\
1256least 1; it specifies the number of unaccepted connection that the system\n\
1257will allow before refusing new connections.";
1258
1259
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001260#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001261/* s.makefile(mode) method.
1262 Create a new open file object referring to a dupped version of
1263 the socket's file descriptor. (The dup() call is necessary so
1264 that the open file and socket objects may be closed independent
1265 of each other.)
1266 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1267
Guido van Rossum73624e91994-10-10 17:59:00 +00001268static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001269PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001270{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001271 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001272 char *mode = "r";
1273 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001274#ifdef MS_WIN32
1275 intptr_t fd;
1276#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001277 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001278#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001279 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001280 PyObject *f;
1281
Guido van Rossum43713e52000-02-29 13:59:29 +00001282 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001283 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001284#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001285 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1286 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001287#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001288 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001289#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001290 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001291 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001292 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001293 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001294 }
1295 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1296 if (f != NULL)
1297 PyFile_SetBufSize(f, bufsize);
1298 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001299}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001300
1301static char makefile_doc[] =
1302"makefile([mode[, buffersize]]) -> file object\n\
1303\n\
1304Return a regular file object corresponding to the socket.\n\
1305The mode and buffersize arguments are as for the built-in open() function.";
1306
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001307#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001308
Guido van Rossum48a680c2001-03-02 06:34:14 +00001309
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001310/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001311
Guido van Rossum73624e91994-10-10 17:59:00 +00001312static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001313PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001314{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001315 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001316 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001317 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001318 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001319 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001320 if (buf == NULL)
1321 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001322 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001323 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001324 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001325 if (n < 0) {
1326 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001327 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001328 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001329 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001330 return NULL;
1331 return buf;
1332}
1333
Guido van Rossum82a5c661998-07-07 20:45:43 +00001334static char recv_doc[] =
1335"recv(buffersize[, flags]) -> data\n\
1336\n\
1337Receive up to buffersize bytes from the socket. For the optional flags\n\
1338argument, see the Unix manual. When no data is available, block until\n\
1339at least one byte is available or until the remote end is closed. When\n\
1340the remote end is closed and all data is read, return the empty string.";
1341
Guido van Rossum30a685f1991-06-27 15:51:29 +00001342
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001343/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001344
Guido van Rossum73624e91994-10-10 17:59:00 +00001345static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001346PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001347{
1348 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001349 PyObject *buf = NULL;
1350 PyObject *addr = NULL;
1351 PyObject *ret = NULL;
1352
Guido van Rossumff3ab422000-04-24 15:16:03 +00001353 int len, n, flags = 0;
1354 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001355 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001356 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001357 if (!getsockaddrlen(s, &addrlen))
1358 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001359 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001360 if (buf == NULL)
1361 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001362 Py_BEGIN_ALLOW_THREADS
1363 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001364#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001365#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001366 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001367#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001368 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001369#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001370#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001371 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001372#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001373 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001374 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001375 if (n < 0) {
1376 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001377 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001378 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001379 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001380 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001381
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001382 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001383 goto finally;
1384
Guido van Rossum73624e91994-10-10 17:59:00 +00001385 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001386 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001387 Py_XDECREF(addr);
1388 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001389 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001390}
1391
Guido van Rossum82a5c661998-07-07 20:45:43 +00001392static char recvfrom_doc[] =
1393"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1394\n\
1395Like recv(buffersize, flags) but also return the sender's address info.";
1396
Guido van Rossum30a685f1991-06-27 15:51:29 +00001397
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001398/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001399
Guido van Rossum73624e91994-10-10 17:59:00 +00001400static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001401PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001402{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001403 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001404 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001405 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001406 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001407 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001408 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001409 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001410 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001411 return PySocket_Err();
1412 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001413}
1414
Guido van Rossum82a5c661998-07-07 20:45:43 +00001415static char send_doc[] =
1416"send(data[, flags])\n\
1417\n\
1418Send a data string to the socket. For the optional flags\n\
1419argument, see the Unix manual.";
1420
Guido van Rossum30a685f1991-06-27 15:51:29 +00001421
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001422/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001423
Guido van Rossum73624e91994-10-10 17:59:00 +00001424static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001425PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001426{
Guido van Rossum73624e91994-10-10 17:59:00 +00001427 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001428 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001429 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001430 int addrlen, len, n, flags;
1431 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001432 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001433 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001434 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1435 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001436 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001437 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001438 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001439 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001440 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001441 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001442 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001443 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001444 return PySocket_Err();
1445 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001446}
1447
Guido van Rossum82a5c661998-07-07 20:45:43 +00001448static char sendto_doc[] =
1449"sendto(data[, flags], address)\n\
1450\n\
1451Like send(data, flags) but allows specifying the destination address.\n\
1452For IP sockets, the address is a pair (hostaddr, port).";
1453
Guido van Rossum30a685f1991-06-27 15:51:29 +00001454
1455/* s.shutdown(how) method */
1456
Guido van Rossum73624e91994-10-10 17:59:00 +00001457static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001458PySocketSock_shutdown(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001459{
1460 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001461 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001462 if (!PyArg_ParseTuple(args, "i:shutdown", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001463 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001464 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001465 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001466 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001467 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001468 return PySocket_Err();
1469 Py_INCREF(Py_None);
1470 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001471}
1472
Guido van Rossum82a5c661998-07-07 20:45:43 +00001473static char shutdown_doc[] =
1474"shutdown(flag)\n\
1475\n\
1476Shut down the reading side of the socket (flag == 0), the writing side\n\
1477of the socket (flag == 1), or both ends (flag == 2).";
1478
Guido van Rossum30a685f1991-06-27 15:51:29 +00001479
1480/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001481
Guido van Rossum73624e91994-10-10 17:59:00 +00001482static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001483 {"accept", (PyCFunction)PySocketSock_accept, METH_VARARGS,
1484 accept_doc},
1485 {"bind", (PyCFunction)PySocketSock_bind, METH_VARARGS,
1486 bind_doc},
1487 {"close", (PyCFunction)PySocketSock_close, METH_VARARGS,
1488 close_doc},
1489 {"connect", (PyCFunction)PySocketSock_connect, METH_VARARGS,
1490 connect_doc},
1491 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_VARARGS,
1492 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001493#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001494 {"dup", (PyCFunction)PySocketSock_dup, METH_VARARGS,
1495 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001496#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001497 {"fileno", (PyCFunction)PySocketSock_fileno, METH_VARARGS,
1498 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001499#ifdef HAVE_GETPEERNAME
Guido van Rossum48a680c2001-03-02 06:34:14 +00001500 {"getpeername", (PyCFunction)PySocketSock_getpeername, METH_VARARGS,
1501 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001502#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001503 {"getsockname", (PyCFunction)PySocketSock_getsockname, METH_VARARGS,
1504 getsockname_doc},
1505 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1506 getsockopt_doc},
1507 {"listen", (PyCFunction)PySocketSock_listen, METH_VARARGS,
1508 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001509#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001510 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1511 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001512#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001513 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1514 recv_doc},
1515 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1516 recvfrom_doc},
1517 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1518 send_doc},
1519 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1520 sendto_doc},
1521 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_VARARGS,
1522 setblocking_doc},
1523 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1524 setsockopt_doc},
1525 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_VARARGS,
1526 shutdown_doc},
1527#ifdef RISCOS
1528 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1529 sleeptaskw_doc},
1530#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001531 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001532};
1533
Guido van Rossum30a685f1991-06-27 15:51:29 +00001534
Guido van Rossum73624e91994-10-10 17:59:00 +00001535/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001536 First close the file description. */
1537
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001538static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001539PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001540{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001541 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001542 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001543 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001544}
1545
Guido van Rossum30a685f1991-06-27 15:51:29 +00001546
1547/* Return a socket object's named attribute. */
1548
Guido van Rossum73624e91994-10-10 17:59:00 +00001549static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001550PySocketSock_getattr(PySocketSockObject *s, char *name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001551{
Guido van Rossum73624e91994-10-10 17:59:00 +00001552 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001553}
1554
Guido van Rossum30a685f1991-06-27 15:51:29 +00001555
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001556static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001557PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001558{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001559 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001560#if SIZEOF_SOCKET_T > SIZEOF_LONG
1561 if (s->sock_fd > LONG_MAX) {
1562 /* this can occur on Win64, and actually there is a special
1563 ugly printf formatter for decimal pointer length integer
1564 printing, only bother if necessary*/
1565 PyErr_SetString(PyExc_OverflowError,
1566 "no printf formatter to display the socket descriptor in decimal");
1567 return NULL;
1568 }
1569#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001570 sprintf(buf,
1571 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
Fred Drakea04eaad2000-06-30 02:46:07 +00001572 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001573 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001574}
1575
1576
Guido van Rossumb6775db1994-08-01 11:34:53 +00001577/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001578
Guido van Rossum73624e91994-10-10 17:59:00 +00001579static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001580 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001581 0,
1582 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001583 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001584 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001585 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001586 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001587 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001588 0, /*tp_setattr*/
1589 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001590 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001591 0, /*tp_as_number*/
1592 0, /*tp_as_sequence*/
1593 0, /*tp_as_mapping*/
1594};
1595
Guido van Rossum30a685f1991-06-27 15:51:29 +00001596
Guido van Rossum81194471991-07-27 21:42:02 +00001597/* Python interface to gethostname(). */
1598
1599/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001600static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001601PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001602{
1603 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001604 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001605 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001606 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001607 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001608 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001609 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001610 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001611 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001612 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001613 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001614}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001615
Guido van Rossum82a5c661998-07-07 20:45:43 +00001616static char gethostname_doc[] =
1617"gethostname() -> string\n\
1618\n\
1619Return the current host name.";
1620
Guido van Rossumff4949e1992-08-05 19:58:53 +00001621
Guido van Rossum30a685f1991-06-27 15:51:29 +00001622/* Python interface to gethostbyname(name). */
1623
1624/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001625static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001626PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001627{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001628 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001629 struct sockaddr_in addrbuf;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001630 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001631 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001632 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001633 return NULL;
1634 return makeipaddr(&addrbuf);
1635}
1636
Guido van Rossum82a5c661998-07-07 20:45:43 +00001637static char gethostbyname_doc[] =
1638"gethostbyname(host) -> address\n\
1639\n\
1640Return the IP address (a string of the form '255.255.255.255') for a host.";
1641
1642
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001643/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1644
1645static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001646gethost_common(struct hostent *h, struct sockaddr_in *addr)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001647{
1648 char **pch;
1649 PyObject *rtn_tuple = (PyObject *)NULL;
1650 PyObject *name_list = (PyObject *)NULL;
1651 PyObject *addr_list = (PyObject *)NULL;
1652 PyObject *tmp;
1653 if (h == NULL) {
1654#ifdef HAVE_HSTRERROR
Guido van Rossum48a680c2001-03-02 06:34:14 +00001655 /* Let's get real error message to return */
1656 extern int h_errno;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001657 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1658#else
1659 PyErr_SetString(PySocket_Error, "host not found");
1660#endif
1661 return NULL;
1662 }
1663 if ((name_list = PyList_New(0)) == NULL)
1664 goto err;
1665 if ((addr_list = PyList_New(0)) == NULL)
1666 goto err;
1667 for (pch = h->h_aliases; *pch != NULL; pch++) {
1668 int status;
1669 tmp = PyString_FromString(*pch);
1670 if (tmp == NULL)
1671 goto err;
1672 status = PyList_Append(name_list, tmp);
1673 Py_DECREF(tmp);
1674 if (status)
1675 goto err;
1676 }
1677 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1678 int status;
1679 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1680 tmp = makeipaddr(addr);
1681 if (tmp == NULL)
1682 goto err;
1683 status = PyList_Append(addr_list, tmp);
1684 Py_DECREF(tmp);
1685 if (status)
1686 goto err;
1687 }
1688 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1689 err:
1690 Py_XDECREF(name_list);
1691 Py_XDECREF(addr_list);
1692 return rtn_tuple;
1693}
1694
1695
1696/* Python interface to gethostbyname_ex(name). */
1697
1698/*ARGSUSED*/
1699static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001700PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001701{
1702 char *name;
1703 struct hostent *h;
1704 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001705 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001706#ifdef HAVE_GETHOSTBYNAME_R
1707 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001708#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1709 struct hostent_data data;
1710#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001711 char buf[16384];
1712 int buf_len = (sizeof buf) - 1;
1713 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001714#endif
1715#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001716 int result;
1717#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001718#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001719 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001720 return NULL;
1721 if (setipaddr(name, &addr) < 0)
1722 return NULL;
1723 Py_BEGIN_ALLOW_THREADS
1724#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001725#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001726 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001727#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001728 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001729#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001730 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001731 result = gethostbyname_r(name, &hp_allocated, &data);
1732 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001733#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001734#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001735#ifdef USE_GETHOSTBYNAME_LOCK
1736 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001737#endif
1738 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001739#endif /* HAVE_GETHOSTBYNAME_R */
1740 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001741 ret = gethost_common(h, &addr);
1742#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001743 PyThread_release_lock(gethostbyname_lock);
1744#endif
1745 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001746}
1747
1748static char ghbn_ex_doc[] =
1749"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1750\n\
1751Return the true host name, a list of aliases, and a list of IP addresses,\n\
1752for a host. The host argument is a string giving a host name or IP number.";
1753
1754
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001755/* Python interface to gethostbyaddr(IP). */
1756
1757/*ARGSUSED*/
1758static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001759PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001760{
Guido van Rossum48a680c2001-03-02 06:34:14 +00001761 struct sockaddr_in addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001762 char *ip_num;
1763 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001764 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001765#ifdef HAVE_GETHOSTBYNAME_R
1766 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001767#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1768 struct hostent_data data;
1769#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001770 char buf[16384];
1771 int buf_len = (sizeof buf) - 1;
1772 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001773#endif
1774#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001775 int result;
1776#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001777#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001778
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001779 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001780 return NULL;
1781 if (setipaddr(ip_num, &addr) < 0)
1782 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001783 Py_BEGIN_ALLOW_THREADS
1784#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001785#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001786 result = gethostbyaddr_r((char *)&addr.sin_addr,
1787 sizeof(addr.sin_addr),
1788 AF_INET, &hp_allocated, buf, buf_len,
1789 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001790#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001791 h = gethostbyaddr_r((char *)&addr.sin_addr,
1792 sizeof(addr.sin_addr),
Guido van Rossum48a680c2001-03-02 06:34:14 +00001793 AF_INET,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001794 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001795#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001796 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001797 result = gethostbyaddr_r((char *)&addr.sin_addr,
1798 sizeof(addr.sin_addr),
1799 AF_INET, &hp_allocated, &data);
1800 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001801#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001802#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001803#ifdef USE_GETHOSTBYNAME_LOCK
1804 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001805#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001806 h = gethostbyaddr((char *)&addr.sin_addr,
1807 sizeof(addr.sin_addr),
1808 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001809#endif /* HAVE_GETHOSTBYNAME_R */
1810 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001811 ret = gethost_common(h, &addr);
1812#ifdef USE_GETHOSTBYNAME_LOCK
1813 PyThread_release_lock(gethostbyname_lock);
1814#endif
1815 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001816}
1817
Guido van Rossum82a5c661998-07-07 20:45:43 +00001818static char gethostbyaddr_doc[] =
1819"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1820\n\
1821Return the true host name, a list of aliases, and a list of IP addresses,\n\
1822for a host. The host argument is a string giving a host name or IP number.";
1823
Guido van Rossum30a685f1991-06-27 15:51:29 +00001824
1825/* Python interface to getservbyname(name).
1826 This only returns the port number, since the other info is already
1827 known or not useful (like the list of aliases). */
1828
1829/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001830static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001831PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001832{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001833 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001834 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001835 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001836 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001837 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001838 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001839 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001840 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001841 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001842 return NULL;
1843 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001844 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001845}
1846
Guido van Rossum82a5c661998-07-07 20:45:43 +00001847static char getservbyname_doc[] =
1848"getservbyname(servicename, protocolname) -> integer\n\
1849\n\
1850Return a port number from a service name and protocol name.\n\
1851The protocol name should be 'tcp' or 'udp'.";
1852
Guido van Rossum30a685f1991-06-27 15:51:29 +00001853
Guido van Rossum3901d851996-12-19 16:35:04 +00001854/* Python interface to getprotobyname(name).
1855 This only returns the protocol number, since the other info is
1856 already known or not useful (like the list of aliases). */
1857
1858/*ARGSUSED*/
1859static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001860PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00001861{
1862 char *name;
1863 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001864#ifdef __BEOS__
1865/* Not available in BeOS yet. - [cjh] */
1866 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1867 return NULL;
1868#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001869 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00001870 return NULL;
1871 Py_BEGIN_ALLOW_THREADS
1872 sp = getprotobyname(name);
1873 Py_END_ALLOW_THREADS
1874 if (sp == NULL) {
1875 PyErr_SetString(PySocket_Error, "protocol not found");
1876 return NULL;
1877 }
1878 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001879#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001880}
1881
Guido van Rossum82a5c661998-07-07 20:45:43 +00001882static char getprotobyname_doc[] =
1883"getprotobyname(name) -> integer\n\
1884\n\
1885Return the protocol number for the named protocol. (Rarely used.)";
1886
Guido van Rossum3901d851996-12-19 16:35:04 +00001887
Guido van Rossum30a685f1991-06-27 15:51:29 +00001888/* Python interface to socket(family, type, proto).
1889 The third (protocol) argument is optional.
1890 Return a new socket object. */
1891
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001892/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001893static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001894PySocket_socket(PyObject *self, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001895{
Guido van Rossum73624e91994-10-10 17:59:00 +00001896 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001897 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001898 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001899 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001900 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001901 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001902 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001903 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001904#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001905 if (fd == INVALID_SOCKET)
1906#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001907 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001908#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001909 return PySocket_Err();
1910 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001911 /* If the object can't be created, don't forget to close the
1912 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001913 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001914 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001915 /* From now on, ignore SIGPIPE and let the error checking
1916 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001917#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001918 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00001919#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001920 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001921}
1922
Guido van Rossum82a5c661998-07-07 20:45:43 +00001923static char socket_doc[] =
1924"socket(family, type[, proto]) -> socket object\n\
1925\n\
1926Open a socket of the given type. The family argument specifies the\n\
1927address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1928The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1929or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1930specifying the default protocol.";
1931
1932
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001933#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001934/* Create a socket object from a numeric file description.
1935 Useful e.g. if stdin is a socket.
1936 Additional arguments as for socket(). */
1937
1938/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001939static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001940PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001941{
Guido van Rossum73624e91994-10-10 17:59:00 +00001942 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001943 SOCKET_T fd;
1944 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001945 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
1946 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001947 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001948 /* Dup the fd so it and the socket can be closed independently */
1949 fd = dup(fd);
1950 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001951 return PySocket_Err();
1952 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001953 /* From now on, ignore SIGPIPE and let the error checking
1954 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001955#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001956 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00001957#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001958 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001959}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001960
1961static char fromfd_doc[] =
1962"fromfd(fd, family, type[, proto]) -> socket object\n\
1963\n\
1964Create a socket object from the given file descriptor.\n\
1965The remaining arguments are the same as for socket().";
1966
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001967#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001968
Guido van Rossum82a5c661998-07-07 20:45:43 +00001969
Guido van Rossum006bf911996-06-12 04:04:55 +00001970static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001971PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001972{
1973 int x1, x2;
1974
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001975 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001976 return NULL;
1977 }
1978 x2 = (int)ntohs((short)x1);
1979 return PyInt_FromLong(x2);
1980}
1981
Guido van Rossum82a5c661998-07-07 20:45:43 +00001982static char ntohs_doc[] =
1983"ntohs(integer) -> integer\n\
1984\n\
1985Convert a 16-bit integer from network to host byte order.";
1986
1987
Guido van Rossum006bf911996-06-12 04:04:55 +00001988static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001989PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001990{
1991 int x1, x2;
1992
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001993 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001994 return NULL;
1995 }
1996 x2 = ntohl(x1);
1997 return PyInt_FromLong(x2);
1998}
1999
Guido van Rossum82a5c661998-07-07 20:45:43 +00002000static char ntohl_doc[] =
2001"ntohl(integer) -> integer\n\
2002\n\
2003Convert a 32-bit integer from network to host byte order.";
2004
2005
Guido van Rossum006bf911996-06-12 04:04:55 +00002006static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002007PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002008{
2009 int x1, x2;
2010
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002011 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002012 return NULL;
2013 }
2014 x2 = (int)htons((short)x1);
2015 return PyInt_FromLong(x2);
2016}
2017
Guido van Rossum82a5c661998-07-07 20:45:43 +00002018static char htons_doc[] =
2019"htons(integer) -> integer\n\
2020\n\
2021Convert a 16-bit integer from host to network byte order.";
2022
2023
Guido van Rossum006bf911996-06-12 04:04:55 +00002024static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002025PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002026{
2027 int x1, x2;
2028
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002029 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002030 return NULL;
2031 }
2032 x2 = htonl(x1);
2033 return PyInt_FromLong(x2);
2034}
2035
Guido van Rossum82a5c661998-07-07 20:45:43 +00002036static char htonl_doc[] =
2037"htonl(integer) -> integer\n\
2038\n\
2039Convert a 32-bit integer from host to network byte order.";
2040
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002041/*
2042 * socket.inet_aton() and socket.inet_ntoa() functions
2043 *
2044 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2045 *
2046 */
2047
Guido van Rossum48a680c2001-03-02 06:34:14 +00002048static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002049"inet_aton(string) -> packed 32-bit IP representation\n\
2050\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002051Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002052binary format used in low-level network functions.";
2053
2054static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002055PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002056{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002057#ifndef INADDR_NONE
2058#define INADDR_NONE (-1)
2059#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002060
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002061 /* Have to use inet_addr() instead */
2062 char *ip_addr;
2063 long packed_addr;
2064
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002065 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002066 return NULL;
2067 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00002068#ifdef USE_GUSI1
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002069 packed_addr = (long)inet_addr(ip_addr).s_addr;
2070#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002071 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002072#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002073
2074 if (packed_addr == INADDR_NONE) { /* invalid address */
2075 PyErr_SetString(PySocket_Error,
2076 "illegal IP address string passed to inet_aton");
2077 return NULL;
2078 }
2079
2080 return PyString_FromStringAndSize((char *) &packed_addr,
2081 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002082}
2083
Guido van Rossum48a680c2001-03-02 06:34:14 +00002084static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002085"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002086\n\
2087Convert an IP address from 32-bit packed binary format to string format";
2088
2089static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002090PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002091{
2092 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002093 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002094 struct in_addr packed_addr;
2095
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002096 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002097 return NULL;
2098 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002099
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002100 if (addr_len != sizeof(packed_addr)) {
2101 PyErr_SetString(PySocket_Error,
2102 "packed IP wrong length for inet_ntoa");
2103 return NULL;
2104 }
2105
2106 memcpy(&packed_addr, packed_str, addr_len);
2107
2108 return PyString_FromString(inet_ntoa(packed_addr));
2109}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002110
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002111
2112#ifdef USE_SSL
2113
2114/* This is a C function to be called for new object initialization */
2115static SSLObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002116newSSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002117{
2118 SSLObject *self;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002119
Guido van Rossumb18618d2000-05-03 23:44:39 +00002120 self = PyObject_New(SSLObject, &SSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002121 if (self == NULL){
2122 PyErr_SetObject(SSLErrorObject,
2123 PyString_FromString("newSSLObject error"));
2124 return NULL;
2125 }
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002126 memset(self->server, '\0', sizeof(char) * 256);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002127 memset(self->issuer, '\0', sizeof(char) * 256);
2128
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002129 self->x_attr = PyDict_New();
2130 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
2131 if (self->ctx == NULL) {
2132 PyErr_SetObject(SSLErrorObject,
2133 PyString_FromString("SSL_CTX_new error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002134 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002135 return NULL;
2136 }
2137
2138 if ( (key_file && !cert_file) || (!key_file && cert_file) )
2139 {
2140 PyErr_SetObject(SSLErrorObject,
2141 PyString_FromString(
2142 "Both the key & certificate files must be specified"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002143 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002144 return NULL;
2145 }
2146
2147 if (key_file && cert_file)
2148 {
2149 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
2150 SSL_FILETYPE_PEM) < 1)
2151 {
2152 PyErr_SetObject(SSLErrorObject,
2153 PyString_FromString(
2154 "SSL_CTX_use_PrivateKey_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002155 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002156 return NULL;
2157 }
2158
2159 if (SSL_CTX_use_certificate_chain_file(self->ctx,
2160 cert_file) < 1)
2161 {
2162 PyErr_SetObject(SSLErrorObject,
2163 PyString_FromString(
2164 "SSL_CTX_use_certificate_chain_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002165 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002166 return NULL;
2167 }
2168 }
2169
2170 SSL_CTX_set_verify(self->ctx,
2171 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2172 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2173 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2174 SSL_set_connect_state(self->ssl);
2175
2176 if ((SSL_connect(self->ssl)) == -1) {
2177 /* Actually negotiate SSL connection */
2178 PyErr_SetObject(SSLErrorObject,
2179 PyString_FromString("SSL_connect error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002180 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002181 return NULL;
2182 }
2183 self->ssl->debug = 1;
2184
2185 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2186 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
2187 self->server, 256);
2188 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2189 self->issuer, 256);
2190 }
2191 self->x_attr = NULL;
2192 self->Socket = Sock;
2193 Py_INCREF(self->Socket);
2194 return self;
2195}
2196
2197/* This is the Python function called for new object initialization */
2198static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002199PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002200{
2201 SSLObject *rv;
2202 PySocketSockObject *Sock;
2203 char *key_file;
2204 char *cert_file;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002205
Guido van Rossum43713e52000-02-29 13:59:29 +00002206 if (!PyArg_ParseTuple(args, "O!zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002207 &PySocketSock_Type, (PyObject*)&Sock,
2208 &key_file, &cert_file) )
2209 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002210
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002211 rv = newSSLObject(Sock, key_file, cert_file);
2212 if ( rv == NULL )
2213 return NULL;
2214 return (PyObject *)rv;
2215}
2216
2217static char ssl_doc[] =
2218"ssl(socket, keyfile, certfile) -> sslobject";
2219
2220static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002221SSL_server(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002222{
2223 return PyString_FromString(self->server);
2224}
2225
2226static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002227SSL_issuer(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002228{
2229 return PyString_FromString(self->issuer);
2230}
2231
2232
2233/* SSL object methods */
2234
2235static PyMethodDef SSLMethods[] = {
2236 { "write", (PyCFunction)SSL_SSLwrite, 1 },
2237 { "read", (PyCFunction)SSL_SSLread, 1 },
2238 { "server", (PyCFunction)SSL_server, 1 },
2239 { "issuer", (PyCFunction)SSL_issuer, 1 },
2240 { NULL, NULL}
2241};
2242
2243static void SSL_dealloc(SSLObject *self)
2244{
2245 if (self->server_cert) /* Possible not to have one? */
2246 X509_free (self->server_cert);
2247 SSL_CTX_free(self->ctx);
2248 SSL_free(self->ssl);
2249 Py_XDECREF(self->x_attr);
2250 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002251 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002252}
2253
2254static PyObject *SSL_getattr(SSLObject *self, char *name)
2255{
2256 return Py_FindMethod(SSLMethods, (PyObject *)self, name);
2257}
2258
2259staticforward PyTypeObject SSL_Type = {
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002260 PyObject_HEAD_INIT(NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002261 0, /*ob_size*/
2262 "SSL", /*tp_name*/
2263 sizeof(SSLObject), /*tp_basicsize*/
2264 0, /*tp_itemsize*/
2265 /* methods */
2266 (destructor)SSL_dealloc, /*tp_dealloc*/
2267 0, /*tp_print*/
2268 (getattrfunc)SSL_getattr, /*tp_getattr*/
2269 0, /*tp_setattr*/
2270 0, /*tp_compare*/
2271 0, /*tp_repr*/
2272 0, /*tp_as_number*/
2273 0, /*tp_as_sequence*/
2274 0, /*tp_as_mapping*/
2275 0, /*tp_hash*/
2276};
2277
2278
2279
2280static PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args)
2281{
2282 char *data;
Andrew M. Kuchlingb38175e2001-02-07 20:41:17 +00002283 size_t len;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002284
Andrew M. Kuchlingb38175e2001-02-07 20:41:17 +00002285 if (!PyArg_ParseTuple(args, "s#:write", &data, &len))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002286 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002287
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002288 len = SSL_write(self->ssl, data, len);
2289 return PyInt_FromLong((long)len);
2290}
2291
2292static PyObject *SSL_SSLread(SSLObject *self, PyObject *args)
2293{
2294 PyObject *buf;
2295 int count = 0;
2296 int len = 1024;
2297 int res;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002298
Guido van Rossum43713e52000-02-29 13:59:29 +00002299 PyArg_ParseTuple(args, "|i:read", &len);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002300
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002301 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2302 return NULL; /* Error object should already be set */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002303
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002304 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2305 res = SSL_get_error(self->ssl, count);
2306
2307 switch (res) {
Jeremy Hylton42dd01a2001-02-01 23:35:20 +00002308 case SSL_ERROR_NONE:
2309 assert(count > 0);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002310 break;
Jeremy Hylton42dd01a2001-02-01 23:35:20 +00002311 case SSL_ERROR_ZERO_RETURN: /* normal EOF */
2312 assert(count == 0);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002313 break;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002314 default:
2315 return PyErr_SetFromErrno(SSLErrorObject);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002316 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002317
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002318 fflush(stderr);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002319
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002320 if (count < 0) {
2321 Py_DECREF(buf);
2322 return PyErr_SetFromErrno(SSLErrorObject);
2323 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002324
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002325 if (count != len && _PyString_Resize(&buf, count) < 0)
2326 return NULL;
2327 return buf;
2328}
2329
2330#endif /* USE_SSL */
2331
2332
Guido van Rossum30a685f1991-06-27 15:51:29 +00002333/* List of functions exported by this module. */
2334
Guido van Rossum73624e91994-10-10 17:59:00 +00002335static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002336 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002337 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002338 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002339 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002340 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002341 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002342 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002343 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002344 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002345 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002346 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002347 METH_VARARGS,getprotobyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002348 {"socket", PySocket_socket,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002349 METH_VARARGS, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002350#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002351 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002352 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002353#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002354 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002355 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002356 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002357 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002358 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002359 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002360 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002361 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002362 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002363 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002364 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002365 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002366#ifdef USE_SSL
Guido van Rossum48a680c2001-03-02 06:34:14 +00002367 {"ssl", PySocket_ssl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002368 METH_VARARGS, ssl_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002369#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002370 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002371};
2372
Guido van Rossum30a685f1991-06-27 15:51:29 +00002373
2374/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002375 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002376 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002377 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002378static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002379insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002380{
Guido van Rossum73624e91994-10-10 17:59:00 +00002381 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002382 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002383 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002384
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002385 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002386}
2387
Guido van Rossum30a685f1991-06-27 15:51:29 +00002388
Guido van Rossum8d665e61996-06-26 18:22:49 +00002389#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002390
2391/* Additional initialization and cleanup for NT/Windows */
2392
2393static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002394NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002395{
2396 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002397}
2398
2399static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002400NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002401{
2402 WSADATA WSAData;
2403 int ret;
2404 char buf[100];
2405 ret = WSAStartup(0x0101, &WSAData);
2406 switch (ret) {
2407 case 0: /* no error */
2408 atexit(NTcleanup);
2409 return 1;
2410 case WSASYSNOTREADY:
2411 PyErr_SetString(PyExc_ImportError,
2412 "WSAStartup failed: network not ready");
2413 break;
2414 case WSAVERNOTSUPPORTED:
2415 case WSAEINVAL:
2416 PyErr_SetString(PyExc_ImportError,
2417 "WSAStartup failed: requested version not supported");
2418 break;
2419 default:
2420 sprintf(buf, "WSAStartup failed: error code %d", ret);
2421 PyErr_SetString(PyExc_ImportError, buf);
2422 break;
2423 }
2424 return 0;
2425}
2426
Guido van Rossum8d665e61996-06-26 18:22:49 +00002427#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002428
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002429#if defined(PYOS_OS2)
2430
2431/* Additional initialization and cleanup for OS/2 */
2432
2433static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002434OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002435{
2436 /* No cleanup is necessary for OS/2 Sockets */
2437}
2438
2439static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002440OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002441{
2442 char reason[64];
2443 int rc = sock_init();
2444
2445 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002446 atexit(OS2cleanup);
2447 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002448 }
2449
2450 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2451 PyErr_SetString(PyExc_ImportError, reason);
2452
Guido van Rossum32c575d1997-12-02 20:37:32 +00002453 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002454}
2455
2456#endif /* PYOS_OS2 */
2457
Guido van Rossum30a685f1991-06-27 15:51:29 +00002458/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002459 * This is called when the first 'import socket' is done,
2460 * via a table in config.c, if config.c is compiled with USE_SOCKET
2461 * defined.
2462 *
2463 * For MS_WINDOWS (which means any Windows variant), this module
2464 * is actually called "_socket", and there's a wrapper "socket.py"
2465 * which implements some missing functionality (such as makefile(),
2466 * dup() and fromfd()). The import of "_socket" may fail with an
2467 * ImportError exception if initialization of WINSOCK fails. When
2468 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2469 * scheduled to be made at exit time.
2470 *
2471 * For OS/2, this module is also called "_socket" and uses a wrapper
2472 * "socket.py" which implements that functionality that is missing
2473 * when PC operating systems don't put socket descriptors in the
2474 * operating system's filesystem layer.
2475 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002476
Guido van Rossum82a5c661998-07-07 20:45:43 +00002477static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00002478"Implementation module for socket operations. See the socket module\n\
2479for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00002480
2481static char sockettype_doc[] =
2482"A socket represents one endpoint of a network connection.\n\
2483\n\
2484Methods:\n\
2485\n\
2486accept() -- accept a connection, returning new socket and client address\n\
2487bind() -- bind the socket to a local address\n\
2488close() -- close the socket\n\
2489connect() -- connect the socket to a remote address\n\
2490connect_ex() -- connect, return an error code instead of an exception \n\
2491dup() -- return a new socket object identical to the current one (*)\n\
2492fileno() -- return underlying file descriptor\n\
2493getpeername() -- return remote address (*)\n\
2494getsockname() -- return local address\n\
2495getsockopt() -- get socket options\n\
2496listen() -- start listening for incoming connections\n\
2497makefile() -- return a file object corresponding tot the socket (*)\n\
2498recv() -- receive data\n\
2499recvfrom() -- receive data and sender's address\n\
2500send() -- send data\n\
2501sendto() -- send data to a given address\n\
2502setblocking() -- set or clear the blocking I/O flag\n\
2503setsockopt() -- set socket options\n\
2504shutdown() -- shut down traffic in one or both directions\n\
2505\n\
2506(*) not available on all platforms!)";
2507
Guido van Rossum3886bb61998-12-04 18:50:17 +00002508DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002509init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002510{
Guido van Rossum73624e91994-10-10 17:59:00 +00002511 PyObject *m, *d;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002512#ifdef RISCOS
2513 _kernel_swi_regs r;
2514 r.r[0]=0;
2515 _kernel_swi(0x43380, &r, &r);
2516 taskwindow = r.r[0];
2517#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00002518#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002519 if (!NTinit())
2520 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002521#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002522#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002523 if (!OS2init())
2524 return;
Fred Drakea136d492000-08-16 14:18:30 +00002525#endif /* __TOS_OS2__ */
2526#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002527#endif /* RISCOS */
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002528#ifdef USE_SSL
2529 SSL_Type.ob_type = &PyType_Type;
2530#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00002531 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00002532 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002533 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2534 if (PySocket_Error == NULL)
2535 return;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002536#ifdef USE_SSL
2537 SSL_load_error_strings();
2538 SSLeay_add_ssl_algorithms();
2539 SSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2540 if (SSLErrorObject == NULL)
2541 return;
2542 PyDict_SetItemString(d, "sslerror", SSLErrorObject);
2543 Py_INCREF(&SSL_Type);
2544 if (PyDict_SetItemString(d, "SSLType",
2545 (PyObject *)&SSL_Type) != 0)
2546 return;
2547#endif /* USE_SSL */
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002548 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002549 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002550 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002551 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002552 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002553 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002554 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002555
2556 /* Address families (we only support AF_INET and AF_UNIX) */
2557#ifdef AF_UNSPEC
2558 insint(d, "AF_UNSPEC", AF_UNSPEC);
2559#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002560 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002561#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002562 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002563#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002564#ifdef AF_AX25
2565 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2566#endif
2567#ifdef AF_IPX
2568 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2569#endif
2570#ifdef AF_APPLETALK
2571 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2572#endif
2573#ifdef AF_NETROM
2574 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2575#endif
2576#ifdef AF_BRIDGE
2577 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2578#endif
2579#ifdef AF_AAL5
2580 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2581#endif
2582#ifdef AF_X25
2583 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2584#endif
2585#ifdef AF_INET6
2586 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2587#endif
2588#ifdef AF_ROSE
2589 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2590#endif
Jeremy Hylton22308652001-02-02 03:23:09 +00002591#if defined(linux) && defined(AF_PACKET)
2592 insint(d, "AF_PACKET", AF_PACKET);
2593 insint(d, "PF_PACKET", PF_PACKET);
2594 insint(d, "PACKET_HOST", PACKET_HOST);
2595 insint(d, "PACKET_BROADCAST", PACKET_BROADCAST);
2596 insint(d, "PACKET_MULTICAST", PACKET_MULTICAST);
2597 insint(d, "PACKET_OTHERHOST", PACKET_OTHERHOST);
2598 insint(d, "PACKET_OUTGOING", PACKET_OUTGOING);
2599 insint(d, "PACKET_LOOPBACK", PACKET_LOOPBACK);
2600 insint(d, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002601#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002602
2603 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002604 insint(d, "SOCK_STREAM", SOCK_STREAM);
2605 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002606#ifndef __BEOS__
2607/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002608 insint(d, "SOCK_RAW", SOCK_RAW);
2609 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2610 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002611#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002612
2613#ifdef SO_DEBUG
2614 insint(d, "SO_DEBUG", SO_DEBUG);
2615#endif
2616#ifdef SO_ACCEPTCONN
2617 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2618#endif
2619#ifdef SO_REUSEADDR
2620 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2621#endif
2622#ifdef SO_KEEPALIVE
2623 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2624#endif
2625#ifdef SO_DONTROUTE
2626 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2627#endif
2628#ifdef SO_BROADCAST
2629 insint(d, "SO_BROADCAST", SO_BROADCAST);
2630#endif
2631#ifdef SO_USELOOPBACK
2632 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2633#endif
2634#ifdef SO_LINGER
2635 insint(d, "SO_LINGER", SO_LINGER);
2636#endif
2637#ifdef SO_OOBINLINE
2638 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2639#endif
2640#ifdef SO_REUSEPORT
2641 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2642#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002643#ifdef SO_SNDBUF
2644 insint(d, "SO_SNDBUF", SO_SNDBUF);
2645#endif
2646#ifdef SO_RCVBUF
2647 insint(d, "SO_RCVBUF", SO_RCVBUF);
2648#endif
2649#ifdef SO_SNDLOWAT
2650 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2651#endif
2652#ifdef SO_RCVLOWAT
2653 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2654#endif
2655#ifdef SO_SNDTIMEO
2656 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2657#endif
2658#ifdef SO_RCVTIMEO
2659 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2660#endif
2661#ifdef SO_ERROR
2662 insint(d, "SO_ERROR", SO_ERROR);
2663#endif
2664#ifdef SO_TYPE
2665 insint(d, "SO_TYPE", SO_TYPE);
2666#endif
2667
2668 /* Maximum number of connections for "listen" */
2669#ifdef SOMAXCONN
2670 insint(d, "SOMAXCONN", SOMAXCONN);
2671#else
2672 insint(d, "SOMAXCONN", 5); /* Common value */
2673#endif
2674
2675 /* Flags for send, recv */
2676#ifdef MSG_OOB
2677 insint(d, "MSG_OOB", MSG_OOB);
2678#endif
2679#ifdef MSG_PEEK
2680 insint(d, "MSG_PEEK", MSG_PEEK);
2681#endif
2682#ifdef MSG_DONTROUTE
2683 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2684#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002685#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00002686 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002687#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002688#ifdef MSG_EOR
2689 insint(d, "MSG_EOR", MSG_EOR);
2690#endif
2691#ifdef MSG_TRUNC
2692 insint(d, "MSG_TRUNC", MSG_TRUNC);
2693#endif
2694#ifdef MSG_CTRUNC
2695 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2696#endif
2697#ifdef MSG_WAITALL
2698 insint(d, "MSG_WAITALL", MSG_WAITALL);
2699#endif
2700#ifdef MSG_BTAG
2701 insint(d, "MSG_BTAG", MSG_BTAG);
2702#endif
2703#ifdef MSG_ETAG
2704 insint(d, "MSG_ETAG", MSG_ETAG);
2705#endif
2706
2707 /* Protocol level and numbers, usable for [gs]etsockopt */
2708#ifdef SOL_SOCKET
2709 insint(d, "SOL_SOCKET", SOL_SOCKET);
2710#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002711#ifdef SOL_IP
2712 insint(d, "SOL_IP", SOL_IP);
2713#else
2714 insint(d, "SOL_IP", 0);
2715#endif
2716#ifdef SOL_IPX
2717 insint(d, "SOL_IPX", SOL_IPX);
2718#endif
2719#ifdef SOL_AX25
2720 insint(d, "SOL_AX25", SOL_AX25);
2721#endif
2722#ifdef SOL_ATALK
2723 insint(d, "SOL_ATALK", SOL_ATALK);
2724#endif
2725#ifdef SOL_NETROM
2726 insint(d, "SOL_NETROM", SOL_NETROM);
2727#endif
2728#ifdef SOL_ROSE
2729 insint(d, "SOL_ROSE", SOL_ROSE);
2730#endif
2731#ifdef SOL_TCP
2732 insint(d, "SOL_TCP", SOL_TCP);
2733#else
2734 insint(d, "SOL_TCP", 6);
2735#endif
2736#ifdef SOL_UDP
2737 insint(d, "SOL_UDP", SOL_UDP);
2738#else
2739 insint(d, "SOL_UDP", 17);
2740#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002741#ifdef IPPROTO_IP
2742 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002743#else
2744 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002745#endif
2746#ifdef IPPROTO_ICMP
2747 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002748#else
2749 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002750#endif
2751#ifdef IPPROTO_IGMP
2752 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2753#endif
2754#ifdef IPPROTO_GGP
2755 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2756#endif
2757#ifdef IPPROTO_TCP
2758 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002759#else
2760 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002761#endif
2762#ifdef IPPROTO_EGP
2763 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2764#endif
2765#ifdef IPPROTO_PUP
2766 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2767#endif
2768#ifdef IPPROTO_UDP
2769 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002770#else
2771 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002772#endif
2773#ifdef IPPROTO_IDP
2774 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2775#endif
2776#ifdef IPPROTO_HELLO
2777 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2778#endif
2779#ifdef IPPROTO_ND
2780 insint(d, "IPPROTO_ND", IPPROTO_ND);
2781#endif
2782#ifdef IPPROTO_TP
2783 insint(d, "IPPROTO_TP", IPPROTO_TP);
2784#endif
2785#ifdef IPPROTO_XTP
2786 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2787#endif
2788#ifdef IPPROTO_EON
2789 insint(d, "IPPROTO_EON", IPPROTO_EON);
2790#endif
2791#ifdef IPPROTO_BIP
2792 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2793#endif
2794/**/
2795#ifdef IPPROTO_RAW
2796 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002797#else
2798 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002799#endif
2800#ifdef IPPROTO_MAX
2801 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2802#endif
2803
2804 /* Some port configuration */
2805#ifdef IPPORT_RESERVED
2806 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2807#else
2808 insint(d, "IPPORT_RESERVED", 1024);
2809#endif
2810#ifdef IPPORT_USERRESERVED
2811 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2812#else
2813 insint(d, "IPPORT_USERRESERVED", 5000);
2814#endif
2815
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002816 /* Some reserved IP v.4 addresses */
2817#ifdef INADDR_ANY
2818 insint(d, "INADDR_ANY", INADDR_ANY);
2819#else
2820 insint(d, "INADDR_ANY", 0x00000000);
2821#endif
2822#ifdef INADDR_BROADCAST
2823 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2824#else
2825 insint(d, "INADDR_BROADCAST", 0xffffffff);
2826#endif
2827#ifdef INADDR_LOOPBACK
2828 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2829#else
2830 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2831#endif
2832#ifdef INADDR_UNSPEC_GROUP
2833 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2834#else
2835 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2836#endif
2837#ifdef INADDR_ALLHOSTS_GROUP
2838 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2839#else
2840 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2841#endif
2842#ifdef INADDR_MAX_LOCAL_GROUP
2843 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2844#else
2845 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2846#endif
2847#ifdef INADDR_NONE
2848 insint(d, "INADDR_NONE", INADDR_NONE);
2849#else
2850 insint(d, "INADDR_NONE", 0xffffffff);
2851#endif
2852
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002853 /* IP [gs]etsockopt options */
2854#ifdef IP_OPTIONS
2855 insint(d, "IP_OPTIONS", IP_OPTIONS);
2856#endif
2857#ifdef IP_HDRINCL
2858 insint(d, "IP_HDRINCL", IP_HDRINCL);
2859#endif
2860#ifdef IP_TOS
2861 insint(d, "IP_TOS", IP_TOS);
2862#endif
2863#ifdef IP_TTL
2864 insint(d, "IP_TTL", IP_TTL);
2865#endif
2866#ifdef IP_RECVOPTS
2867 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2868#endif
2869#ifdef IP_RECVRETOPTS
2870 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2871#endif
2872#ifdef IP_RECVDSTADDR
2873 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2874#endif
2875#ifdef IP_RETOPTS
2876 insint(d, "IP_RETOPTS", IP_RETOPTS);
2877#endif
2878#ifdef IP_MULTICAST_IF
2879 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2880#endif
2881#ifdef IP_MULTICAST_TTL
2882 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2883#endif
2884#ifdef IP_MULTICAST_LOOP
2885 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2886#endif
2887#ifdef IP_ADD_MEMBERSHIP
2888 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2889#endif
2890#ifdef IP_DROP_MEMBERSHIP
2891 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2892#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002893#ifdef IP_DEFAULT_MULTICAST_TTL
2894 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
2895#endif
2896#ifdef IP_DEFAULT_MULTICAST_LOOP
2897 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
2898#endif
2899#ifdef IP_MAX_MEMBERSHIPS
2900 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
2901#endif
2902
2903 /* TCP options */
2904#ifdef TCP_NODELAY
2905 insint(d, "TCP_NODELAY", TCP_NODELAY);
2906#endif
2907#ifdef TCP_MAXSEG
2908 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
2909#endif
2910
2911 /* IPX options */
2912#ifdef IPX_TYPE
2913 insint(d, "IPX_TYPE", IPX_TYPE);
2914#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002915
2916 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002917#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002918 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002919#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002920}