blob: 507e6aa5c1c098fffcd802951c6e3ad155515695 [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
Tim Peters7e82b9c2001-06-24 05:08:52 +0000190/* XXX 24-Jun-2000 Tim: I have no idea what the code inside this block is
191 trying to do, and don't have time to look. Looks like Unix-specific code
192 in those files, though, which will never compile on Windows. */
193#ifndef MS_WINDOWS
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000194#include "addrinfo.h"
Tim Peters7e82b9c2001-06-24 05:08:52 +0000195#endif /* ifndef MS_WINDOWS hack */
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000196
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000197#ifdef USE_SSL
Andrew M. Kuchling697a0b02001-01-18 17:41:41 +0000198#include "openssl/rsa.h"
199#include "openssl/crypto.h"
200#include "openssl/x509.h"
201#include "openssl/pem.h"
202#include "openssl/ssl.h"
203#include "openssl/err.h"
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000204#endif /* USE_SSL */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000205
Tim Peters7e82b9c2001-06-24 05:08:52 +0000206/* XXX 24-Jun-2000 Tim: I have no idea what the code inside this block is
207 trying to do, and don't have time to look. Looks like Unix-specific code
208 in those files, though, which will never compile on Windows. */
209#ifndef MS_WINDOWS
210
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000211#ifndef HAVE_INET_PTON
212int inet_pton (int af, const char *src, void *dst);
213char *inet_ntop(int af, void *src, char *dst, socklen_t size);
214#endif
215
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000216/* I know this is a bad practice, but it is the easiest... */
217#ifndef HAVE_GETADDRINFO
218#include "getaddrinfo.c"
219#endif
220#ifndef HAVE_GETNAMEINFO
221#include "getnameinfo.c"
222#endif
223
Tim Peters7e82b9c2001-06-24 05:08:52 +0000224#endif /* ifndef MS_WINDOWS hack */
225
Guido van Rossumbcc20741998-08-04 22:53:56 +0000226#if defined(MS_WINDOWS) || defined(__BEOS__)
227/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000228/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000229#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000230#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000231#endif
232
Fred Drakea04eaad2000-06-30 02:46:07 +0000233/* abstract the socket file descriptor type */
234#ifdef MS_WINDOWS
235typedef SOCKET SOCKET_T;
236# ifdef MS_WIN64
237# define SIZEOF_SOCKET_T 8
238# else
239# define SIZEOF_SOCKET_T 4
240# endif
241#else
242typedef int SOCKET_T;
243# define SIZEOF_SOCKET_T SIZEOF_INT
244#endif
245
246
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000247#if defined(PYOS_OS2)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000248#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000249#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000250#endif
251
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000252#ifndef SOCKETCLOSE
253#define SOCKETCLOSE close
254#endif
255
Guido van Rossum30a685f1991-06-27 15:51:29 +0000256/* Global variable holding the exception type for errors detected
257 by this module (but not argument type or memory errors, etc.). */
258
Guido van Rossum73624e91994-10-10 17:59:00 +0000259static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000260
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000261#ifdef USE_SSL
262static PyObject *SSLErrorObject;
263#endif /* USE_SSL */
264
Guido van Rossum30a685f1991-06-27 15:51:29 +0000265
Guido van Rossum48a680c2001-03-02 06:34:14 +0000266#ifdef RISCOS
267/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
268static int taskwindow;
269#endif
270
271
Guido van Rossum30a685f1991-06-27 15:51:29 +0000272/* Convenience function to raise an error according to errno
273 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000274
Guido van Rossum73624e91994-10-10 17:59:00 +0000275static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000276PySocket_Err(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000277{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000278#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000279 int err_no = WSAGetLastError();
280 if (err_no) {
281 static struct { int no; const char *msg; } *msgp, msgs[] = {
282 { WSAEINTR, "Interrupted system call" },
283 { WSAEBADF, "Bad file descriptor" },
284 { WSAEACCES, "Permission denied" },
285 { WSAEFAULT, "Bad address" },
286 { WSAEINVAL, "Invalid argument" },
287 { WSAEMFILE, "Too many open files" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000288 { WSAEWOULDBLOCK,
Mark Hammond46a733d2000-07-24 01:45:11 +0000289 "The socket operation could not complete "
290 "without blocking" },
291 { WSAEINPROGRESS, "Operation now in progress" },
292 { WSAEALREADY, "Operation already in progress" },
293 { WSAENOTSOCK, "Socket operation on non-socket" },
294 { WSAEDESTADDRREQ, "Destination address required" },
295 { WSAEMSGSIZE, "Message too long" },
296 { WSAEPROTOTYPE, "Protocol wrong type for socket" },
297 { WSAENOPROTOOPT, "Protocol not available" },
298 { WSAEPROTONOSUPPORT, "Protocol not supported" },
299 { WSAESOCKTNOSUPPORT, "Socket type not supported" },
300 { WSAEOPNOTSUPP, "Operation not supported" },
301 { WSAEPFNOSUPPORT, "Protocol family not supported" },
302 { WSAEAFNOSUPPORT, "Address family not supported" },
303 { WSAEADDRINUSE, "Address already in use" },
304 { WSAEADDRNOTAVAIL,
305 "Can't assign requested address" },
306 { WSAENETDOWN, "Network is down" },
307 { WSAENETUNREACH, "Network is unreachable" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000308 { WSAENETRESET,
Mark Hammond46a733d2000-07-24 01:45:11 +0000309 "Network dropped connection on reset" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000310 { WSAECONNABORTED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000311 "Software caused connection abort" },
312 { WSAECONNRESET, "Connection reset by peer" },
313 { WSAENOBUFS, "No buffer space available" },
314 { WSAEISCONN, "Socket is already connected" },
315 { WSAENOTCONN, "Socket is not connected" },
316 { WSAESHUTDOWN, "Can't send after socket shutdown" },
317 { WSAETOOMANYREFS,
318 "Too many references: can't splice" },
319 { WSAETIMEDOUT, "Operation timed out" },
320 { WSAECONNREFUSED, "Connection refused" },
321 { WSAELOOP, "Too many levels of symbolic links" },
322 { WSAENAMETOOLONG, "File name too long" },
323 { WSAEHOSTDOWN, "Host is down" },
324 { WSAEHOSTUNREACH, "No route to host" },
325 { WSAENOTEMPTY, "Directory not empty" },
326 { WSAEPROCLIM, "Too many processes" },
327 { WSAEUSERS, "Too many users" },
328 { WSAEDQUOT, "Disc quota exceeded" },
329 { WSAESTALE, "Stale NFS file handle" },
330 { WSAEREMOTE, "Too many levels of remote in path" },
331 { WSASYSNOTREADY,
332 "Network subsystem is unvailable" },
333 { WSAVERNOTSUPPORTED,
334 "WinSock version is not supported" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000335 { WSANOTINITIALISED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000336 "Successful WSAStartup() not yet performed" },
337 { WSAEDISCON, "Graceful shutdown in progress" },
338 /* Resolver errors */
339 { WSAHOST_NOT_FOUND, "No such host is known" },
340 { WSATRY_AGAIN, "Host not found, or server failed" },
341 { WSANO_RECOVERY,
342 "Unexpected server error encountered" },
343 { WSANO_DATA, "Valid name without requested data" },
344 { WSANO_ADDRESS, "No address, look for MX record" },
345 { 0, NULL }
346 };
Guido van Rossum73624e91994-10-10 17:59:00 +0000347 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000348 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000349
Mark Hammond46a733d2000-07-24 01:45:11 +0000350 for (msgp = msgs; msgp->msg; msgp++) {
351 if (err_no == msgp->no) {
352 msg = msgp->msg;
353 break;
354 }
355 }
356
357 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000358 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000359 PyErr_SetObject(PySocket_Error, v);
360 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000361 }
362 return NULL;
363 }
364 else
365#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000366
367#if defined(PYOS_OS2)
368 if (sock_errno() != NO_ERROR) {
369 APIRET rc;
370 ULONG msglen;
371 char outbuf[100];
372 int myerrorcode = sock_errno();
373
374 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
375 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
376 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
377 if (rc == NO_ERROR) {
378 PyObject *v;
379
380 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
381 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
382 char *lastc = &outbuf[ strlen(outbuf)-1 ];
383 while (lastc > outbuf && isspace(*lastc))
384 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
385 }
386 v = Py_BuildValue("(is)", myerrorcode, outbuf);
387 if (v != NULL) {
388 PyErr_SetObject(PySocket_Error, v);
389 Py_DECREF(v);
390 }
391 return NULL;
392 }
393 }
394#endif
395
Guido van Rossum73624e91994-10-10 17:59:00 +0000396 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000397}
398
Guido van Rossum30a685f1991-06-27 15:51:29 +0000399
400/* The object holding a socket. It holds some extra information,
401 like the address family, which is used to decode socket address
402 arguments properly. */
403
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000404typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000405 PyObject_HEAD
Fred Drakea04eaad2000-06-30 02:46:07 +0000406 SOCKET_T sock_fd; /* Socket file descriptor */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000407 int sock_family; /* Address family, e.g., AF_INET */
408 int sock_type; /* Socket type, e.g., SOCK_STREAM */
409 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000410 union sock_addr {
411 struct sockaddr_in in;
412#ifdef AF_UNIX
413 struct sockaddr_un un;
414#endif
Jeremy Hylton22308652001-02-02 03:23:09 +0000415#if defined(linux) && defined(AF_PACKET)
416 struct sockaddr_ll ll;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000417#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000418 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000419} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000420
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000421#ifdef USE_SSL
Guido van Rossum30a685f1991-06-27 15:51:29 +0000422
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000423typedef struct {
424 PyObject_HEAD
425 PySocketSockObject *Socket; /* Socket on which we're layered */
426 PyObject *x_attr; /* Attributes dictionary */
427 SSL_CTX* ctx;
428 SSL* ssl;
429 X509* server_cert;
430 BIO* sbio;
431 char server[256];
432 char issuer[256];
433
434} SSLObject;
435
436staticforward PyTypeObject SSL_Type;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000437staticforward PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args);
438staticforward PyObject *SSL_SSLread(SSLObject *self, PyObject *args);
439
440#define SSLObject_Check(v) ((v)->ob_type == &SSL_Type)
441
442#endif /* USE_SSL */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000443
Guido van Rossum30a685f1991-06-27 15:51:29 +0000444/* A forward reference to the Socktype type object.
445 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000446 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000447 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000448
Guido van Rossum73624e91994-10-10 17:59:00 +0000449staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000450
Guido van Rossum30a685f1991-06-27 15:51:29 +0000451
452/* Create a new socket object.
453 This just creates the object and initializes it.
454 If the creation fails, return NULL and set an exception (implicit
455 in NEWOBJ()). */
456
Guido van Rossum73624e91994-10-10 17:59:00 +0000457static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000458PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000459{
Guido van Rossum48a680c2001-03-02 06:34:14 +0000460#ifdef RISCOS
461 int block = 1;
462#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000463 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000464 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000465 s = PyObject_New(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000466 if (s != NULL) {
467 s->sock_fd = fd;
468 s->sock_family = family;
469 s->sock_type = type;
470 s->sock_proto = proto;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000471#ifdef RISCOS
472 if(taskwindow) {
473 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
474 }
475#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000476 }
477 return s;
478}
479
Guido van Rossum30a685f1991-06-27 15:51:29 +0000480
Guido van Rossum48a680c2001-03-02 06:34:14 +0000481/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000482 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000483#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000484PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000485#endif
486
487
Guido van Rossum30a685f1991-06-27 15:51:29 +0000488/* Convert a string specifying a host name or one of a few symbolic
489 names to a numeric IP address. This usually calls gethostbyname()
490 to do the work; the names "" and "<broadcast>" are special.
491 Return the length (should always be 4 bytes), or negative if
492 an error occurred; then an exception is raised. */
493
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000494static int
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000495setipaddr(char* name, struct sockaddr_in * addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000496{
497 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000498 int d1, d2, d3, d4;
Guido van Rossum955becc1999-03-22 20:14:53 +0000499 int h_length;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000500 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000501#ifdef HAVE_GETHOSTBYNAME_R
502 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000503#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
504 struct hostent_data data;
505#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000506 char buf[1001];
507 int buf_len = (sizeof buf) - 1;
508 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000509#endif
510#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000511 int result;
512#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000513#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000514
Guido van Rossuma376cc51996-12-05 23:43:35 +0000515 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000516 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000517 addr_ret->sin_addr.s_addr = INADDR_ANY;
518 return 4;
519 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000520 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000521 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
522 return 4;
523 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000524 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
525 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
526 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
527 addr_ret->sin_addr.s_addr = htonl(
528 ((long) d1 << 24) | ((long) d2 << 16) |
529 ((long) d3 << 8) | ((long) d4 << 0));
530 return 4;
531 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000532 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000533#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000534#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000535 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &hp, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000536#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000537 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000538#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +0000539 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000540 result = gethostbyname_r(name, &hp_allocated, &data);
541 hp = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000542#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000543#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000544#ifdef USE_GETHOSTBYNAME_LOCK
545 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000546#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000547 hp = gethostbyname(name);
548#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000549 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000550
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000551 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000552#ifdef HAVE_HSTRERROR
Guido van Rossum48a680c2001-03-02 06:34:14 +0000553 /* Let's get real error message to return */
554 extern int h_errno;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000555 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
556#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000557 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000558#endif
Guido van Rossum3baaa131999-03-22 21:44:51 +0000559#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000560 PyThread_release_lock(gethostbyname_lock);
561#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000562 return -1;
563 }
564 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
Guido van Rossum955becc1999-03-22 20:14:53 +0000565 h_length = hp->h_length;
Guido van Rossum3baaa131999-03-22 21:44:51 +0000566#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000567 PyThread_release_lock(gethostbyname_lock);
568#endif
569 return h_length;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000570}
571
Guido van Rossum30a685f1991-06-27 15:51:29 +0000572
Guido van Rossum30a685f1991-06-27 15:51:29 +0000573/* Create a string object representing an IP address.
574 This is always a string of the form 'dd.dd.dd.dd' (with variable
575 size numbers). */
576
Guido van Rossum73624e91994-10-10 17:59:00 +0000577static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000578makeipaddr(struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000579{
580 long x = ntohl(addr->sin_addr.s_addr);
581 char buf[100];
582 sprintf(buf, "%d.%d.%d.%d",
583 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
584 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000585 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000586}
587
588
589/* Create an object representing the given socket address,
590 suitable for passing it back to bind(), connect() etc.
591 The family field of the sockaddr structure is inspected
592 to determine what kind of address it really is. */
593
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000594/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000595static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000596makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000597{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000598 if (addrlen == 0) {
599 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000600 Py_INCREF(Py_None);
601 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000602 }
603
Guido van Rossumbcc20741998-08-04 22:53:56 +0000604#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000605 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000606 addr->sa_family = AF_INET;
607#endif
608
Guido van Rossum30a685f1991-06-27 15:51:29 +0000609 switch (addr->sa_family) {
610
611 case AF_INET:
612 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000613 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000614 PyObject *addrobj = makeipaddr(a);
615 PyObject *ret = NULL;
616 if (addrobj) {
617 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
618 Py_DECREF(addrobj);
619 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000620 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000621 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000622
Guido van Rossumb6775db1994-08-01 11:34:53 +0000623#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000624 case AF_UNIX:
625 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000626 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000627 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000628 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000629#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000630
Jeremy Hylton22308652001-02-02 03:23:09 +0000631#if defined(linux) && defined(AF_PACKET)
632 case AF_PACKET:
633 {
634 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
635 char *ifname = "";
636 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000637 /* need to look up interface name give index */
638 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000639 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000640 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000641 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000642 }
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000643 return Py_BuildValue("shbhs#", ifname, ntohs(a->sll_protocol),
Guido van Rossum48a680c2001-03-02 06:34:14 +0000644 a->sll_pkttype, a->sll_hatype,
645 a->sll_addr, a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000646 }
647#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000648
Guido van Rossum30a685f1991-06-27 15:51:29 +0000649 /* More cases here... */
650
651 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000652 /* If we don't know the address family, don't raise an
653 exception -- return it as a tuple. */
654 return Py_BuildValue("is#",
655 addr->sa_family,
656 addr->sa_data,
657 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000658
Guido van Rossum30a685f1991-06-27 15:51:29 +0000659 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000660}
661
Guido van Rossum30a685f1991-06-27 15:51:29 +0000662
663/* Parse a socket address argument according to the socket object's
664 address family. Return 1 if the address was in the proper format,
665 0 of not. The address is returned through addr_ret, its length
666 through len_ret. */
667
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000668static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000669getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000670 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000671{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000672 switch (s->sock_family) {
673
Guido van Rossumb6775db1994-08-01 11:34:53 +0000674#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000675 case AF_UNIX:
676 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000677 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000678 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000679 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000680 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000681 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000682 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000683 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000684 PyErr_SetString(PySocket_Error,
685 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000686 return 0;
687 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000688 addr->sun_family = AF_UNIX;
689 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000690 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000691 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000692 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000693 return 1;
694 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000695#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000696
Guido van Rossum30a685f1991-06-27 15:51:29 +0000697 case AF_INET:
698 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000699 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000700 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000701 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000702 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000703 if (!PyTuple_Check(args)) {
704 PyErr_Format(PyExc_TypeError,
705 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
706 args->ob_type->tp_name);
707 return 0;
708 }
709 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000710 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000711 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000712 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000713 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000714 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000715 *addr_ret = (struct sockaddr *) addr;
716 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000717 return 1;
718 }
719
Jeremy Hylton22308652001-02-02 03:23:09 +0000720#if defined(linux) && defined(AF_PACKET)
721 case AF_PACKET:
722 {
723 struct sockaddr_ll* addr;
724 struct ifreq ifr;
725 char *interfaceName;
726 int protoNumber;
727 int hatype = 0;
728 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000729 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000730
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000731 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
732 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000733 return 0;
734 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
735 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000736 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
737 PyErr_SetFromErrno(PySocket_Error);
Jeremy Hylton22308652001-02-02 03:23:09 +0000738 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000739 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000740 addr = &(s->sock_addr.ll);
741 addr->sll_family = AF_PACKET;
742 addr->sll_protocol = htons((short)protoNumber);
743 addr->sll_ifindex = ifr.ifr_ifindex;
744 addr->sll_pkttype = pkttype;
745 addr->sll_hatype = hatype;
746 *addr_ret = (struct sockaddr *) addr;
747 *len_ret = sizeof *addr;
748 return 1;
749 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000750#endif
751
752
Guido van Rossum30a685f1991-06-27 15:51:29 +0000753 /* More cases here... */
754
755 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000756 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000757 return 0;
758
759 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000760}
761
Guido van Rossum30a685f1991-06-27 15:51:29 +0000762
Guido van Rossum48a680c2001-03-02 06:34:14 +0000763/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000764 Return 1 if the family is known, 0 otherwise. The length is returned
765 through len_ret. */
766
767static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000768getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000769{
770 switch (s->sock_family) {
771
Guido van Rossumb6775db1994-08-01 11:34:53 +0000772#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000773 case AF_UNIX:
774 {
775 *len_ret = sizeof (struct sockaddr_un);
776 return 1;
777 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000778#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000779
780 case AF_INET:
781 {
782 *len_ret = sizeof (struct sockaddr_in);
783 return 1;
784 }
785
Jeremy Hylton22308652001-02-02 03:23:09 +0000786#if defined(linux) && defined(AF_PACKET)
787 case AF_PACKET:
788 {
789 *len_ret = sizeof (struct sockaddr_ll);
790 return 1;
791 }
792#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000793
Guido van Rossum710e1df1992-06-12 10:39:36 +0000794 /* More cases here... */
795
796 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000797 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000798 return 0;
799
800 }
801}
802
803
Guido van Rossum30a685f1991-06-27 15:51:29 +0000804/* s.accept() method */
805
Guido van Rossum73624e91994-10-10 17:59:00 +0000806static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000807PySocketSock_accept(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000808{
809 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000810 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000811 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000812 PyObject *sock = NULL;
813 PyObject *addr = NULL;
814 PyObject *res = NULL;
815
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000816 if (!PyArg_ParseTuple(args, ":accept"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000817 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000818 if (!getsockaddrlen(s, &addrlen))
819 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000820 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000821 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000822 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000823 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000824#ifdef MS_WINDOWS
825 if (newfd == INVALID_SOCKET)
826#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000827 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000828#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000829 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000830
Guido van Rossum30a685f1991-06-27 15:51:29 +0000831 /* Create the new object with unspecified family,
832 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000833 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000834 s->sock_family,
835 s->sock_type,
836 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000837 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000838 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000839 goto finally;
840 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000841 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000842 addrlen);
843 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +0000844 goto finally;
845
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000846 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000847
848 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000849 Py_XDECREF(sock);
850 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000851 return res;
852}
853
Guido van Rossum82a5c661998-07-07 20:45:43 +0000854static char accept_doc[] =
855"accept() -> (socket object, address info)\n\
856\n\
857Wait for an incoming connection. Return a new socket representing the\n\
858connection, and the address of the client. For IP sockets, the address\n\
859info is a pair (hostaddr, port).";
860
Guido van Rossum30a685f1991-06-27 15:51:29 +0000861
Guido van Rossume4485b01994-09-07 14:32:49 +0000862/* s.setblocking(1 | 0) method */
863
Guido van Rossum73624e91994-10-10 17:59:00 +0000864static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000865PySocketSock_setblocking(PySocketSockObject *s, PyObject *args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000866{
867 int block;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000868#ifndef RISCOS
Guido van Rossum644a12b1997-04-09 19:24:53 +0000869#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000870 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000871#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000872#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000873 if (!PyArg_ParseTuple(args, "i:setblocking", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000874 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000875 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000876#ifdef __BEOS__
877 block = !block;
878 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
879 (void *)(&block), sizeof( int ) );
880#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000881#ifndef RISCOS
Guido van Rossum6f489d91996-06-28 20:15:15 +0000882#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000883#ifdef PYOS_OS2
884 block = !block;
885 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
886#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000887 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
888 if (block)
889 delay_flag &= (~O_NDELAY);
890 else
891 delay_flag |= O_NDELAY;
892 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000893#endif /* !PYOS_OS2 */
894#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000895 block = !block;
896 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000897#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000898#endif /* __BEOS__ */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000899#endif /* RISCOS */
Guido van Rossum73624e91994-10-10 17:59:00 +0000900 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000901
Guido van Rossum73624e91994-10-10 17:59:00 +0000902 Py_INCREF(Py_None);
903 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000904}
Guido van Rossume4485b01994-09-07 14:32:49 +0000905
Guido van Rossum82a5c661998-07-07 20:45:43 +0000906static char setblocking_doc[] =
907"setblocking(flag)\n\
908\n\
909Set the socket to blocking (flag is true) or non-blocking (false).\n\
910This uses the FIONBIO ioctl with the O_NDELAY flag.";
911
Guido van Rossume4485b01994-09-07 14:32:49 +0000912
Guido van Rossum48a680c2001-03-02 06:34:14 +0000913#ifdef RISCOS
914/* s.sleeptaskw(1 | 0) method */
915
916static PyObject *
917PySocketSock_sleeptaskw(PySocketSockObject *s,PyObject *args)
918{
919 int block;
920 int delay_flag;
921 if (!PyArg_GetInt(args, &block))
922 return NULL;
923 Py_BEGIN_ALLOW_THREADS
924 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
925 Py_END_ALLOW_THREADS
926
927 Py_INCREF(Py_None);
928 return Py_None;
929}
930static char sleeptaskw_doc[] =
931"sleeptaskw(flag)\n\
932\n\
933Allow sleeps in taskwindows.";
934#endif
935
936
Guido van Rossumaee08791992-09-08 09:05:33 +0000937/* s.setsockopt() method.
938 With an integer third argument, sets an integer option.
939 With a string third argument, sets an option from a buffer;
940 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000941
Guido van Rossum73624e91994-10-10 17:59:00 +0000942static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000943PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000944{
945 int level;
946 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000947 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000948 char *buf;
949 int buflen;
950 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000951
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000952 if (PyArg_ParseTuple(args, "iii:setsockopt",
953 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000954 buf = (char *) &flag;
955 buflen = sizeof flag;
956 }
957 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000958 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000959 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
960 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000961 return NULL;
962 }
Thomas Wouters334fb892000-07-25 12:56:38 +0000963 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000964 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000965 return PySocket_Err();
966 Py_INCREF(Py_None);
967 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000968}
969
Guido van Rossum82a5c661998-07-07 20:45:43 +0000970static char setsockopt_doc[] =
971"setsockopt(level, option, value)\n\
972\n\
973Set a socket option. See the Unix manual for level and option.\n\
974The value argument can either be an integer or a string.";
975
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000976
Guido van Rossumaee08791992-09-08 09:05:33 +0000977/* s.getsockopt() method.
978 With two arguments, retrieves an integer option.
979 With a third integer argument, retrieves a string buffer of that size;
980 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000981
Guido van Rossum73624e91994-10-10 17:59:00 +0000982static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000983PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000984{
985 int level;
986 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000987 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000988 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000989 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000990
Guido van Rossumbcc20741998-08-04 22:53:56 +0000991#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +0000992 /* We have incomplete socket support. */
993 PyErr_SetString(PySocket_Error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +0000994 return NULL;
995#else
996
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000997 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
998 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +0000999 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001000
Guido van Rossumbe32c891996-06-20 16:25:29 +00001001 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001002 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001003 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001004 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001005 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001006 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001007 return PySocket_Err();
1008 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001009 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001010 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001011 PyErr_SetString(PySocket_Error,
1012 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001013 return NULL;
1014 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001015 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001016 if (buf == NULL)
1017 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001018 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001019 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001020 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001021 Py_DECREF(buf);
1022 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +00001023 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001024 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001025 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001026#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001027}
1028
Guido van Rossum82a5c661998-07-07 20:45:43 +00001029static char getsockopt_doc[] =
1030"getsockopt(level, option[, buffersize]) -> value\n\
1031\n\
1032Get a socket option. See the Unix manual for level and option.\n\
1033If a nonzero buffersize argument is given, the return value is a\n\
1034string of that length; otherwise it is an integer.";
1035
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001036
Fred Drake728819a2000-07-01 03:40:12 +00001037/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001038
Guido van Rossum73624e91994-10-10 17:59:00 +00001039static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001040PySocketSock_bind(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001041{
1042 struct sockaddr *addr;
1043 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001044 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001045 PyObject *addro;
1046 if (!PyArg_ParseTuple(args, "O:bind", &addro))
1047 return NULL;
1048 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001049 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001050 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001051 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001052 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001053 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001054 return PySocket_Err();
1055 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 bind_doc[] =
1060"bind(address)\n\
1061\n\
1062Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001063pair (host, port); the host must refer to the local host. For raw packet\n\
1064sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001065
Guido van Rossum30a685f1991-06-27 15:51:29 +00001066
1067/* s.close() method.
1068 Set the file descriptor to -1 so operations tried subsequently
1069 will surely fail. */
1070
Guido van Rossum73624e91994-10-10 17:59:00 +00001071static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001072PySocketSock_close(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001073{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001074 SOCKET_T fd;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001075 if (!PyArg_ParseTuple(args, ":close"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001076 return NULL;
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001077 if ((fd = s->sock_fd) != -1) {
1078 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001079 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001080 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001081 Py_END_ALLOW_THREADS
1082 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001083 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 close_doc[] =
1088"close()\n\
1089\n\
1090Close the socket. It cannot be used after this call.";
1091
Guido van Rossum30a685f1991-06-27 15:51:29 +00001092
Fred Drake728819a2000-07-01 03:40:12 +00001093/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001094
Guido van Rossum73624e91994-10-10 17:59:00 +00001095static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001096PySocketSock_connect(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001097{
1098 struct sockaddr *addr;
1099 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001100 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001101 PyObject *addro;
1102 if (!PyArg_ParseTuple(args, "O:connect", &addro))
1103 return NULL;
1104 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001105 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001106 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001107 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001108 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001109 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001110 return PySocket_Err();
1111 Py_INCREF(Py_None);
1112 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001113}
1114
Guido van Rossum82a5c661998-07-07 20:45:43 +00001115static char connect_doc[] =
1116"connect(address)\n\
1117\n\
1118Connect the socket to a remote address. For IP sockets, the address\n\
1119is a pair (host, port).";
1120
Guido van Rossum30a685f1991-06-27 15:51:29 +00001121
Fred Drake728819a2000-07-01 03:40:12 +00001122/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001123
1124static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001125PySocketSock_connect_ex(PySocketSockObject *s, PyObject *args)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001126{
1127 struct sockaddr *addr;
1128 int addrlen;
1129 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001130 PyObject *addro;
1131 if (!PyArg_ParseTuple(args, "O:connect_ex", &addro))
1132 return NULL;
1133 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001134 return NULL;
1135 Py_BEGIN_ALLOW_THREADS
1136 res = connect(s->sock_fd, addr, addrlen);
1137 Py_END_ALLOW_THREADS
1138 if (res != 0)
1139 res = errno;
1140 return PyInt_FromLong((long) res);
1141}
1142
Guido van Rossum82a5c661998-07-07 20:45:43 +00001143static char connect_ex_doc[] =
1144"connect_ex(address)\n\
1145\n\
1146This is like connect(address), but returns an error code (the errno value)\n\
1147instead of raising an exception when an error occurs.";
1148
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001149
Guido van Rossumed233a51992-06-23 09:07:03 +00001150/* s.fileno() method */
1151
Guido van Rossum73624e91994-10-10 17:59:00 +00001152static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001153PySocketSock_fileno(PySocketSockObject *s, PyObject *args)
Guido van Rossumed233a51992-06-23 09:07:03 +00001154{
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001155 if (!PyArg_ParseTuple(args, ":fileno"))
Guido van Rossumed233a51992-06-23 09:07:03 +00001156 return NULL;
Fred Drakea04eaad2000-06-30 02:46:07 +00001157#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001158 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001159#else
1160 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1161#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001162}
1163
Guido van Rossum82a5c661998-07-07 20:45:43 +00001164static char fileno_doc[] =
1165"fileno() -> integer\n\
1166\n\
1167Return the integer file descriptor of the socket.";
1168
Guido van Rossumed233a51992-06-23 09:07:03 +00001169
Guido van Rossumbe32c891996-06-20 16:25:29 +00001170#ifndef NO_DUP
1171/* s.dup() method */
1172
1173static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001174PySocketSock_dup(PySocketSockObject *s, PyObject *args)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001175{
Fred Drakea04eaad2000-06-30 02:46:07 +00001176 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001177 PyObject *sock;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001178 if (!PyArg_ParseTuple(args, ":dup"))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001179 return NULL;
1180 newfd = dup(s->sock_fd);
1181 if (newfd < 0)
1182 return PySocket_Err();
1183 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001184 s->sock_family,
1185 s->sock_type,
1186 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001187 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001188 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001189 return sock;
1190}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001191
1192static char dup_doc[] =
1193"dup() -> socket object\n\
1194\n\
1195Return a new socket object connected to the same system resource.";
1196
Guido van Rossumbe32c891996-06-20 16:25:29 +00001197#endif
1198
1199
Guido van Rossumc89705d1992-11-26 08:54:07 +00001200/* s.getsockname() method */
1201
Guido van Rossum73624e91994-10-10 17:59:00 +00001202static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001203PySocketSock_getsockname(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001204{
1205 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001206 int res;
1207 socklen_t addrlen;
1208
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001209 if (!PyArg_ParseTuple(args, ":getsockname"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001210 return NULL;
1211 if (!getsockaddrlen(s, &addrlen))
1212 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001213 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001214 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001215 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001216 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001217 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001218 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001219 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001220}
1221
Guido van Rossum82a5c661998-07-07 20:45:43 +00001222static char getsockname_doc[] =
1223"getsockname() -> address info\n\
1224\n\
1225Return the address of the local endpoint. For IP sockets, the address\n\
1226info is a pair (hostaddr, port).";
1227
Guido van Rossumc89705d1992-11-26 08:54:07 +00001228
Guido van Rossumb6775db1994-08-01 11:34:53 +00001229#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001230/* s.getpeername() method */
1231
Guido van Rossum73624e91994-10-10 17:59:00 +00001232static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001233PySocketSock_getpeername(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001234{
1235 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001236 int res;
1237 socklen_t addrlen;
1238
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001239 if (!PyArg_ParseTuple(args, ":getpeername"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001240 return NULL;
1241 if (!getsockaddrlen(s, &addrlen))
1242 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001243 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001244 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001245 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001246 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001247 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001248 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001249 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001250}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001251
1252static char getpeername_doc[] =
1253"getpeername() -> address info\n\
1254\n\
1255Return the address of the remote endpoint. For IP sockets, the address\n\
1256info is a pair (hostaddr, port).";
1257
Guido van Rossumb6775db1994-08-01 11:34:53 +00001258#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001259
1260
Guido van Rossum30a685f1991-06-27 15:51:29 +00001261/* s.listen(n) method */
1262
Guido van Rossum73624e91994-10-10 17:59:00 +00001263static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001264PySocketSock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001265{
1266 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001267 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001268 if (!PyArg_ParseTuple(args, "i:listen", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001269 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001270 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001271 if (backlog < 1)
1272 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001273 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001274 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001275 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001276 return PySocket_Err();
1277 Py_INCREF(Py_None);
1278 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001279}
1280
Guido van Rossum82a5c661998-07-07 20:45:43 +00001281static char listen_doc[] =
1282"listen(backlog)\n\
1283\n\
1284Enable a server to accept connections. The backlog argument must be at\n\
1285least 1; it specifies the number of unaccepted connection that the system\n\
1286will allow before refusing new connections.";
1287
1288
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001289#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001290/* s.makefile(mode) method.
1291 Create a new open file object referring to a dupped version of
1292 the socket's file descriptor. (The dup() call is necessary so
1293 that the open file and socket objects may be closed independent
1294 of each other.)
1295 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1296
Guido van Rossum73624e91994-10-10 17:59:00 +00001297static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001298PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001299{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001300 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001301 char *mode = "r";
1302 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001303#ifdef MS_WIN32
1304 intptr_t fd;
1305#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001306 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001307#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001308 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001309 PyObject *f;
1310
Guido van Rossum43713e52000-02-29 13:59:29 +00001311 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001312 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001313#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001314 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1315 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001316#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001317 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001318#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001319 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001320 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001321 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001322 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001323 }
1324 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1325 if (f != NULL)
1326 PyFile_SetBufSize(f, bufsize);
1327 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001328}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001329
1330static char makefile_doc[] =
1331"makefile([mode[, buffersize]]) -> file object\n\
1332\n\
1333Return a regular file object corresponding to the socket.\n\
1334The mode and buffersize arguments are as for the built-in open() function.";
1335
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001336#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001337
Guido van Rossum48a680c2001-03-02 06:34:14 +00001338
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001339/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001340
Guido van Rossum73624e91994-10-10 17:59:00 +00001341static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001342PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001343{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001344 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001345 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001346 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001347 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001348 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001349 if (buf == NULL)
1350 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001351 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001352 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001353 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001354 if (n < 0) {
1355 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001356 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001357 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001358 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001359 return NULL;
1360 return buf;
1361}
1362
Guido van Rossum82a5c661998-07-07 20:45:43 +00001363static char recv_doc[] =
1364"recv(buffersize[, flags]) -> data\n\
1365\n\
1366Receive up to buffersize bytes from the socket. For the optional flags\n\
1367argument, see the Unix manual. When no data is available, block until\n\
1368at least one byte is available or until the remote end is closed. When\n\
1369the remote end is closed and all data is read, return the empty string.";
1370
Guido van Rossum30a685f1991-06-27 15:51:29 +00001371
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001372/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001373
Guido van Rossum73624e91994-10-10 17:59:00 +00001374static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001375PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001376{
1377 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001378 PyObject *buf = NULL;
1379 PyObject *addr = NULL;
1380 PyObject *ret = NULL;
1381
Guido van Rossumff3ab422000-04-24 15:16:03 +00001382 int len, n, flags = 0;
1383 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001384 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001385 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001386 if (!getsockaddrlen(s, &addrlen))
1387 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001388 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001389 if (buf == NULL)
1390 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001391 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001392 memset(addrbuf, 0, addrlen);
1393 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001394#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001395#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001396 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001397#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001398 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001399#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001400#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001401 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001402#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001403 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001404 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001405 if (n < 0) {
1406 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001407 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001408 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001409 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001410 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001411
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001412 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001413 goto finally;
1414
Guido van Rossum73624e91994-10-10 17:59:00 +00001415 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001416 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001417 Py_XDECREF(addr);
1418 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001419 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001420}
1421
Guido van Rossum82a5c661998-07-07 20:45:43 +00001422static char recvfrom_doc[] =
1423"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1424\n\
1425Like recv(buffersize, flags) but also return the sender's address info.";
1426
Guido van Rossum30a685f1991-06-27 15:51:29 +00001427
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001428/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001429
Guido van Rossum73624e91994-10-10 17:59:00 +00001430static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001431PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001432{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001433 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001434 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001435 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001436 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001437 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001438 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001439 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001440 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001441 return PySocket_Err();
1442 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001443}
1444
Guido van Rossum82a5c661998-07-07 20:45:43 +00001445static char send_doc[] =
1446"send(data[, flags])\n\
1447\n\
1448Send a data string to the socket. For the optional flags\n\
1449argument, see the Unix manual.";
1450
Guido van Rossum30a685f1991-06-27 15:51:29 +00001451
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001452/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001453
Guido van Rossum73624e91994-10-10 17:59:00 +00001454static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001455PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001456{
Guido van Rossum73624e91994-10-10 17:59:00 +00001457 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001458 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001459 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001460 int addrlen, len, n, flags;
1461 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001462 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001463 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001464 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1465 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001466 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001467 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001468 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001469 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001470 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001471 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001472 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001473 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001474 return PySocket_Err();
1475 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001476}
1477
Guido van Rossum82a5c661998-07-07 20:45:43 +00001478static char sendto_doc[] =
1479"sendto(data[, flags], address)\n\
1480\n\
1481Like send(data, flags) but allows specifying the destination address.\n\
1482For IP sockets, the address is a pair (hostaddr, port).";
1483
Guido van Rossum30a685f1991-06-27 15:51:29 +00001484
1485/* s.shutdown(how) method */
1486
Guido van Rossum73624e91994-10-10 17:59:00 +00001487static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001488PySocketSock_shutdown(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001489{
1490 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001491 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001492 if (!PyArg_ParseTuple(args, "i:shutdown", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001493 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001494 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001495 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001496 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001497 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001498 return PySocket_Err();
1499 Py_INCREF(Py_None);
1500 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001501}
1502
Guido van Rossum82a5c661998-07-07 20:45:43 +00001503static char shutdown_doc[] =
1504"shutdown(flag)\n\
1505\n\
1506Shut down the reading side of the socket (flag == 0), the writing side\n\
1507of the socket (flag == 1), or both ends (flag == 2).";
1508
Guido van Rossum30a685f1991-06-27 15:51:29 +00001509
1510/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001511
Guido van Rossum73624e91994-10-10 17:59:00 +00001512static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001513 {"accept", (PyCFunction)PySocketSock_accept, METH_VARARGS,
1514 accept_doc},
1515 {"bind", (PyCFunction)PySocketSock_bind, METH_VARARGS,
1516 bind_doc},
1517 {"close", (PyCFunction)PySocketSock_close, METH_VARARGS,
1518 close_doc},
1519 {"connect", (PyCFunction)PySocketSock_connect, METH_VARARGS,
1520 connect_doc},
1521 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_VARARGS,
1522 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001523#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001524 {"dup", (PyCFunction)PySocketSock_dup, METH_VARARGS,
1525 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001526#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001527 {"fileno", (PyCFunction)PySocketSock_fileno, METH_VARARGS,
1528 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001529#ifdef HAVE_GETPEERNAME
Guido van Rossum48a680c2001-03-02 06:34:14 +00001530 {"getpeername", (PyCFunction)PySocketSock_getpeername, METH_VARARGS,
1531 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001532#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001533 {"getsockname", (PyCFunction)PySocketSock_getsockname, METH_VARARGS,
1534 getsockname_doc},
1535 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1536 getsockopt_doc},
1537 {"listen", (PyCFunction)PySocketSock_listen, METH_VARARGS,
1538 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001539#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001540 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1541 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001542#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001543 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1544 recv_doc},
1545 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1546 recvfrom_doc},
1547 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1548 send_doc},
1549 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1550 sendto_doc},
1551 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_VARARGS,
1552 setblocking_doc},
1553 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1554 setsockopt_doc},
1555 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_VARARGS,
1556 shutdown_doc},
1557#ifdef RISCOS
1558 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1559 sleeptaskw_doc},
1560#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001561 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001562};
1563
Guido van Rossum30a685f1991-06-27 15:51:29 +00001564
Guido van Rossum73624e91994-10-10 17:59:00 +00001565/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001566 First close the file description. */
1567
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001568static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001569PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001570{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001571 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001572 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001573 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001574}
1575
Guido van Rossum30a685f1991-06-27 15:51:29 +00001576
1577/* Return a socket object's named attribute. */
1578
Guido van Rossum73624e91994-10-10 17:59:00 +00001579static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001580PySocketSock_getattr(PySocketSockObject *s, char *name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001581{
Guido van Rossum73624e91994-10-10 17:59:00 +00001582 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001583}
1584
Guido van Rossum30a685f1991-06-27 15:51:29 +00001585
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001586static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001587PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001588{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001589 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001590#if SIZEOF_SOCKET_T > SIZEOF_LONG
1591 if (s->sock_fd > LONG_MAX) {
1592 /* this can occur on Win64, and actually there is a special
1593 ugly printf formatter for decimal pointer length integer
1594 printing, only bother if necessary*/
1595 PyErr_SetString(PyExc_OverflowError,
1596 "no printf formatter to display the socket descriptor in decimal");
1597 return NULL;
1598 }
1599#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001600 sprintf(buf,
1601 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
Fred Drakea04eaad2000-06-30 02:46:07 +00001602 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001603 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001604}
1605
1606
Guido van Rossumb6775db1994-08-01 11:34:53 +00001607/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001608
Guido van Rossum73624e91994-10-10 17:59:00 +00001609static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001610 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001611 0,
1612 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001613 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001614 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001615 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001616 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001617 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001618 0, /*tp_setattr*/
1619 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001620 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001621 0, /*tp_as_number*/
1622 0, /*tp_as_sequence*/
1623 0, /*tp_as_mapping*/
1624};
1625
Guido van Rossum30a685f1991-06-27 15:51:29 +00001626
Guido van Rossum81194471991-07-27 21:42:02 +00001627/* Python interface to gethostname(). */
1628
1629/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001630static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001631PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001632{
1633 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001634 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001635 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001636 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001637 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001638 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001639 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001640 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001641 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001642 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001643 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001644}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001645
Guido van Rossum82a5c661998-07-07 20:45:43 +00001646static char gethostname_doc[] =
1647"gethostname() -> string\n\
1648\n\
1649Return the current host name.";
1650
Guido van Rossumff4949e1992-08-05 19:58:53 +00001651
Guido van Rossum30a685f1991-06-27 15:51:29 +00001652/* Python interface to gethostbyname(name). */
1653
1654/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001655static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001656PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001657{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001658 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001659 struct sockaddr_in addrbuf;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001660 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001661 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001662 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001663 return NULL;
1664 return makeipaddr(&addrbuf);
1665}
1666
Guido van Rossum82a5c661998-07-07 20:45:43 +00001667static char gethostbyname_doc[] =
1668"gethostbyname(host) -> address\n\
1669\n\
1670Return the IP address (a string of the form '255.255.255.255') for a host.";
1671
1672
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001673/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1674
1675static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001676gethost_common(struct hostent *h, struct sockaddr_in *addr)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001677{
1678 char **pch;
1679 PyObject *rtn_tuple = (PyObject *)NULL;
1680 PyObject *name_list = (PyObject *)NULL;
1681 PyObject *addr_list = (PyObject *)NULL;
1682 PyObject *tmp;
1683 if (h == NULL) {
1684#ifdef HAVE_HSTRERROR
Guido van Rossum48a680c2001-03-02 06:34:14 +00001685 /* Let's get real error message to return */
1686 extern int h_errno;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001687 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1688#else
1689 PyErr_SetString(PySocket_Error, "host not found");
1690#endif
1691 return NULL;
1692 }
1693 if ((name_list = PyList_New(0)) == NULL)
1694 goto err;
1695 if ((addr_list = PyList_New(0)) == NULL)
1696 goto err;
1697 for (pch = h->h_aliases; *pch != NULL; pch++) {
1698 int status;
1699 tmp = PyString_FromString(*pch);
1700 if (tmp == NULL)
1701 goto err;
1702 status = PyList_Append(name_list, tmp);
1703 Py_DECREF(tmp);
1704 if (status)
1705 goto err;
1706 }
1707 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1708 int status;
1709 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1710 tmp = makeipaddr(addr);
1711 if (tmp == NULL)
1712 goto err;
1713 status = PyList_Append(addr_list, tmp);
1714 Py_DECREF(tmp);
1715 if (status)
1716 goto err;
1717 }
1718 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1719 err:
1720 Py_XDECREF(name_list);
1721 Py_XDECREF(addr_list);
1722 return rtn_tuple;
1723}
1724
1725
1726/* Python interface to gethostbyname_ex(name). */
1727
1728/*ARGSUSED*/
1729static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001730PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001731{
1732 char *name;
1733 struct hostent *h;
1734 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001735 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001736#ifdef HAVE_GETHOSTBYNAME_R
1737 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001738#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1739 struct hostent_data data;
1740#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001741 char buf[16384];
1742 int buf_len = (sizeof buf) - 1;
1743 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001744#endif
1745#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001746 int result;
1747#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001748#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001749 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001750 return NULL;
1751 if (setipaddr(name, &addr) < 0)
1752 return NULL;
1753 Py_BEGIN_ALLOW_THREADS
1754#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001755#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001756 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001757#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001758 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001759#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001760 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001761 result = gethostbyname_r(name, &hp_allocated, &data);
1762 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001763#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001764#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001765#ifdef USE_GETHOSTBYNAME_LOCK
1766 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001767#endif
1768 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001769#endif /* HAVE_GETHOSTBYNAME_R */
1770 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001771 ret = gethost_common(h, &addr);
1772#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001773 PyThread_release_lock(gethostbyname_lock);
1774#endif
1775 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001776}
1777
1778static char ghbn_ex_doc[] =
1779"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1780\n\
1781Return the true host name, a list of aliases, and a list of IP addresses,\n\
1782for a host. The host argument is a string giving a host name or IP number.";
1783
1784
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001785/* Python interface to gethostbyaddr(IP). */
1786
1787/*ARGSUSED*/
1788static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001789PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001790{
Guido van Rossum48a680c2001-03-02 06:34:14 +00001791 struct sockaddr_in addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001792 char *ip_num;
1793 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001794 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001795#ifdef HAVE_GETHOSTBYNAME_R
1796 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001797#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1798 struct hostent_data data;
1799#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001800 char buf[16384];
1801 int buf_len = (sizeof buf) - 1;
1802 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001803#endif
1804#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001805 int result;
1806#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001807#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001808
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001809 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001810 return NULL;
1811 if (setipaddr(ip_num, &addr) < 0)
1812 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001813 Py_BEGIN_ALLOW_THREADS
1814#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001815#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001816 result = gethostbyaddr_r((char *)&addr.sin_addr,
1817 sizeof(addr.sin_addr),
1818 AF_INET, &hp_allocated, buf, buf_len,
1819 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001820#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001821 h = gethostbyaddr_r((char *)&addr.sin_addr,
1822 sizeof(addr.sin_addr),
Guido van Rossum48a680c2001-03-02 06:34:14 +00001823 AF_INET,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001824 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001825#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001826 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001827 result = gethostbyaddr_r((char *)&addr.sin_addr,
1828 sizeof(addr.sin_addr),
1829 AF_INET, &hp_allocated, &data);
1830 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001831#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001832#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001833#ifdef USE_GETHOSTBYNAME_LOCK
1834 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001835#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001836 h = gethostbyaddr((char *)&addr.sin_addr,
1837 sizeof(addr.sin_addr),
1838 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001839#endif /* HAVE_GETHOSTBYNAME_R */
1840 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001841 ret = gethost_common(h, &addr);
1842#ifdef USE_GETHOSTBYNAME_LOCK
1843 PyThread_release_lock(gethostbyname_lock);
1844#endif
1845 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001846}
1847
Guido van Rossum82a5c661998-07-07 20:45:43 +00001848static char gethostbyaddr_doc[] =
1849"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1850\n\
1851Return the true host name, a list of aliases, and a list of IP addresses,\n\
1852for a host. The host argument is a string giving a host name or IP number.";
1853
Guido van Rossum30a685f1991-06-27 15:51:29 +00001854
1855/* Python interface to getservbyname(name).
1856 This only returns the port number, since the other info is already
1857 known or not useful (like the list of aliases). */
1858
1859/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001860static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001861PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001862{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001863 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001864 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001865 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001866 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001867 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001868 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001869 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001870 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001871 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001872 return NULL;
1873 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001874 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001875}
1876
Guido van Rossum82a5c661998-07-07 20:45:43 +00001877static char getservbyname_doc[] =
1878"getservbyname(servicename, protocolname) -> integer\n\
1879\n\
1880Return a port number from a service name and protocol name.\n\
1881The protocol name should be 'tcp' or 'udp'.";
1882
Guido van Rossum30a685f1991-06-27 15:51:29 +00001883
Guido van Rossum3901d851996-12-19 16:35:04 +00001884/* Python interface to getprotobyname(name).
1885 This only returns the protocol number, since the other info is
1886 already known or not useful (like the list of aliases). */
1887
1888/*ARGSUSED*/
1889static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001890PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00001891{
1892 char *name;
1893 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001894#ifdef __BEOS__
1895/* Not available in BeOS yet. - [cjh] */
1896 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1897 return NULL;
1898#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001899 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00001900 return NULL;
1901 Py_BEGIN_ALLOW_THREADS
1902 sp = getprotobyname(name);
1903 Py_END_ALLOW_THREADS
1904 if (sp == NULL) {
1905 PyErr_SetString(PySocket_Error, "protocol not found");
1906 return NULL;
1907 }
1908 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001909#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001910}
1911
Guido van Rossum82a5c661998-07-07 20:45:43 +00001912static char getprotobyname_doc[] =
1913"getprotobyname(name) -> integer\n\
1914\n\
1915Return the protocol number for the named protocol. (Rarely used.)";
1916
Guido van Rossum3901d851996-12-19 16:35:04 +00001917
Guido van Rossum30a685f1991-06-27 15:51:29 +00001918/* Python interface to socket(family, type, proto).
1919 The third (protocol) argument is optional.
1920 Return a new socket object. */
1921
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001922/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001923static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001924PySocket_socket(PyObject *self, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001925{
Guido van Rossum73624e91994-10-10 17:59:00 +00001926 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001927 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001928 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001929 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001930 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001931 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001932 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001933 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001934#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001935 if (fd == INVALID_SOCKET)
1936#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001937 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001938#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001939 return PySocket_Err();
1940 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001941 /* If the object can't be created, don't forget to close the
1942 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001943 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001944 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001945 /* From now on, ignore SIGPIPE and let the error checking
1946 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001947#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001948 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00001949#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001950 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001951}
1952
Guido van Rossum82a5c661998-07-07 20:45:43 +00001953static char socket_doc[] =
1954"socket(family, type[, proto]) -> socket object\n\
1955\n\
1956Open a socket of the given type. The family argument specifies the\n\
1957address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1958The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1959or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1960specifying the default protocol.";
1961
1962
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001963#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001964/* Create a socket object from a numeric file description.
1965 Useful e.g. if stdin is a socket.
1966 Additional arguments as for socket(). */
1967
1968/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001969static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001970PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001971{
Guido van Rossum73624e91994-10-10 17:59:00 +00001972 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001973 SOCKET_T fd;
1974 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001975 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
1976 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001977 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001978 /* Dup the fd so it and the socket can be closed independently */
1979 fd = dup(fd);
1980 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001981 return PySocket_Err();
1982 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001983 /* From now on, ignore SIGPIPE and let the error checking
1984 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001985#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001986 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00001987#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001988 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001989}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001990
1991static char fromfd_doc[] =
1992"fromfd(fd, family, type[, proto]) -> socket object\n\
1993\n\
1994Create a socket object from the given file descriptor.\n\
1995The remaining arguments are the same as for socket().";
1996
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001997#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001998
Guido van Rossum82a5c661998-07-07 20:45:43 +00001999
Guido van Rossum006bf911996-06-12 04:04:55 +00002000static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002001PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002002{
2003 int x1, x2;
2004
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002005 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002006 return NULL;
2007 }
2008 x2 = (int)ntohs((short)x1);
2009 return PyInt_FromLong(x2);
2010}
2011
Guido van Rossum82a5c661998-07-07 20:45:43 +00002012static char ntohs_doc[] =
2013"ntohs(integer) -> integer\n\
2014\n\
2015Convert a 16-bit integer from network to host byte order.";
2016
2017
Guido van Rossum006bf911996-06-12 04:04:55 +00002018static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002019PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002020{
2021 int x1, x2;
2022
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002023 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002024 return NULL;
2025 }
2026 x2 = ntohl(x1);
2027 return PyInt_FromLong(x2);
2028}
2029
Guido van Rossum82a5c661998-07-07 20:45:43 +00002030static char ntohl_doc[] =
2031"ntohl(integer) -> integer\n\
2032\n\
2033Convert a 32-bit integer from network to host byte order.";
2034
2035
Guido van Rossum006bf911996-06-12 04:04:55 +00002036static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002037PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002038{
2039 int x1, x2;
2040
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002041 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002042 return NULL;
2043 }
2044 x2 = (int)htons((short)x1);
2045 return PyInt_FromLong(x2);
2046}
2047
Guido van Rossum82a5c661998-07-07 20:45:43 +00002048static char htons_doc[] =
2049"htons(integer) -> integer\n\
2050\n\
2051Convert a 16-bit integer from host to network byte order.";
2052
2053
Guido van Rossum006bf911996-06-12 04:04:55 +00002054static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002055PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002056{
2057 int x1, x2;
2058
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002059 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002060 return NULL;
2061 }
2062 x2 = htonl(x1);
2063 return PyInt_FromLong(x2);
2064}
2065
Guido van Rossum82a5c661998-07-07 20:45:43 +00002066static char htonl_doc[] =
2067"htonl(integer) -> integer\n\
2068\n\
2069Convert a 32-bit integer from host to network byte order.";
2070
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002071/*
2072 * socket.inet_aton() and socket.inet_ntoa() functions
2073 *
2074 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2075 *
2076 */
2077
Guido van Rossum48a680c2001-03-02 06:34:14 +00002078static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002079"inet_aton(string) -> packed 32-bit IP representation\n\
2080\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002081Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002082binary format used in low-level network functions.";
2083
2084static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002085PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002086{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002087#ifndef INADDR_NONE
2088#define INADDR_NONE (-1)
2089#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002090
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002091 /* Have to use inet_addr() instead */
2092 char *ip_addr;
2093 long packed_addr;
2094
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002095 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002096 return NULL;
2097 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00002098#ifdef USE_GUSI1
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002099 packed_addr = (long)inet_addr(ip_addr).s_addr;
2100#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002101 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002102#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002103
2104 if (packed_addr == INADDR_NONE) { /* invalid address */
2105 PyErr_SetString(PySocket_Error,
2106 "illegal IP address string passed to inet_aton");
2107 return NULL;
2108 }
2109
2110 return PyString_FromStringAndSize((char *) &packed_addr,
2111 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002112}
2113
Guido van Rossum48a680c2001-03-02 06:34:14 +00002114static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002115"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002116\n\
2117Convert an IP address from 32-bit packed binary format to string format";
2118
2119static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002120PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002121{
2122 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002123 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002124 struct in_addr packed_addr;
2125
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002126 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002127 return NULL;
2128 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002129
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002130 if (addr_len != sizeof(packed_addr)) {
2131 PyErr_SetString(PySocket_Error,
2132 "packed IP wrong length for inet_ntoa");
2133 return NULL;
2134 }
2135
2136 memcpy(&packed_addr, packed_str, addr_len);
2137
2138 return PyString_FromString(inet_ntoa(packed_addr));
2139}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002140
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002141
2142#ifdef USE_SSL
2143
2144/* This is a C function to be called for new object initialization */
2145static SSLObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002146newSSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002147{
2148 SSLObject *self;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002149
Guido van Rossumb18618d2000-05-03 23:44:39 +00002150 self = PyObject_New(SSLObject, &SSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002151 if (self == NULL){
2152 PyErr_SetObject(SSLErrorObject,
2153 PyString_FromString("newSSLObject error"));
2154 return NULL;
2155 }
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002156 memset(self->server, '\0', sizeof(char) * 256);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002157 memset(self->issuer, '\0', sizeof(char) * 256);
2158
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002159 self->x_attr = PyDict_New();
2160 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
2161 if (self->ctx == NULL) {
2162 PyErr_SetObject(SSLErrorObject,
2163 PyString_FromString("SSL_CTX_new error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002164 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002165 return NULL;
2166 }
2167
2168 if ( (key_file && !cert_file) || (!key_file && cert_file) )
2169 {
2170 PyErr_SetObject(SSLErrorObject,
2171 PyString_FromString(
2172 "Both the key & certificate files must be specified"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002173 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002174 return NULL;
2175 }
2176
2177 if (key_file && cert_file)
2178 {
2179 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
2180 SSL_FILETYPE_PEM) < 1)
2181 {
2182 PyErr_SetObject(SSLErrorObject,
2183 PyString_FromString(
2184 "SSL_CTX_use_PrivateKey_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002185 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002186 return NULL;
2187 }
2188
2189 if (SSL_CTX_use_certificate_chain_file(self->ctx,
2190 cert_file) < 1)
2191 {
2192 PyErr_SetObject(SSLErrorObject,
2193 PyString_FromString(
2194 "SSL_CTX_use_certificate_chain_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002195 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002196 return NULL;
2197 }
2198 }
2199
2200 SSL_CTX_set_verify(self->ctx,
2201 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2202 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2203 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2204 SSL_set_connect_state(self->ssl);
2205
2206 if ((SSL_connect(self->ssl)) == -1) {
2207 /* Actually negotiate SSL connection */
2208 PyErr_SetObject(SSLErrorObject,
2209 PyString_FromString("SSL_connect error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002210 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002211 return NULL;
2212 }
2213 self->ssl->debug = 1;
2214
2215 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2216 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
2217 self->server, 256);
2218 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2219 self->issuer, 256);
2220 }
2221 self->x_attr = NULL;
2222 self->Socket = Sock;
2223 Py_INCREF(self->Socket);
2224 return self;
2225}
2226
2227/* This is the Python function called for new object initialization */
2228static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002229PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002230{
2231 SSLObject *rv;
2232 PySocketSockObject *Sock;
2233 char *key_file;
2234 char *cert_file;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002235
Guido van Rossum43713e52000-02-29 13:59:29 +00002236 if (!PyArg_ParseTuple(args, "O!zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002237 &PySocketSock_Type, (PyObject*)&Sock,
2238 &key_file, &cert_file) )
2239 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002240
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002241 rv = newSSLObject(Sock, key_file, cert_file);
2242 if ( rv == NULL )
2243 return NULL;
2244 return (PyObject *)rv;
2245}
2246
2247static char ssl_doc[] =
2248"ssl(socket, keyfile, certfile) -> sslobject";
2249
2250static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002251SSL_server(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002252{
2253 return PyString_FromString(self->server);
2254}
2255
2256static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002257SSL_issuer(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002258{
2259 return PyString_FromString(self->issuer);
2260}
2261
2262
2263/* SSL object methods */
2264
2265static PyMethodDef SSLMethods[] = {
2266 { "write", (PyCFunction)SSL_SSLwrite, 1 },
2267 { "read", (PyCFunction)SSL_SSLread, 1 },
2268 { "server", (PyCFunction)SSL_server, 1 },
2269 { "issuer", (PyCFunction)SSL_issuer, 1 },
2270 { NULL, NULL}
2271};
2272
2273static void SSL_dealloc(SSLObject *self)
2274{
2275 if (self->server_cert) /* Possible not to have one? */
2276 X509_free (self->server_cert);
2277 SSL_CTX_free(self->ctx);
2278 SSL_free(self->ssl);
2279 Py_XDECREF(self->x_attr);
2280 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002281 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002282}
2283
2284static PyObject *SSL_getattr(SSLObject *self, char *name)
2285{
2286 return Py_FindMethod(SSLMethods, (PyObject *)self, name);
2287}
2288
2289staticforward PyTypeObject SSL_Type = {
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002290 PyObject_HEAD_INIT(NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002291 0, /*ob_size*/
2292 "SSL", /*tp_name*/
2293 sizeof(SSLObject), /*tp_basicsize*/
2294 0, /*tp_itemsize*/
2295 /* methods */
2296 (destructor)SSL_dealloc, /*tp_dealloc*/
2297 0, /*tp_print*/
2298 (getattrfunc)SSL_getattr, /*tp_getattr*/
2299 0, /*tp_setattr*/
2300 0, /*tp_compare*/
2301 0, /*tp_repr*/
2302 0, /*tp_as_number*/
2303 0, /*tp_as_sequence*/
2304 0, /*tp_as_mapping*/
2305 0, /*tp_hash*/
2306};
2307
2308
2309
2310static PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args)
2311{
2312 char *data;
Andrew M. Kuchlingb38175e2001-02-07 20:41:17 +00002313 size_t len;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002314
Andrew M. Kuchlingb38175e2001-02-07 20:41:17 +00002315 if (!PyArg_ParseTuple(args, "s#:write", &data, &len))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002316 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002317
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002318 len = SSL_write(self->ssl, data, len);
2319 return PyInt_FromLong((long)len);
2320}
2321
2322static PyObject *SSL_SSLread(SSLObject *self, PyObject *args)
2323{
2324 PyObject *buf;
2325 int count = 0;
2326 int len = 1024;
2327 int res;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002328
Guido van Rossum43713e52000-02-29 13:59:29 +00002329 PyArg_ParseTuple(args, "|i:read", &len);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002330
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002331 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2332 return NULL; /* Error object should already be set */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002333
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002334 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2335 res = SSL_get_error(self->ssl, count);
2336
2337 switch (res) {
Jeremy Hylton42dd01a2001-02-01 23:35:20 +00002338 case SSL_ERROR_NONE:
2339 assert(count > 0);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002340 break;
Jeremy Hylton42dd01a2001-02-01 23:35:20 +00002341 case SSL_ERROR_ZERO_RETURN: /* normal EOF */
2342 assert(count == 0);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002343 break;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002344 default:
2345 return PyErr_SetFromErrno(SSLErrorObject);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002346 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002347
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002348 fflush(stderr);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002349
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002350 if (count < 0) {
2351 Py_DECREF(buf);
2352 return PyErr_SetFromErrno(SSLErrorObject);
2353 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002354
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002355 if (count != len && _PyString_Resize(&buf, count) < 0)
2356 return NULL;
2357 return buf;
2358}
2359
2360#endif /* USE_SSL */
2361
2362
Guido van Rossum30a685f1991-06-27 15:51:29 +00002363/* List of functions exported by this module. */
2364
Guido van Rossum73624e91994-10-10 17:59:00 +00002365static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002366 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002367 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002368 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002369 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002370 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002371 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002372 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002373 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002374 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002375 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002376 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002377 METH_VARARGS,getprotobyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002378 {"socket", PySocket_socket,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002379 METH_VARARGS, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002380#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002381 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002382 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002383#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002384 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002385 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002386 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002387 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002388 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002389 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002390 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002391 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002392 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002393 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002394 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002395 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002396#ifdef USE_SSL
Guido van Rossum48a680c2001-03-02 06:34:14 +00002397 {"ssl", PySocket_ssl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002398 METH_VARARGS, ssl_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002399#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002400 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002401};
2402
Guido van Rossum30a685f1991-06-27 15:51:29 +00002403
2404/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002405 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002406 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002407 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002408static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002409insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002410{
Guido van Rossum73624e91994-10-10 17:59:00 +00002411 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002412 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002413 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002414
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002415 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002416}
2417
Guido van Rossum30a685f1991-06-27 15:51:29 +00002418
Guido van Rossum8d665e61996-06-26 18:22:49 +00002419#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002420
2421/* Additional initialization and cleanup for NT/Windows */
2422
2423static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002424NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002425{
2426 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002427}
2428
2429static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002430NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002431{
2432 WSADATA WSAData;
2433 int ret;
2434 char buf[100];
2435 ret = WSAStartup(0x0101, &WSAData);
2436 switch (ret) {
2437 case 0: /* no error */
2438 atexit(NTcleanup);
2439 return 1;
2440 case WSASYSNOTREADY:
2441 PyErr_SetString(PyExc_ImportError,
2442 "WSAStartup failed: network not ready");
2443 break;
2444 case WSAVERNOTSUPPORTED:
2445 case WSAEINVAL:
2446 PyErr_SetString(PyExc_ImportError,
2447 "WSAStartup failed: requested version not supported");
2448 break;
2449 default:
2450 sprintf(buf, "WSAStartup failed: error code %d", ret);
2451 PyErr_SetString(PyExc_ImportError, buf);
2452 break;
2453 }
2454 return 0;
2455}
2456
Guido van Rossum8d665e61996-06-26 18:22:49 +00002457#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002458
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002459#if defined(PYOS_OS2)
2460
2461/* Additional initialization and cleanup for OS/2 */
2462
2463static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002464OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002465{
2466 /* No cleanup is necessary for OS/2 Sockets */
2467}
2468
2469static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002470OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002471{
2472 char reason[64];
2473 int rc = sock_init();
2474
2475 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002476 atexit(OS2cleanup);
2477 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002478 }
2479
2480 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2481 PyErr_SetString(PyExc_ImportError, reason);
2482
Guido van Rossum32c575d1997-12-02 20:37:32 +00002483 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002484}
2485
2486#endif /* PYOS_OS2 */
2487
Guido van Rossum30a685f1991-06-27 15:51:29 +00002488/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002489 * This is called when the first 'import socket' is done,
2490 * via a table in config.c, if config.c is compiled with USE_SOCKET
2491 * defined.
2492 *
2493 * For MS_WINDOWS (which means any Windows variant), this module
2494 * is actually called "_socket", and there's a wrapper "socket.py"
2495 * which implements some missing functionality (such as makefile(),
2496 * dup() and fromfd()). The import of "_socket" may fail with an
2497 * ImportError exception if initialization of WINSOCK fails. When
2498 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2499 * scheduled to be made at exit time.
2500 *
2501 * For OS/2, this module is also called "_socket" and uses a wrapper
2502 * "socket.py" which implements that functionality that is missing
2503 * when PC operating systems don't put socket descriptors in the
2504 * operating system's filesystem layer.
2505 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002506
Guido van Rossum82a5c661998-07-07 20:45:43 +00002507static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00002508"Implementation module for socket operations. See the socket module\n\
2509for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00002510
2511static char sockettype_doc[] =
2512"A socket represents one endpoint of a network connection.\n\
2513\n\
2514Methods:\n\
2515\n\
2516accept() -- accept a connection, returning new socket and client address\n\
2517bind() -- bind the socket to a local address\n\
2518close() -- close the socket\n\
2519connect() -- connect the socket to a remote address\n\
2520connect_ex() -- connect, return an error code instead of an exception \n\
2521dup() -- return a new socket object identical to the current one (*)\n\
2522fileno() -- return underlying file descriptor\n\
2523getpeername() -- return remote address (*)\n\
2524getsockname() -- return local address\n\
2525getsockopt() -- get socket options\n\
2526listen() -- start listening for incoming connections\n\
2527makefile() -- return a file object corresponding tot the socket (*)\n\
2528recv() -- receive data\n\
2529recvfrom() -- receive data and sender's address\n\
2530send() -- send data\n\
2531sendto() -- send data to a given address\n\
2532setblocking() -- set or clear the blocking I/O flag\n\
2533setsockopt() -- set socket options\n\
2534shutdown() -- shut down traffic in one or both directions\n\
2535\n\
2536(*) not available on all platforms!)";
2537
Guido van Rossum3886bb61998-12-04 18:50:17 +00002538DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002539init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002540{
Guido van Rossum73624e91994-10-10 17:59:00 +00002541 PyObject *m, *d;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002542#ifdef RISCOS
2543 _kernel_swi_regs r;
2544 r.r[0]=0;
2545 _kernel_swi(0x43380, &r, &r);
2546 taskwindow = r.r[0];
2547#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00002548#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002549 if (!NTinit())
2550 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002551#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002552#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002553 if (!OS2init())
2554 return;
Fred Drakea136d492000-08-16 14:18:30 +00002555#endif /* __TOS_OS2__ */
2556#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002557#endif /* RISCOS */
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002558#ifdef USE_SSL
2559 SSL_Type.ob_type = &PyType_Type;
2560#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00002561 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00002562 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002563 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2564 if (PySocket_Error == NULL)
2565 return;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002566#ifdef USE_SSL
2567 SSL_load_error_strings();
2568 SSLeay_add_ssl_algorithms();
2569 SSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2570 if (SSLErrorObject == NULL)
2571 return;
2572 PyDict_SetItemString(d, "sslerror", SSLErrorObject);
2573 Py_INCREF(&SSL_Type);
2574 if (PyDict_SetItemString(d, "SSLType",
2575 (PyObject *)&SSL_Type) != 0)
2576 return;
2577#endif /* USE_SSL */
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002578 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002579 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002580 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002581 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002582 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002583 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002584 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002585
2586 /* Address families (we only support AF_INET and AF_UNIX) */
2587#ifdef AF_UNSPEC
2588 insint(d, "AF_UNSPEC", AF_UNSPEC);
2589#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002590 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002591#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002592 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002593#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002594#ifdef AF_AX25
2595 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2596#endif
2597#ifdef AF_IPX
2598 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2599#endif
2600#ifdef AF_APPLETALK
2601 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2602#endif
2603#ifdef AF_NETROM
2604 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2605#endif
2606#ifdef AF_BRIDGE
2607 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2608#endif
2609#ifdef AF_AAL5
2610 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2611#endif
2612#ifdef AF_X25
2613 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2614#endif
2615#ifdef AF_INET6
2616 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2617#endif
2618#ifdef AF_ROSE
2619 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2620#endif
Jeremy Hylton22308652001-02-02 03:23:09 +00002621#if defined(linux) && defined(AF_PACKET)
2622 insint(d, "AF_PACKET", AF_PACKET);
2623 insint(d, "PF_PACKET", PF_PACKET);
2624 insint(d, "PACKET_HOST", PACKET_HOST);
2625 insint(d, "PACKET_BROADCAST", PACKET_BROADCAST);
2626 insint(d, "PACKET_MULTICAST", PACKET_MULTICAST);
2627 insint(d, "PACKET_OTHERHOST", PACKET_OTHERHOST);
2628 insint(d, "PACKET_OUTGOING", PACKET_OUTGOING);
2629 insint(d, "PACKET_LOOPBACK", PACKET_LOOPBACK);
2630 insint(d, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002631#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002632
2633 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002634 insint(d, "SOCK_STREAM", SOCK_STREAM);
2635 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002636#ifndef __BEOS__
2637/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002638 insint(d, "SOCK_RAW", SOCK_RAW);
2639 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2640 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002641#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002642
2643#ifdef SO_DEBUG
2644 insint(d, "SO_DEBUG", SO_DEBUG);
2645#endif
2646#ifdef SO_ACCEPTCONN
2647 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2648#endif
2649#ifdef SO_REUSEADDR
2650 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2651#endif
2652#ifdef SO_KEEPALIVE
2653 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2654#endif
2655#ifdef SO_DONTROUTE
2656 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2657#endif
2658#ifdef SO_BROADCAST
2659 insint(d, "SO_BROADCAST", SO_BROADCAST);
2660#endif
2661#ifdef SO_USELOOPBACK
2662 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2663#endif
2664#ifdef SO_LINGER
2665 insint(d, "SO_LINGER", SO_LINGER);
2666#endif
2667#ifdef SO_OOBINLINE
2668 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2669#endif
2670#ifdef SO_REUSEPORT
2671 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2672#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002673#ifdef SO_SNDBUF
2674 insint(d, "SO_SNDBUF", SO_SNDBUF);
2675#endif
2676#ifdef SO_RCVBUF
2677 insint(d, "SO_RCVBUF", SO_RCVBUF);
2678#endif
2679#ifdef SO_SNDLOWAT
2680 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2681#endif
2682#ifdef SO_RCVLOWAT
2683 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2684#endif
2685#ifdef SO_SNDTIMEO
2686 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2687#endif
2688#ifdef SO_RCVTIMEO
2689 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2690#endif
2691#ifdef SO_ERROR
2692 insint(d, "SO_ERROR", SO_ERROR);
2693#endif
2694#ifdef SO_TYPE
2695 insint(d, "SO_TYPE", SO_TYPE);
2696#endif
2697
2698 /* Maximum number of connections for "listen" */
2699#ifdef SOMAXCONN
2700 insint(d, "SOMAXCONN", SOMAXCONN);
2701#else
2702 insint(d, "SOMAXCONN", 5); /* Common value */
2703#endif
2704
2705 /* Flags for send, recv */
2706#ifdef MSG_OOB
2707 insint(d, "MSG_OOB", MSG_OOB);
2708#endif
2709#ifdef MSG_PEEK
2710 insint(d, "MSG_PEEK", MSG_PEEK);
2711#endif
2712#ifdef MSG_DONTROUTE
2713 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2714#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002715#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00002716 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002717#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002718#ifdef MSG_EOR
2719 insint(d, "MSG_EOR", MSG_EOR);
2720#endif
2721#ifdef MSG_TRUNC
2722 insint(d, "MSG_TRUNC", MSG_TRUNC);
2723#endif
2724#ifdef MSG_CTRUNC
2725 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2726#endif
2727#ifdef MSG_WAITALL
2728 insint(d, "MSG_WAITALL", MSG_WAITALL);
2729#endif
2730#ifdef MSG_BTAG
2731 insint(d, "MSG_BTAG", MSG_BTAG);
2732#endif
2733#ifdef MSG_ETAG
2734 insint(d, "MSG_ETAG", MSG_ETAG);
2735#endif
2736
2737 /* Protocol level and numbers, usable for [gs]etsockopt */
2738#ifdef SOL_SOCKET
2739 insint(d, "SOL_SOCKET", SOL_SOCKET);
2740#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002741#ifdef SOL_IP
2742 insint(d, "SOL_IP", SOL_IP);
2743#else
2744 insint(d, "SOL_IP", 0);
2745#endif
2746#ifdef SOL_IPX
2747 insint(d, "SOL_IPX", SOL_IPX);
2748#endif
2749#ifdef SOL_AX25
2750 insint(d, "SOL_AX25", SOL_AX25);
2751#endif
2752#ifdef SOL_ATALK
2753 insint(d, "SOL_ATALK", SOL_ATALK);
2754#endif
2755#ifdef SOL_NETROM
2756 insint(d, "SOL_NETROM", SOL_NETROM);
2757#endif
2758#ifdef SOL_ROSE
2759 insint(d, "SOL_ROSE", SOL_ROSE);
2760#endif
2761#ifdef SOL_TCP
2762 insint(d, "SOL_TCP", SOL_TCP);
2763#else
2764 insint(d, "SOL_TCP", 6);
2765#endif
2766#ifdef SOL_UDP
2767 insint(d, "SOL_UDP", SOL_UDP);
2768#else
2769 insint(d, "SOL_UDP", 17);
2770#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002771#ifdef IPPROTO_IP
2772 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002773#else
2774 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002775#endif
2776#ifdef IPPROTO_ICMP
2777 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002778#else
2779 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002780#endif
2781#ifdef IPPROTO_IGMP
2782 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2783#endif
2784#ifdef IPPROTO_GGP
2785 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2786#endif
2787#ifdef IPPROTO_TCP
2788 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002789#else
2790 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002791#endif
2792#ifdef IPPROTO_EGP
2793 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2794#endif
2795#ifdef IPPROTO_PUP
2796 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2797#endif
2798#ifdef IPPROTO_UDP
2799 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002800#else
2801 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002802#endif
2803#ifdef IPPROTO_IDP
2804 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2805#endif
2806#ifdef IPPROTO_HELLO
2807 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2808#endif
2809#ifdef IPPROTO_ND
2810 insint(d, "IPPROTO_ND", IPPROTO_ND);
2811#endif
2812#ifdef IPPROTO_TP
2813 insint(d, "IPPROTO_TP", IPPROTO_TP);
2814#endif
2815#ifdef IPPROTO_XTP
2816 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2817#endif
2818#ifdef IPPROTO_EON
2819 insint(d, "IPPROTO_EON", IPPROTO_EON);
2820#endif
2821#ifdef IPPROTO_BIP
2822 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2823#endif
2824/**/
2825#ifdef IPPROTO_RAW
2826 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002827#else
2828 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002829#endif
2830#ifdef IPPROTO_MAX
2831 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2832#endif
2833
2834 /* Some port configuration */
2835#ifdef IPPORT_RESERVED
2836 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2837#else
2838 insint(d, "IPPORT_RESERVED", 1024);
2839#endif
2840#ifdef IPPORT_USERRESERVED
2841 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2842#else
2843 insint(d, "IPPORT_USERRESERVED", 5000);
2844#endif
2845
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002846 /* Some reserved IP v.4 addresses */
2847#ifdef INADDR_ANY
2848 insint(d, "INADDR_ANY", INADDR_ANY);
2849#else
2850 insint(d, "INADDR_ANY", 0x00000000);
2851#endif
2852#ifdef INADDR_BROADCAST
2853 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2854#else
2855 insint(d, "INADDR_BROADCAST", 0xffffffff);
2856#endif
2857#ifdef INADDR_LOOPBACK
2858 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2859#else
2860 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2861#endif
2862#ifdef INADDR_UNSPEC_GROUP
2863 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2864#else
2865 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2866#endif
2867#ifdef INADDR_ALLHOSTS_GROUP
2868 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2869#else
2870 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2871#endif
2872#ifdef INADDR_MAX_LOCAL_GROUP
2873 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2874#else
2875 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2876#endif
2877#ifdef INADDR_NONE
2878 insint(d, "INADDR_NONE", INADDR_NONE);
2879#else
2880 insint(d, "INADDR_NONE", 0xffffffff);
2881#endif
2882
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002883 /* IP [gs]etsockopt options */
2884#ifdef IP_OPTIONS
2885 insint(d, "IP_OPTIONS", IP_OPTIONS);
2886#endif
2887#ifdef IP_HDRINCL
2888 insint(d, "IP_HDRINCL", IP_HDRINCL);
2889#endif
2890#ifdef IP_TOS
2891 insint(d, "IP_TOS", IP_TOS);
2892#endif
2893#ifdef IP_TTL
2894 insint(d, "IP_TTL", IP_TTL);
2895#endif
2896#ifdef IP_RECVOPTS
2897 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2898#endif
2899#ifdef IP_RECVRETOPTS
2900 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2901#endif
2902#ifdef IP_RECVDSTADDR
2903 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2904#endif
2905#ifdef IP_RETOPTS
2906 insint(d, "IP_RETOPTS", IP_RETOPTS);
2907#endif
2908#ifdef IP_MULTICAST_IF
2909 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2910#endif
2911#ifdef IP_MULTICAST_TTL
2912 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2913#endif
2914#ifdef IP_MULTICAST_LOOP
2915 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2916#endif
2917#ifdef IP_ADD_MEMBERSHIP
2918 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2919#endif
2920#ifdef IP_DROP_MEMBERSHIP
2921 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2922#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002923#ifdef IP_DEFAULT_MULTICAST_TTL
2924 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
2925#endif
2926#ifdef IP_DEFAULT_MULTICAST_LOOP
2927 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
2928#endif
2929#ifdef IP_MAX_MEMBERSHIPS
2930 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
2931#endif
2932
2933 /* TCP options */
2934#ifdef TCP_NODELAY
2935 insint(d, "TCP_NODELAY", TCP_NODELAY);
2936#endif
2937#ifdef TCP_MAXSEG
2938 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
2939#endif
2940
2941 /* IPX options */
2942#ifdef IPX_TYPE
2943 insint(d, "IPX_TYPE", IPX_TYPE);
2944#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002945
2946 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002947#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002948 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002949#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002950}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00002951
2952/* Simplistic emulation code for inet_pton that only works for IPv4 */
2953#ifndef HAVE_INET_PTON
2954int my_inet_pton (int af, char *src, void *dst)
2955{
2956 if(af == AF_INET){
2957 long packed_addr;
2958#ifdef USE_GUSI1
2959 packed_addr = (long)inet_addr(src).s_addr;
2960#else
2961 packed_addr = inet_addr(src);
2962#endif
2963 if (packed_addr == INADDR_NONE)
2964 return 0;
2965 memcpy(dst, &packed_addr, 4);
2966 return 1;
2967 }
2968 /* Should set errno to EAFNOSUPPORT */
2969 return -1;
2970}
2971
2972char *
2973my_inet_ntop(int af, void *src, char *dst, socklen_t size)
2974{
2975 if (af == AF_INET) {
2976 struct in_addr packed_addr;
2977 if (size < 16)
2978 /* Should set errno to ENOSPC. */
2979 return NULL;
2980 memcpy(&packed_addr, src, sizeof(packed_addr));
2981 return strncpy(dst, inet_ntoa(packed_addr), size);
2982 }
2983 /* Should set errno to EAFNOSUPPORT */
2984 return NULL;
2985}
2986#endif