blob: ca7a9c1e3a5b150b8e6b94aa225a081093ee1b68 [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
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000190#include "addrinfo.h"
191
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000192#ifdef USE_SSL
Andrew M. Kuchling697a0b02001-01-18 17:41:41 +0000193#include "openssl/rsa.h"
194#include "openssl/crypto.h"
195#include "openssl/x509.h"
196#include "openssl/pem.h"
197#include "openssl/ssl.h"
198#include "openssl/err.h"
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000199#endif /* USE_SSL */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000200
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000201/* I know this is a bad practice, but it is the easiest... */
202#ifndef HAVE_GETADDRINFO
203#include "getaddrinfo.c"
204#endif
205#ifndef HAVE_GETNAMEINFO
206#include "getnameinfo.c"
207#endif
208
Guido van Rossumbcc20741998-08-04 22:53:56 +0000209#if defined(MS_WINDOWS) || defined(__BEOS__)
210/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000211/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000212#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000213#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000214#endif
215
Fred Drakea04eaad2000-06-30 02:46:07 +0000216/* abstract the socket file descriptor type */
217#ifdef MS_WINDOWS
218typedef SOCKET SOCKET_T;
219# ifdef MS_WIN64
220# define SIZEOF_SOCKET_T 8
221# else
222# define SIZEOF_SOCKET_T 4
223# endif
224#else
225typedef int SOCKET_T;
226# define SIZEOF_SOCKET_T SIZEOF_INT
227#endif
228
229
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000230#if defined(PYOS_OS2)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000231#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000232#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000233#endif
234
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000235#ifndef SOCKETCLOSE
236#define SOCKETCLOSE close
237#endif
238
Guido van Rossum30a685f1991-06-27 15:51:29 +0000239/* Global variable holding the exception type for errors detected
240 by this module (but not argument type or memory errors, etc.). */
241
Guido van Rossum73624e91994-10-10 17:59:00 +0000242static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000243
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000244#ifdef USE_SSL
245static PyObject *SSLErrorObject;
246#endif /* USE_SSL */
247
Guido van Rossum30a685f1991-06-27 15:51:29 +0000248
Guido van Rossum48a680c2001-03-02 06:34:14 +0000249#ifdef RISCOS
250/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
251static int taskwindow;
252#endif
253
254
Guido van Rossum30a685f1991-06-27 15:51:29 +0000255/* Convenience function to raise an error according to errno
256 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000257
Guido van Rossum73624e91994-10-10 17:59:00 +0000258static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000259PySocket_Err(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000260{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000261#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000262 int err_no = WSAGetLastError();
263 if (err_no) {
264 static struct { int no; const char *msg; } *msgp, msgs[] = {
265 { WSAEINTR, "Interrupted system call" },
266 { WSAEBADF, "Bad file descriptor" },
267 { WSAEACCES, "Permission denied" },
268 { WSAEFAULT, "Bad address" },
269 { WSAEINVAL, "Invalid argument" },
270 { WSAEMFILE, "Too many open files" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000271 { WSAEWOULDBLOCK,
Mark Hammond46a733d2000-07-24 01:45:11 +0000272 "The socket operation could not complete "
273 "without blocking" },
274 { WSAEINPROGRESS, "Operation now in progress" },
275 { WSAEALREADY, "Operation already in progress" },
276 { WSAENOTSOCK, "Socket operation on non-socket" },
277 { WSAEDESTADDRREQ, "Destination address required" },
278 { WSAEMSGSIZE, "Message too long" },
279 { WSAEPROTOTYPE, "Protocol wrong type for socket" },
280 { WSAENOPROTOOPT, "Protocol not available" },
281 { WSAEPROTONOSUPPORT, "Protocol not supported" },
282 { WSAESOCKTNOSUPPORT, "Socket type not supported" },
283 { WSAEOPNOTSUPP, "Operation not supported" },
284 { WSAEPFNOSUPPORT, "Protocol family not supported" },
285 { WSAEAFNOSUPPORT, "Address family not supported" },
286 { WSAEADDRINUSE, "Address already in use" },
287 { WSAEADDRNOTAVAIL,
288 "Can't assign requested address" },
289 { WSAENETDOWN, "Network is down" },
290 { WSAENETUNREACH, "Network is unreachable" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000291 { WSAENETRESET,
Mark Hammond46a733d2000-07-24 01:45:11 +0000292 "Network dropped connection on reset" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000293 { WSAECONNABORTED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000294 "Software caused connection abort" },
295 { WSAECONNRESET, "Connection reset by peer" },
296 { WSAENOBUFS, "No buffer space available" },
297 { WSAEISCONN, "Socket is already connected" },
298 { WSAENOTCONN, "Socket is not connected" },
299 { WSAESHUTDOWN, "Can't send after socket shutdown" },
300 { WSAETOOMANYREFS,
301 "Too many references: can't splice" },
302 { WSAETIMEDOUT, "Operation timed out" },
303 { WSAECONNREFUSED, "Connection refused" },
304 { WSAELOOP, "Too many levels of symbolic links" },
305 { WSAENAMETOOLONG, "File name too long" },
306 { WSAEHOSTDOWN, "Host is down" },
307 { WSAEHOSTUNREACH, "No route to host" },
308 { WSAENOTEMPTY, "Directory not empty" },
309 { WSAEPROCLIM, "Too many processes" },
310 { WSAEUSERS, "Too many users" },
311 { WSAEDQUOT, "Disc quota exceeded" },
312 { WSAESTALE, "Stale NFS file handle" },
313 { WSAEREMOTE, "Too many levels of remote in path" },
314 { WSASYSNOTREADY,
315 "Network subsystem is unvailable" },
316 { WSAVERNOTSUPPORTED,
317 "WinSock version is not supported" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000318 { WSANOTINITIALISED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000319 "Successful WSAStartup() not yet performed" },
320 { WSAEDISCON, "Graceful shutdown in progress" },
321 /* Resolver errors */
322 { WSAHOST_NOT_FOUND, "No such host is known" },
323 { WSATRY_AGAIN, "Host not found, or server failed" },
324 { WSANO_RECOVERY,
325 "Unexpected server error encountered" },
326 { WSANO_DATA, "Valid name without requested data" },
327 { WSANO_ADDRESS, "No address, look for MX record" },
328 { 0, NULL }
329 };
Guido van Rossum73624e91994-10-10 17:59:00 +0000330 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000331 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000332
Mark Hammond46a733d2000-07-24 01:45:11 +0000333 for (msgp = msgs; msgp->msg; msgp++) {
334 if (err_no == msgp->no) {
335 msg = msgp->msg;
336 break;
337 }
338 }
339
340 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000341 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000342 PyErr_SetObject(PySocket_Error, v);
343 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000344 }
345 return NULL;
346 }
347 else
348#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000349
350#if defined(PYOS_OS2)
351 if (sock_errno() != NO_ERROR) {
352 APIRET rc;
353 ULONG msglen;
354 char outbuf[100];
355 int myerrorcode = sock_errno();
356
357 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
358 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
359 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
360 if (rc == NO_ERROR) {
361 PyObject *v;
362
363 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
364 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
365 char *lastc = &outbuf[ strlen(outbuf)-1 ];
366 while (lastc > outbuf && isspace(*lastc))
367 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
368 }
369 v = Py_BuildValue("(is)", myerrorcode, outbuf);
370 if (v != NULL) {
371 PyErr_SetObject(PySocket_Error, v);
372 Py_DECREF(v);
373 }
374 return NULL;
375 }
376 }
377#endif
378
Guido van Rossum73624e91994-10-10 17:59:00 +0000379 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000380}
381
Guido van Rossum30a685f1991-06-27 15:51:29 +0000382
383/* The object holding a socket. It holds some extra information,
384 like the address family, which is used to decode socket address
385 arguments properly. */
386
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000387typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000388 PyObject_HEAD
Fred Drakea04eaad2000-06-30 02:46:07 +0000389 SOCKET_T sock_fd; /* Socket file descriptor */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000390 int sock_family; /* Address family, e.g., AF_INET */
391 int sock_type; /* Socket type, e.g., SOCK_STREAM */
392 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000393 union sock_addr {
394 struct sockaddr_in in;
395#ifdef AF_UNIX
396 struct sockaddr_un un;
397#endif
Jeremy Hylton22308652001-02-02 03:23:09 +0000398#if defined(linux) && defined(AF_PACKET)
399 struct sockaddr_ll ll;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000400#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000401 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000402} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000403
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000404#ifdef USE_SSL
Guido van Rossum30a685f1991-06-27 15:51:29 +0000405
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000406typedef struct {
407 PyObject_HEAD
408 PySocketSockObject *Socket; /* Socket on which we're layered */
409 PyObject *x_attr; /* Attributes dictionary */
410 SSL_CTX* ctx;
411 SSL* ssl;
412 X509* server_cert;
413 BIO* sbio;
414 char server[256];
415 char issuer[256];
416
417} SSLObject;
418
419staticforward PyTypeObject SSL_Type;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000420staticforward PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args);
421staticforward PyObject *SSL_SSLread(SSLObject *self, PyObject *args);
422
423#define SSLObject_Check(v) ((v)->ob_type == &SSL_Type)
424
425#endif /* USE_SSL */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000426
Guido van Rossum30a685f1991-06-27 15:51:29 +0000427/* A forward reference to the Socktype type object.
428 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000429 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000430 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000431
Guido van Rossum73624e91994-10-10 17:59:00 +0000432staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000433
Guido van Rossum30a685f1991-06-27 15:51:29 +0000434
435/* Create a new socket object.
436 This just creates the object and initializes it.
437 If the creation fails, return NULL and set an exception (implicit
438 in NEWOBJ()). */
439
Guido van Rossum73624e91994-10-10 17:59:00 +0000440static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000441PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000442{
Guido van Rossum48a680c2001-03-02 06:34:14 +0000443#ifdef RISCOS
444 int block = 1;
445#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000446 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000447 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000448 s = PyObject_New(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000449 if (s != NULL) {
450 s->sock_fd = fd;
451 s->sock_family = family;
452 s->sock_type = type;
453 s->sock_proto = proto;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000454#ifdef RISCOS
455 if(taskwindow) {
456 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
457 }
458#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000459 }
460 return s;
461}
462
Guido van Rossum30a685f1991-06-27 15:51:29 +0000463
Guido van Rossum48a680c2001-03-02 06:34:14 +0000464/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000465 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000466#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000467PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000468#endif
469
470
Guido van Rossum30a685f1991-06-27 15:51:29 +0000471/* Convert a string specifying a host name or one of a few symbolic
472 names to a numeric IP address. This usually calls gethostbyname()
473 to do the work; the names "" and "<broadcast>" are special.
474 Return the length (should always be 4 bytes), or negative if
475 an error occurred; then an exception is raised. */
476
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000477static int
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000478setipaddr(char* name, struct sockaddr_in * addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000479{
480 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000481 int d1, d2, d3, d4;
Guido van Rossum955becc1999-03-22 20:14:53 +0000482 int h_length;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000483 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000484#ifdef HAVE_GETHOSTBYNAME_R
485 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000486#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
487 struct hostent_data data;
488#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000489 char buf[1001];
490 int buf_len = (sizeof buf) - 1;
491 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000492#endif
493#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000494 int result;
495#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000496#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000497
Guido van Rossuma376cc51996-12-05 23:43:35 +0000498 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000499 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000500 addr_ret->sin_addr.s_addr = INADDR_ANY;
501 return 4;
502 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000503 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000504 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
505 return 4;
506 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000507 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
508 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
509 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
510 addr_ret->sin_addr.s_addr = htonl(
511 ((long) d1 << 24) | ((long) d2 << 16) |
512 ((long) d3 << 8) | ((long) d4 << 0));
513 return 4;
514 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000515 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000516#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000517#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000518 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &hp, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000519#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000520 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000521#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +0000522 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000523 result = gethostbyname_r(name, &hp_allocated, &data);
524 hp = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000525#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000526#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000527#ifdef USE_GETHOSTBYNAME_LOCK
528 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000529#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000530 hp = gethostbyname(name);
531#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000532 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000533
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000534 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000535#ifdef HAVE_HSTRERROR
Guido van Rossum48a680c2001-03-02 06:34:14 +0000536 /* Let's get real error message to return */
537 extern int h_errno;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000538 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
539#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000540 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000541#endif
Guido van Rossum3baaa131999-03-22 21:44:51 +0000542#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000543 PyThread_release_lock(gethostbyname_lock);
544#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000545 return -1;
546 }
547 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
Guido van Rossum955becc1999-03-22 20:14:53 +0000548 h_length = hp->h_length;
Guido van Rossum3baaa131999-03-22 21:44:51 +0000549#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000550 PyThread_release_lock(gethostbyname_lock);
551#endif
552 return h_length;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000553}
554
Guido van Rossum30a685f1991-06-27 15:51:29 +0000555
Guido van Rossum30a685f1991-06-27 15:51:29 +0000556/* Create a string object representing an IP address.
557 This is always a string of the form 'dd.dd.dd.dd' (with variable
558 size numbers). */
559
Guido van Rossum73624e91994-10-10 17:59:00 +0000560static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000561makeipaddr(struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000562{
563 long x = ntohl(addr->sin_addr.s_addr);
564 char buf[100];
565 sprintf(buf, "%d.%d.%d.%d",
566 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
567 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000568 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000569}
570
571
572/* Create an object representing the given socket address,
573 suitable for passing it back to bind(), connect() etc.
574 The family field of the sockaddr structure is inspected
575 to determine what kind of address it really is. */
576
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000577/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000578static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000579makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000580{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000581 if (addrlen == 0) {
582 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000583 Py_INCREF(Py_None);
584 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000585 }
586
Guido van Rossumbcc20741998-08-04 22:53:56 +0000587#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000588 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000589 addr->sa_family = AF_INET;
590#endif
591
Guido van Rossum30a685f1991-06-27 15:51:29 +0000592 switch (addr->sa_family) {
593
594 case AF_INET:
595 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000596 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000597 PyObject *addrobj = makeipaddr(a);
598 PyObject *ret = NULL;
599 if (addrobj) {
600 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
601 Py_DECREF(addrobj);
602 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000603 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000604 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000605
Guido van Rossumb6775db1994-08-01 11:34:53 +0000606#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000607 case AF_UNIX:
608 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000609 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000610 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000611 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000612#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000613
Jeremy Hylton22308652001-02-02 03:23:09 +0000614#if defined(linux) && defined(AF_PACKET)
615 case AF_PACKET:
616 {
617 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
618 char *ifname = "";
619 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000620 /* need to look up interface name give index */
621 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000622 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000623 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000624 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000625 }
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000626 return Py_BuildValue("shbhs#", ifname, ntohs(a->sll_protocol),
Guido van Rossum48a680c2001-03-02 06:34:14 +0000627 a->sll_pkttype, a->sll_hatype,
628 a->sll_addr, a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000629 }
630#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000631
Guido van Rossum30a685f1991-06-27 15:51:29 +0000632 /* More cases here... */
633
634 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000635 /* If we don't know the address family, don't raise an
636 exception -- return it as a tuple. */
637 return Py_BuildValue("is#",
638 addr->sa_family,
639 addr->sa_data,
640 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000641
Guido van Rossum30a685f1991-06-27 15:51:29 +0000642 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000643}
644
Guido van Rossum30a685f1991-06-27 15:51:29 +0000645
646/* Parse a socket address argument according to the socket object's
647 address family. Return 1 if the address was in the proper format,
648 0 of not. The address is returned through addr_ret, its length
649 through len_ret. */
650
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000651static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000652getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000653 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000654{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000655 switch (s->sock_family) {
656
Guido van Rossumb6775db1994-08-01 11:34:53 +0000657#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000658 case AF_UNIX:
659 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000660 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000661 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000662 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000663 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000664 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000665 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000666 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000667 PyErr_SetString(PySocket_Error,
668 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000669 return 0;
670 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000671 addr->sun_family = AF_UNIX;
672 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000673 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000674 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000675 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000676 return 1;
677 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000678#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000679
Guido van Rossum30a685f1991-06-27 15:51:29 +0000680 case AF_INET:
681 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000682 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000683 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000684 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000685 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000686 if (!PyTuple_Check(args)) {
687 PyErr_Format(PyExc_TypeError,
688 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
689 args->ob_type->tp_name);
690 return 0;
691 }
692 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000693 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000694 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000695 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000696 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000697 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000698 *addr_ret = (struct sockaddr *) addr;
699 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000700 return 1;
701 }
702
Jeremy Hylton22308652001-02-02 03:23:09 +0000703#if defined(linux) && defined(AF_PACKET)
704 case AF_PACKET:
705 {
706 struct sockaddr_ll* addr;
707 struct ifreq ifr;
708 char *interfaceName;
709 int protoNumber;
710 int hatype = 0;
711 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000712 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000713
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000714 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
715 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000716 return 0;
717 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
718 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000719 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
720 PyErr_SetFromErrno(PySocket_Error);
Jeremy Hylton22308652001-02-02 03:23:09 +0000721 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000722 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000723 addr = &(s->sock_addr.ll);
724 addr->sll_family = AF_PACKET;
725 addr->sll_protocol = htons((short)protoNumber);
726 addr->sll_ifindex = ifr.ifr_ifindex;
727 addr->sll_pkttype = pkttype;
728 addr->sll_hatype = hatype;
729 *addr_ret = (struct sockaddr *) addr;
730 *len_ret = sizeof *addr;
731 return 1;
732 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000733#endif
734
735
Guido van Rossum30a685f1991-06-27 15:51:29 +0000736 /* More cases here... */
737
738 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000739 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000740 return 0;
741
742 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000743}
744
Guido van Rossum30a685f1991-06-27 15:51:29 +0000745
Guido van Rossum48a680c2001-03-02 06:34:14 +0000746/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000747 Return 1 if the family is known, 0 otherwise. The length is returned
748 through len_ret. */
749
750static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000751getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000752{
753 switch (s->sock_family) {
754
Guido van Rossumb6775db1994-08-01 11:34:53 +0000755#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000756 case AF_UNIX:
757 {
758 *len_ret = sizeof (struct sockaddr_un);
759 return 1;
760 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000761#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000762
763 case AF_INET:
764 {
765 *len_ret = sizeof (struct sockaddr_in);
766 return 1;
767 }
768
Jeremy Hylton22308652001-02-02 03:23:09 +0000769#if defined(linux) && defined(AF_PACKET)
770 case AF_PACKET:
771 {
772 *len_ret = sizeof (struct sockaddr_ll);
773 return 1;
774 }
775#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000776
Guido van Rossum710e1df1992-06-12 10:39:36 +0000777 /* More cases here... */
778
779 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000780 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000781 return 0;
782
783 }
784}
785
786
Guido van Rossum30a685f1991-06-27 15:51:29 +0000787/* s.accept() method */
788
Guido van Rossum73624e91994-10-10 17:59:00 +0000789static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000790PySocketSock_accept(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000791{
792 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000793 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000794 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000795 PyObject *sock = NULL;
796 PyObject *addr = NULL;
797 PyObject *res = NULL;
798
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000799 if (!PyArg_ParseTuple(args, ":accept"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000800 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000801 if (!getsockaddrlen(s, &addrlen))
802 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000803 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000804 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000805 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000806 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000807#ifdef MS_WINDOWS
808 if (newfd == INVALID_SOCKET)
809#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000810 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000811#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000812 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000813
Guido van Rossum30a685f1991-06-27 15:51:29 +0000814 /* Create the new object with unspecified family,
815 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000816 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000817 s->sock_family,
818 s->sock_type,
819 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000820 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000821 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000822 goto finally;
823 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000824 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000825 addrlen);
826 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +0000827 goto finally;
828
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000829 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000830
831 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000832 Py_XDECREF(sock);
833 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000834 return res;
835}
836
Guido van Rossum82a5c661998-07-07 20:45:43 +0000837static char accept_doc[] =
838"accept() -> (socket object, address info)\n\
839\n\
840Wait for an incoming connection. Return a new socket representing the\n\
841connection, and the address of the client. For IP sockets, the address\n\
842info is a pair (hostaddr, port).";
843
Guido van Rossum30a685f1991-06-27 15:51:29 +0000844
Guido van Rossume4485b01994-09-07 14:32:49 +0000845/* s.setblocking(1 | 0) method */
846
Guido van Rossum73624e91994-10-10 17:59:00 +0000847static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000848PySocketSock_setblocking(PySocketSockObject *s, PyObject *args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000849{
850 int block;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000851#ifndef RISCOS
Guido van Rossum644a12b1997-04-09 19:24:53 +0000852#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000853 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000854#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000855#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000856 if (!PyArg_ParseTuple(args, "i:setblocking", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000857 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000858 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000859#ifdef __BEOS__
860 block = !block;
861 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
862 (void *)(&block), sizeof( int ) );
863#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000864#ifndef RISCOS
Guido van Rossum6f489d91996-06-28 20:15:15 +0000865#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000866#ifdef PYOS_OS2
867 block = !block;
868 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
869#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000870 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
871 if (block)
872 delay_flag &= (~O_NDELAY);
873 else
874 delay_flag |= O_NDELAY;
875 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000876#endif /* !PYOS_OS2 */
877#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000878 block = !block;
879 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000880#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000881#endif /* __BEOS__ */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000882#endif /* RISCOS */
Guido van Rossum73624e91994-10-10 17:59:00 +0000883 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000884
Guido van Rossum73624e91994-10-10 17:59:00 +0000885 Py_INCREF(Py_None);
886 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000887}
Guido van Rossume4485b01994-09-07 14:32:49 +0000888
Guido van Rossum82a5c661998-07-07 20:45:43 +0000889static char setblocking_doc[] =
890"setblocking(flag)\n\
891\n\
892Set the socket to blocking (flag is true) or non-blocking (false).\n\
893This uses the FIONBIO ioctl with the O_NDELAY flag.";
894
Guido van Rossume4485b01994-09-07 14:32:49 +0000895
Guido van Rossum48a680c2001-03-02 06:34:14 +0000896#ifdef RISCOS
897/* s.sleeptaskw(1 | 0) method */
898
899static PyObject *
900PySocketSock_sleeptaskw(PySocketSockObject *s,PyObject *args)
901{
902 int block;
903 int delay_flag;
904 if (!PyArg_GetInt(args, &block))
905 return NULL;
906 Py_BEGIN_ALLOW_THREADS
907 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
908 Py_END_ALLOW_THREADS
909
910 Py_INCREF(Py_None);
911 return Py_None;
912}
913static char sleeptaskw_doc[] =
914"sleeptaskw(flag)\n\
915\n\
916Allow sleeps in taskwindows.";
917#endif
918
919
Guido van Rossumaee08791992-09-08 09:05:33 +0000920/* s.setsockopt() method.
921 With an integer third argument, sets an integer option.
922 With a string third argument, sets an option from a buffer;
923 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000924
Guido van Rossum73624e91994-10-10 17:59:00 +0000925static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000926PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000927{
928 int level;
929 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000930 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000931 char *buf;
932 int buflen;
933 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000934
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000935 if (PyArg_ParseTuple(args, "iii:setsockopt",
936 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000937 buf = (char *) &flag;
938 buflen = sizeof flag;
939 }
940 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000941 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000942 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
943 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000944 return NULL;
945 }
Thomas Wouters334fb892000-07-25 12:56:38 +0000946 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000947 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000948 return PySocket_Err();
949 Py_INCREF(Py_None);
950 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000951}
952
Guido van Rossum82a5c661998-07-07 20:45:43 +0000953static char setsockopt_doc[] =
954"setsockopt(level, option, value)\n\
955\n\
956Set a socket option. See the Unix manual for level and option.\n\
957The value argument can either be an integer or a string.";
958
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000959
Guido van Rossumaee08791992-09-08 09:05:33 +0000960/* s.getsockopt() method.
961 With two arguments, retrieves an integer option.
962 With a third integer argument, retrieves a string buffer of that size;
963 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000964
Guido van Rossum73624e91994-10-10 17:59:00 +0000965static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000966PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000967{
968 int level;
969 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000970 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000971 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000972 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000973
Guido van Rossumbcc20741998-08-04 22:53:56 +0000974#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +0000975 /* We have incomplete socket support. */
976 PyErr_SetString(PySocket_Error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +0000977 return NULL;
978#else
979
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000980 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
981 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +0000982 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000983
Guido van Rossumbe32c891996-06-20 16:25:29 +0000984 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000985 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000986 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000987 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +0000988 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000989 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000990 return PySocket_Err();
991 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000992 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000993 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000994 PyErr_SetString(PySocket_Error,
995 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000996 return NULL;
997 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000998 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000999 if (buf == NULL)
1000 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001001 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001002 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001003 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001004 Py_DECREF(buf);
1005 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +00001006 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001007 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001008 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001009#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001010}
1011
Guido van Rossum82a5c661998-07-07 20:45:43 +00001012static char getsockopt_doc[] =
1013"getsockopt(level, option[, buffersize]) -> value\n\
1014\n\
1015Get a socket option. See the Unix manual for level and option.\n\
1016If a nonzero buffersize argument is given, the return value is a\n\
1017string of that length; otherwise it is an integer.";
1018
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001019
Fred Drake728819a2000-07-01 03:40:12 +00001020/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001021
Guido van Rossum73624e91994-10-10 17:59:00 +00001022static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001023PySocketSock_bind(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001024{
1025 struct sockaddr *addr;
1026 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001027 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001028 PyObject *addro;
1029 if (!PyArg_ParseTuple(args, "O:bind", &addro))
1030 return NULL;
1031 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001032 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001033 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001034 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001035 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001036 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001037 return PySocket_Err();
1038 Py_INCREF(Py_None);
1039 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001040}
1041
Guido van Rossum82a5c661998-07-07 20:45:43 +00001042static char bind_doc[] =
1043"bind(address)\n\
1044\n\
1045Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001046pair (host, port); the host must refer to the local host. For raw packet\n\
1047sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001048
Guido van Rossum30a685f1991-06-27 15:51:29 +00001049
1050/* s.close() method.
1051 Set the file descriptor to -1 so operations tried subsequently
1052 will surely fail. */
1053
Guido van Rossum73624e91994-10-10 17:59:00 +00001054static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001055PySocketSock_close(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001056{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001057 SOCKET_T fd;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001058 if (!PyArg_ParseTuple(args, ":close"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001059 return NULL;
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001060 if ((fd = s->sock_fd) != -1) {
1061 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001062 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001063 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001064 Py_END_ALLOW_THREADS
1065 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001066 Py_INCREF(Py_None);
1067 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001068}
1069
Guido van Rossum82a5c661998-07-07 20:45:43 +00001070static char close_doc[] =
1071"close()\n\
1072\n\
1073Close the socket. It cannot be used after this call.";
1074
Guido van Rossum30a685f1991-06-27 15:51:29 +00001075
Fred Drake728819a2000-07-01 03:40:12 +00001076/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001077
Guido van Rossum73624e91994-10-10 17:59:00 +00001078static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001079PySocketSock_connect(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001080{
1081 struct sockaddr *addr;
1082 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001083 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001084 PyObject *addro;
1085 if (!PyArg_ParseTuple(args, "O:connect", &addro))
1086 return NULL;
1087 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001088 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001089 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001090 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001091 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001092 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001093 return PySocket_Err();
1094 Py_INCREF(Py_None);
1095 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001096}
1097
Guido van Rossum82a5c661998-07-07 20:45:43 +00001098static char connect_doc[] =
1099"connect(address)\n\
1100\n\
1101Connect the socket to a remote address. For IP sockets, the address\n\
1102is a pair (host, port).";
1103
Guido van Rossum30a685f1991-06-27 15:51:29 +00001104
Fred Drake728819a2000-07-01 03:40:12 +00001105/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001106
1107static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001108PySocketSock_connect_ex(PySocketSockObject *s, PyObject *args)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001109{
1110 struct sockaddr *addr;
1111 int addrlen;
1112 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001113 PyObject *addro;
1114 if (!PyArg_ParseTuple(args, "O:connect_ex", &addro))
1115 return NULL;
1116 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001117 return NULL;
1118 Py_BEGIN_ALLOW_THREADS
1119 res = connect(s->sock_fd, addr, addrlen);
1120 Py_END_ALLOW_THREADS
1121 if (res != 0)
1122 res = errno;
1123 return PyInt_FromLong((long) res);
1124}
1125
Guido van Rossum82a5c661998-07-07 20:45:43 +00001126static char connect_ex_doc[] =
1127"connect_ex(address)\n\
1128\n\
1129This is like connect(address), but returns an error code (the errno value)\n\
1130instead of raising an exception when an error occurs.";
1131
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001132
Guido van Rossumed233a51992-06-23 09:07:03 +00001133/* s.fileno() method */
1134
Guido van Rossum73624e91994-10-10 17:59:00 +00001135static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001136PySocketSock_fileno(PySocketSockObject *s, PyObject *args)
Guido van Rossumed233a51992-06-23 09:07:03 +00001137{
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001138 if (!PyArg_ParseTuple(args, ":fileno"))
Guido van Rossumed233a51992-06-23 09:07:03 +00001139 return NULL;
Fred Drakea04eaad2000-06-30 02:46:07 +00001140#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001141 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001142#else
1143 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1144#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001145}
1146
Guido van Rossum82a5c661998-07-07 20:45:43 +00001147static char fileno_doc[] =
1148"fileno() -> integer\n\
1149\n\
1150Return the integer file descriptor of the socket.";
1151
Guido van Rossumed233a51992-06-23 09:07:03 +00001152
Guido van Rossumbe32c891996-06-20 16:25:29 +00001153#ifndef NO_DUP
1154/* s.dup() method */
1155
1156static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001157PySocketSock_dup(PySocketSockObject *s, PyObject *args)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001158{
Fred Drakea04eaad2000-06-30 02:46:07 +00001159 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001160 PyObject *sock;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001161 if (!PyArg_ParseTuple(args, ":dup"))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001162 return NULL;
1163 newfd = dup(s->sock_fd);
1164 if (newfd < 0)
1165 return PySocket_Err();
1166 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001167 s->sock_family,
1168 s->sock_type,
1169 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001170 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001171 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001172 return sock;
1173}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001174
1175static char dup_doc[] =
1176"dup() -> socket object\n\
1177\n\
1178Return a new socket object connected to the same system resource.";
1179
Guido van Rossumbe32c891996-06-20 16:25:29 +00001180#endif
1181
1182
Guido van Rossumc89705d1992-11-26 08:54:07 +00001183/* s.getsockname() method */
1184
Guido van Rossum73624e91994-10-10 17:59:00 +00001185static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001186PySocketSock_getsockname(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001187{
1188 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001189 int res;
1190 socklen_t addrlen;
1191
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001192 if (!PyArg_ParseTuple(args, ":getsockname"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001193 return NULL;
1194 if (!getsockaddrlen(s, &addrlen))
1195 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001196 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001197 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001198 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001199 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001200 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001201 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001202 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001203}
1204
Guido van Rossum82a5c661998-07-07 20:45:43 +00001205static char getsockname_doc[] =
1206"getsockname() -> address info\n\
1207\n\
1208Return the address of the local endpoint. For IP sockets, the address\n\
1209info is a pair (hostaddr, port).";
1210
Guido van Rossumc89705d1992-11-26 08:54:07 +00001211
Guido van Rossumb6775db1994-08-01 11:34:53 +00001212#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001213/* s.getpeername() method */
1214
Guido van Rossum73624e91994-10-10 17:59:00 +00001215static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001216PySocketSock_getpeername(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001217{
1218 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001219 int res;
1220 socklen_t addrlen;
1221
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001222 if (!PyArg_ParseTuple(args, ":getpeername"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001223 return NULL;
1224 if (!getsockaddrlen(s, &addrlen))
1225 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001226 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001227 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001228 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001229 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001230 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001231 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001232 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001233}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001234
1235static char getpeername_doc[] =
1236"getpeername() -> address info\n\
1237\n\
1238Return the address of the remote endpoint. For IP sockets, the address\n\
1239info is a pair (hostaddr, port).";
1240
Guido van Rossumb6775db1994-08-01 11:34:53 +00001241#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001242
1243
Guido van Rossum30a685f1991-06-27 15:51:29 +00001244/* s.listen(n) method */
1245
Guido van Rossum73624e91994-10-10 17:59:00 +00001246static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001247PySocketSock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001248{
1249 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001250 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001251 if (!PyArg_ParseTuple(args, "i:listen", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001252 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001253 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001254 if (backlog < 1)
1255 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001256 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001257 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001258 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001259 return PySocket_Err();
1260 Py_INCREF(Py_None);
1261 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001262}
1263
Guido van Rossum82a5c661998-07-07 20:45:43 +00001264static char listen_doc[] =
1265"listen(backlog)\n\
1266\n\
1267Enable a server to accept connections. The backlog argument must be at\n\
1268least 1; it specifies the number of unaccepted connection that the system\n\
1269will allow before refusing new connections.";
1270
1271
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001272#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001273/* s.makefile(mode) method.
1274 Create a new open file object referring to a dupped version of
1275 the socket's file descriptor. (The dup() call is necessary so
1276 that the open file and socket objects may be closed independent
1277 of each other.)
1278 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1279
Guido van Rossum73624e91994-10-10 17:59:00 +00001280static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001281PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001282{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001283 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001284 char *mode = "r";
1285 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001286#ifdef MS_WIN32
1287 intptr_t fd;
1288#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001289 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001290#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001291 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001292 PyObject *f;
1293
Guido van Rossum43713e52000-02-29 13:59:29 +00001294 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001295 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001296#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001297 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1298 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001299#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001300 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001301#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001302 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001303 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001304 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001305 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001306 }
1307 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1308 if (f != NULL)
1309 PyFile_SetBufSize(f, bufsize);
1310 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001311}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001312
1313static char makefile_doc[] =
1314"makefile([mode[, buffersize]]) -> file object\n\
1315\n\
1316Return a regular file object corresponding to the socket.\n\
1317The mode and buffersize arguments are as for the built-in open() function.";
1318
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001319#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001320
Guido van Rossum48a680c2001-03-02 06:34:14 +00001321
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001322/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001323
Guido van Rossum73624e91994-10-10 17:59:00 +00001324static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001325PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001326{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001327 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001328 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001329 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001330 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001331 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001332 if (buf == NULL)
1333 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001334 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001335 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001336 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001337 if (n < 0) {
1338 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001339 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001340 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001341 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001342 return NULL;
1343 return buf;
1344}
1345
Guido van Rossum82a5c661998-07-07 20:45:43 +00001346static char recv_doc[] =
1347"recv(buffersize[, flags]) -> data\n\
1348\n\
1349Receive up to buffersize bytes from the socket. For the optional flags\n\
1350argument, see the Unix manual. When no data is available, block until\n\
1351at least one byte is available or until the remote end is closed. When\n\
1352the remote end is closed and all data is read, return the empty string.";
1353
Guido van Rossum30a685f1991-06-27 15:51:29 +00001354
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001355/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001356
Guido van Rossum73624e91994-10-10 17:59:00 +00001357static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001358PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001359{
1360 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001361 PyObject *buf = NULL;
1362 PyObject *addr = NULL;
1363 PyObject *ret = NULL;
1364
Guido van Rossumff3ab422000-04-24 15:16:03 +00001365 int len, n, flags = 0;
1366 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001367 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001368 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001369 if (!getsockaddrlen(s, &addrlen))
1370 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001371 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001372 if (buf == NULL)
1373 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001374 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001375 memset(addrbuf, 0, addrlen);
1376 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001377#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001378#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001379 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001380#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001381 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001382#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001383#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001384 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001385#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001386 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001387 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001388 if (n < 0) {
1389 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001390 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001391 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001392 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001393 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001394
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001395 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001396 goto finally;
1397
Guido van Rossum73624e91994-10-10 17:59:00 +00001398 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001399 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001400 Py_XDECREF(addr);
1401 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001402 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001403}
1404
Guido van Rossum82a5c661998-07-07 20:45:43 +00001405static char recvfrom_doc[] =
1406"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1407\n\
1408Like recv(buffersize, flags) but also return the sender's address info.";
1409
Guido van Rossum30a685f1991-06-27 15:51:29 +00001410
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001411/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001412
Guido van Rossum73624e91994-10-10 17:59:00 +00001413static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001414PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001415{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001416 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001417 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001418 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001419 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001420 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001421 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001422 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001423 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001424 return PySocket_Err();
1425 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001426}
1427
Guido van Rossum82a5c661998-07-07 20:45:43 +00001428static char send_doc[] =
1429"send(data[, flags])\n\
1430\n\
1431Send a data string to the socket. For the optional flags\n\
1432argument, see the Unix manual.";
1433
Guido van Rossum30a685f1991-06-27 15:51:29 +00001434
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001435/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001436
Guido van Rossum73624e91994-10-10 17:59:00 +00001437static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001438PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001439{
Guido van Rossum73624e91994-10-10 17:59:00 +00001440 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001441 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001442 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001443 int addrlen, len, n, flags;
1444 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001445 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001446 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001447 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1448 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001449 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001450 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001451 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001452 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001453 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001454 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001455 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001456 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001457 return PySocket_Err();
1458 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001459}
1460
Guido van Rossum82a5c661998-07-07 20:45:43 +00001461static char sendto_doc[] =
1462"sendto(data[, flags], address)\n\
1463\n\
1464Like send(data, flags) but allows specifying the destination address.\n\
1465For IP sockets, the address is a pair (hostaddr, port).";
1466
Guido van Rossum30a685f1991-06-27 15:51:29 +00001467
1468/* s.shutdown(how) method */
1469
Guido van Rossum73624e91994-10-10 17:59:00 +00001470static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001471PySocketSock_shutdown(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001472{
1473 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001474 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001475 if (!PyArg_ParseTuple(args, "i:shutdown", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001476 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001477 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001478 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001479 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001480 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001481 return PySocket_Err();
1482 Py_INCREF(Py_None);
1483 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001484}
1485
Guido van Rossum82a5c661998-07-07 20:45:43 +00001486static char shutdown_doc[] =
1487"shutdown(flag)\n\
1488\n\
1489Shut down the reading side of the socket (flag == 0), the writing side\n\
1490of the socket (flag == 1), or both ends (flag == 2).";
1491
Guido van Rossum30a685f1991-06-27 15:51:29 +00001492
1493/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001494
Guido van Rossum73624e91994-10-10 17:59:00 +00001495static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001496 {"accept", (PyCFunction)PySocketSock_accept, METH_VARARGS,
1497 accept_doc},
1498 {"bind", (PyCFunction)PySocketSock_bind, METH_VARARGS,
1499 bind_doc},
1500 {"close", (PyCFunction)PySocketSock_close, METH_VARARGS,
1501 close_doc},
1502 {"connect", (PyCFunction)PySocketSock_connect, METH_VARARGS,
1503 connect_doc},
1504 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_VARARGS,
1505 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001506#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001507 {"dup", (PyCFunction)PySocketSock_dup, METH_VARARGS,
1508 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001509#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001510 {"fileno", (PyCFunction)PySocketSock_fileno, METH_VARARGS,
1511 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001512#ifdef HAVE_GETPEERNAME
Guido van Rossum48a680c2001-03-02 06:34:14 +00001513 {"getpeername", (PyCFunction)PySocketSock_getpeername, METH_VARARGS,
1514 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001515#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001516 {"getsockname", (PyCFunction)PySocketSock_getsockname, METH_VARARGS,
1517 getsockname_doc},
1518 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1519 getsockopt_doc},
1520 {"listen", (PyCFunction)PySocketSock_listen, METH_VARARGS,
1521 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001522#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001523 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1524 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001525#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001526 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1527 recv_doc},
1528 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1529 recvfrom_doc},
1530 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1531 send_doc},
1532 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1533 sendto_doc},
1534 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_VARARGS,
1535 setblocking_doc},
1536 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1537 setsockopt_doc},
1538 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_VARARGS,
1539 shutdown_doc},
1540#ifdef RISCOS
1541 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1542 sleeptaskw_doc},
1543#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001544 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001545};
1546
Guido van Rossum30a685f1991-06-27 15:51:29 +00001547
Guido van Rossum73624e91994-10-10 17:59:00 +00001548/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001549 First close the file description. */
1550
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001551static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001552PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001553{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001554 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001555 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001556 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001557}
1558
Guido van Rossum30a685f1991-06-27 15:51:29 +00001559
1560/* Return a socket object's named attribute. */
1561
Guido van Rossum73624e91994-10-10 17:59:00 +00001562static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001563PySocketSock_getattr(PySocketSockObject *s, char *name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001564{
Guido van Rossum73624e91994-10-10 17:59:00 +00001565 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001566}
1567
Guido van Rossum30a685f1991-06-27 15:51:29 +00001568
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001569static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001570PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001571{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001572 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001573#if SIZEOF_SOCKET_T > SIZEOF_LONG
1574 if (s->sock_fd > LONG_MAX) {
1575 /* this can occur on Win64, and actually there is a special
1576 ugly printf formatter for decimal pointer length integer
1577 printing, only bother if necessary*/
1578 PyErr_SetString(PyExc_OverflowError,
1579 "no printf formatter to display the socket descriptor in decimal");
1580 return NULL;
1581 }
1582#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001583 sprintf(buf,
1584 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
Fred Drakea04eaad2000-06-30 02:46:07 +00001585 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001586 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001587}
1588
1589
Guido van Rossumb6775db1994-08-01 11:34:53 +00001590/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001591
Guido van Rossum73624e91994-10-10 17:59:00 +00001592static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001593 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001594 0,
1595 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001596 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001597 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001598 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001599 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001600 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001601 0, /*tp_setattr*/
1602 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001603 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001604 0, /*tp_as_number*/
1605 0, /*tp_as_sequence*/
1606 0, /*tp_as_mapping*/
1607};
1608
Guido van Rossum30a685f1991-06-27 15:51:29 +00001609
Guido van Rossum81194471991-07-27 21:42:02 +00001610/* Python interface to gethostname(). */
1611
1612/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001613static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001614PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001615{
1616 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001617 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001618 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001619 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001620 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001621 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001622 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001623 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001624 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001625 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001626 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001627}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001628
Guido van Rossum82a5c661998-07-07 20:45:43 +00001629static char gethostname_doc[] =
1630"gethostname() -> string\n\
1631\n\
1632Return the current host name.";
1633
Guido van Rossumff4949e1992-08-05 19:58:53 +00001634
Guido van Rossum30a685f1991-06-27 15:51:29 +00001635/* Python interface to gethostbyname(name). */
1636
1637/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001638static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001639PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001640{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001641 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001642 struct sockaddr_in addrbuf;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001643 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001644 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001645 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001646 return NULL;
1647 return makeipaddr(&addrbuf);
1648}
1649
Guido van Rossum82a5c661998-07-07 20:45:43 +00001650static char gethostbyname_doc[] =
1651"gethostbyname(host) -> address\n\
1652\n\
1653Return the IP address (a string of the form '255.255.255.255') for a host.";
1654
1655
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001656/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1657
1658static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001659gethost_common(struct hostent *h, struct sockaddr_in *addr)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001660{
1661 char **pch;
1662 PyObject *rtn_tuple = (PyObject *)NULL;
1663 PyObject *name_list = (PyObject *)NULL;
1664 PyObject *addr_list = (PyObject *)NULL;
1665 PyObject *tmp;
1666 if (h == NULL) {
1667#ifdef HAVE_HSTRERROR
Guido van Rossum48a680c2001-03-02 06:34:14 +00001668 /* Let's get real error message to return */
1669 extern int h_errno;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001670 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1671#else
1672 PyErr_SetString(PySocket_Error, "host not found");
1673#endif
1674 return NULL;
1675 }
1676 if ((name_list = PyList_New(0)) == NULL)
1677 goto err;
1678 if ((addr_list = PyList_New(0)) == NULL)
1679 goto err;
1680 for (pch = h->h_aliases; *pch != NULL; pch++) {
1681 int status;
1682 tmp = PyString_FromString(*pch);
1683 if (tmp == NULL)
1684 goto err;
1685 status = PyList_Append(name_list, tmp);
1686 Py_DECREF(tmp);
1687 if (status)
1688 goto err;
1689 }
1690 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1691 int status;
1692 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1693 tmp = makeipaddr(addr);
1694 if (tmp == NULL)
1695 goto err;
1696 status = PyList_Append(addr_list, tmp);
1697 Py_DECREF(tmp);
1698 if (status)
1699 goto err;
1700 }
1701 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1702 err:
1703 Py_XDECREF(name_list);
1704 Py_XDECREF(addr_list);
1705 return rtn_tuple;
1706}
1707
1708
1709/* Python interface to gethostbyname_ex(name). */
1710
1711/*ARGSUSED*/
1712static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001713PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001714{
1715 char *name;
1716 struct hostent *h;
1717 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001718 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001719#ifdef HAVE_GETHOSTBYNAME_R
1720 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001721#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1722 struct hostent_data data;
1723#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001724 char buf[16384];
1725 int buf_len = (sizeof buf) - 1;
1726 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001727#endif
1728#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001729 int result;
1730#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001731#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001732 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001733 return NULL;
1734 if (setipaddr(name, &addr) < 0)
1735 return NULL;
1736 Py_BEGIN_ALLOW_THREADS
1737#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001738#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001739 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001740#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001741 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001742#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001743 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001744 result = gethostbyname_r(name, &hp_allocated, &data);
1745 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001746#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001747#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001748#ifdef USE_GETHOSTBYNAME_LOCK
1749 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001750#endif
1751 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001752#endif /* HAVE_GETHOSTBYNAME_R */
1753 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001754 ret = gethost_common(h, &addr);
1755#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001756 PyThread_release_lock(gethostbyname_lock);
1757#endif
1758 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001759}
1760
1761static char ghbn_ex_doc[] =
1762"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1763\n\
1764Return the true host name, a list of aliases, and a list of IP addresses,\n\
1765for a host. The host argument is a string giving a host name or IP number.";
1766
1767
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001768/* Python interface to gethostbyaddr(IP). */
1769
1770/*ARGSUSED*/
1771static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001772PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001773{
Guido van Rossum48a680c2001-03-02 06:34:14 +00001774 struct sockaddr_in addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001775 char *ip_num;
1776 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001777 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001778#ifdef HAVE_GETHOSTBYNAME_R
1779 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001780#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1781 struct hostent_data data;
1782#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001783 char buf[16384];
1784 int buf_len = (sizeof buf) - 1;
1785 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001786#endif
1787#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001788 int result;
1789#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001790#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001791
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001792 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001793 return NULL;
1794 if (setipaddr(ip_num, &addr) < 0)
1795 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001796 Py_BEGIN_ALLOW_THREADS
1797#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001798#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001799 result = gethostbyaddr_r((char *)&addr.sin_addr,
1800 sizeof(addr.sin_addr),
1801 AF_INET, &hp_allocated, buf, buf_len,
1802 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001803#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001804 h = gethostbyaddr_r((char *)&addr.sin_addr,
1805 sizeof(addr.sin_addr),
Guido van Rossum48a680c2001-03-02 06:34:14 +00001806 AF_INET,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001807 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001808#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001809 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001810 result = gethostbyaddr_r((char *)&addr.sin_addr,
1811 sizeof(addr.sin_addr),
1812 AF_INET, &hp_allocated, &data);
1813 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001814#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001815#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001816#ifdef USE_GETHOSTBYNAME_LOCK
1817 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001818#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001819 h = gethostbyaddr((char *)&addr.sin_addr,
1820 sizeof(addr.sin_addr),
1821 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001822#endif /* HAVE_GETHOSTBYNAME_R */
1823 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001824 ret = gethost_common(h, &addr);
1825#ifdef USE_GETHOSTBYNAME_LOCK
1826 PyThread_release_lock(gethostbyname_lock);
1827#endif
1828 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001829}
1830
Guido van Rossum82a5c661998-07-07 20:45:43 +00001831static char gethostbyaddr_doc[] =
1832"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1833\n\
1834Return the true host name, a list of aliases, and a list of IP addresses,\n\
1835for a host. The host argument is a string giving a host name or IP number.";
1836
Guido van Rossum30a685f1991-06-27 15:51:29 +00001837
1838/* Python interface to getservbyname(name).
1839 This only returns the port number, since the other info is already
1840 known or not useful (like the list of aliases). */
1841
1842/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001843static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001844PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001845{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001846 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001847 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001848 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001849 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001850 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001851 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001852 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001853 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001854 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001855 return NULL;
1856 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001857 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001858}
1859
Guido van Rossum82a5c661998-07-07 20:45:43 +00001860static char getservbyname_doc[] =
1861"getservbyname(servicename, protocolname) -> integer\n\
1862\n\
1863Return a port number from a service name and protocol name.\n\
1864The protocol name should be 'tcp' or 'udp'.";
1865
Guido van Rossum30a685f1991-06-27 15:51:29 +00001866
Guido van Rossum3901d851996-12-19 16:35:04 +00001867/* Python interface to getprotobyname(name).
1868 This only returns the protocol number, since the other info is
1869 already known or not useful (like the list of aliases). */
1870
1871/*ARGSUSED*/
1872static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001873PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00001874{
1875 char *name;
1876 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001877#ifdef __BEOS__
1878/* Not available in BeOS yet. - [cjh] */
1879 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1880 return NULL;
1881#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001882 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00001883 return NULL;
1884 Py_BEGIN_ALLOW_THREADS
1885 sp = getprotobyname(name);
1886 Py_END_ALLOW_THREADS
1887 if (sp == NULL) {
1888 PyErr_SetString(PySocket_Error, "protocol not found");
1889 return NULL;
1890 }
1891 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001892#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001893}
1894
Guido van Rossum82a5c661998-07-07 20:45:43 +00001895static char getprotobyname_doc[] =
1896"getprotobyname(name) -> integer\n\
1897\n\
1898Return the protocol number for the named protocol. (Rarely used.)";
1899
Guido van Rossum3901d851996-12-19 16:35:04 +00001900
Guido van Rossum30a685f1991-06-27 15:51:29 +00001901/* Python interface to socket(family, type, proto).
1902 The third (protocol) argument is optional.
1903 Return a new socket object. */
1904
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001905/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001906static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001907PySocket_socket(PyObject *self, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001908{
Guido van Rossum73624e91994-10-10 17:59:00 +00001909 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001910 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001911 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001912 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001913 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001914 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001915 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001916 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001917#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001918 if (fd == INVALID_SOCKET)
1919#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001920 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001921#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001922 return PySocket_Err();
1923 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001924 /* If the object can't be created, don't forget to close the
1925 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001926 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001927 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001928 /* From now on, ignore SIGPIPE and let the error checking
1929 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001930#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001931 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00001932#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001933 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001934}
1935
Guido van Rossum82a5c661998-07-07 20:45:43 +00001936static char socket_doc[] =
1937"socket(family, type[, proto]) -> socket object\n\
1938\n\
1939Open a socket of the given type. The family argument specifies the\n\
1940address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1941The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1942or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1943specifying the default protocol.";
1944
1945
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001946#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001947/* Create a socket object from a numeric file description.
1948 Useful e.g. if stdin is a socket.
1949 Additional arguments as for socket(). */
1950
1951/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001952static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001953PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001954{
Guido van Rossum73624e91994-10-10 17:59:00 +00001955 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001956 SOCKET_T fd;
1957 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001958 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
1959 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001960 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001961 /* Dup the fd so it and the socket can be closed independently */
1962 fd = dup(fd);
1963 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001964 return PySocket_Err();
1965 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001966 /* From now on, ignore SIGPIPE and let the error checking
1967 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001968#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001969 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00001970#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001971 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001972}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001973
1974static char fromfd_doc[] =
1975"fromfd(fd, family, type[, proto]) -> socket object\n\
1976\n\
1977Create a socket object from the given file descriptor.\n\
1978The remaining arguments are the same as for socket().";
1979
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001980#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001981
Guido van Rossum82a5c661998-07-07 20:45:43 +00001982
Guido van Rossum006bf911996-06-12 04:04:55 +00001983static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001984PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001985{
1986 int x1, x2;
1987
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001988 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001989 return NULL;
1990 }
1991 x2 = (int)ntohs((short)x1);
1992 return PyInt_FromLong(x2);
1993}
1994
Guido van Rossum82a5c661998-07-07 20:45:43 +00001995static char ntohs_doc[] =
1996"ntohs(integer) -> integer\n\
1997\n\
1998Convert a 16-bit integer from network to host byte order.";
1999
2000
Guido van Rossum006bf911996-06-12 04:04:55 +00002001static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002002PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002003{
2004 int x1, x2;
2005
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002006 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002007 return NULL;
2008 }
2009 x2 = ntohl(x1);
2010 return PyInt_FromLong(x2);
2011}
2012
Guido van Rossum82a5c661998-07-07 20:45:43 +00002013static char ntohl_doc[] =
2014"ntohl(integer) -> integer\n\
2015\n\
2016Convert a 32-bit integer from network to host byte order.";
2017
2018
Guido van Rossum006bf911996-06-12 04:04:55 +00002019static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002020PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002021{
2022 int x1, x2;
2023
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002024 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002025 return NULL;
2026 }
2027 x2 = (int)htons((short)x1);
2028 return PyInt_FromLong(x2);
2029}
2030
Guido van Rossum82a5c661998-07-07 20:45:43 +00002031static char htons_doc[] =
2032"htons(integer) -> integer\n\
2033\n\
2034Convert a 16-bit integer from host to network byte order.";
2035
2036
Guido van Rossum006bf911996-06-12 04:04:55 +00002037static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002038PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002039{
2040 int x1, x2;
2041
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002042 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002043 return NULL;
2044 }
2045 x2 = htonl(x1);
2046 return PyInt_FromLong(x2);
2047}
2048
Guido van Rossum82a5c661998-07-07 20:45:43 +00002049static char htonl_doc[] =
2050"htonl(integer) -> integer\n\
2051\n\
2052Convert a 32-bit integer from host to network byte order.";
2053
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002054/*
2055 * socket.inet_aton() and socket.inet_ntoa() functions
2056 *
2057 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2058 *
2059 */
2060
Guido van Rossum48a680c2001-03-02 06:34:14 +00002061static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002062"inet_aton(string) -> packed 32-bit IP representation\n\
2063\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002064Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002065binary format used in low-level network functions.";
2066
2067static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002068PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002069{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002070#ifndef INADDR_NONE
2071#define INADDR_NONE (-1)
2072#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002073
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002074 /* Have to use inet_addr() instead */
2075 char *ip_addr;
2076 long packed_addr;
2077
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002078 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002079 return NULL;
2080 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00002081#ifdef USE_GUSI1
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002082 packed_addr = (long)inet_addr(ip_addr).s_addr;
2083#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002084 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002085#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002086
2087 if (packed_addr == INADDR_NONE) { /* invalid address */
2088 PyErr_SetString(PySocket_Error,
2089 "illegal IP address string passed to inet_aton");
2090 return NULL;
2091 }
2092
2093 return PyString_FromStringAndSize((char *) &packed_addr,
2094 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002095}
2096
Guido van Rossum48a680c2001-03-02 06:34:14 +00002097static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002098"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002099\n\
2100Convert an IP address from 32-bit packed binary format to string format";
2101
2102static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002103PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002104{
2105 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002106 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002107 struct in_addr packed_addr;
2108
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002109 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002110 return NULL;
2111 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002112
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002113 if (addr_len != sizeof(packed_addr)) {
2114 PyErr_SetString(PySocket_Error,
2115 "packed IP wrong length for inet_ntoa");
2116 return NULL;
2117 }
2118
2119 memcpy(&packed_addr, packed_str, addr_len);
2120
2121 return PyString_FromString(inet_ntoa(packed_addr));
2122}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002123
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002124
2125#ifdef USE_SSL
2126
2127/* This is a C function to be called for new object initialization */
2128static SSLObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002129newSSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002130{
2131 SSLObject *self;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002132
Guido van Rossumb18618d2000-05-03 23:44:39 +00002133 self = PyObject_New(SSLObject, &SSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002134 if (self == NULL){
2135 PyErr_SetObject(SSLErrorObject,
2136 PyString_FromString("newSSLObject error"));
2137 return NULL;
2138 }
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002139 memset(self->server, '\0', sizeof(char) * 256);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002140 memset(self->issuer, '\0', sizeof(char) * 256);
2141
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002142 self->x_attr = PyDict_New();
2143 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
2144 if (self->ctx == NULL) {
2145 PyErr_SetObject(SSLErrorObject,
2146 PyString_FromString("SSL_CTX_new error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002147 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002148 return NULL;
2149 }
2150
2151 if ( (key_file && !cert_file) || (!key_file && cert_file) )
2152 {
2153 PyErr_SetObject(SSLErrorObject,
2154 PyString_FromString(
2155 "Both the key & certificate files must be specified"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002156 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002157 return NULL;
2158 }
2159
2160 if (key_file && cert_file)
2161 {
2162 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
2163 SSL_FILETYPE_PEM) < 1)
2164 {
2165 PyErr_SetObject(SSLErrorObject,
2166 PyString_FromString(
2167 "SSL_CTX_use_PrivateKey_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002168 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002169 return NULL;
2170 }
2171
2172 if (SSL_CTX_use_certificate_chain_file(self->ctx,
2173 cert_file) < 1)
2174 {
2175 PyErr_SetObject(SSLErrorObject,
2176 PyString_FromString(
2177 "SSL_CTX_use_certificate_chain_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002178 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002179 return NULL;
2180 }
2181 }
2182
2183 SSL_CTX_set_verify(self->ctx,
2184 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2185 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2186 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2187 SSL_set_connect_state(self->ssl);
2188
2189 if ((SSL_connect(self->ssl)) == -1) {
2190 /* Actually negotiate SSL connection */
2191 PyErr_SetObject(SSLErrorObject,
2192 PyString_FromString("SSL_connect error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002193 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002194 return NULL;
2195 }
2196 self->ssl->debug = 1;
2197
2198 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2199 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
2200 self->server, 256);
2201 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2202 self->issuer, 256);
2203 }
2204 self->x_attr = NULL;
2205 self->Socket = Sock;
2206 Py_INCREF(self->Socket);
2207 return self;
2208}
2209
2210/* This is the Python function called for new object initialization */
2211static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002212PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002213{
2214 SSLObject *rv;
2215 PySocketSockObject *Sock;
2216 char *key_file;
2217 char *cert_file;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002218
Guido van Rossum43713e52000-02-29 13:59:29 +00002219 if (!PyArg_ParseTuple(args, "O!zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002220 &PySocketSock_Type, (PyObject*)&Sock,
2221 &key_file, &cert_file) )
2222 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002223
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002224 rv = newSSLObject(Sock, key_file, cert_file);
2225 if ( rv == NULL )
2226 return NULL;
2227 return (PyObject *)rv;
2228}
2229
2230static char ssl_doc[] =
2231"ssl(socket, keyfile, certfile) -> sslobject";
2232
2233static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002234SSL_server(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002235{
2236 return PyString_FromString(self->server);
2237}
2238
2239static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002240SSL_issuer(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002241{
2242 return PyString_FromString(self->issuer);
2243}
2244
2245
2246/* SSL object methods */
2247
2248static PyMethodDef SSLMethods[] = {
2249 { "write", (PyCFunction)SSL_SSLwrite, 1 },
2250 { "read", (PyCFunction)SSL_SSLread, 1 },
2251 { "server", (PyCFunction)SSL_server, 1 },
2252 { "issuer", (PyCFunction)SSL_issuer, 1 },
2253 { NULL, NULL}
2254};
2255
2256static void SSL_dealloc(SSLObject *self)
2257{
2258 if (self->server_cert) /* Possible not to have one? */
2259 X509_free (self->server_cert);
2260 SSL_CTX_free(self->ctx);
2261 SSL_free(self->ssl);
2262 Py_XDECREF(self->x_attr);
2263 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002264 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002265}
2266
2267static PyObject *SSL_getattr(SSLObject *self, char *name)
2268{
2269 return Py_FindMethod(SSLMethods, (PyObject *)self, name);
2270}
2271
2272staticforward PyTypeObject SSL_Type = {
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002273 PyObject_HEAD_INIT(NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002274 0, /*ob_size*/
2275 "SSL", /*tp_name*/
2276 sizeof(SSLObject), /*tp_basicsize*/
2277 0, /*tp_itemsize*/
2278 /* methods */
2279 (destructor)SSL_dealloc, /*tp_dealloc*/
2280 0, /*tp_print*/
2281 (getattrfunc)SSL_getattr, /*tp_getattr*/
2282 0, /*tp_setattr*/
2283 0, /*tp_compare*/
2284 0, /*tp_repr*/
2285 0, /*tp_as_number*/
2286 0, /*tp_as_sequence*/
2287 0, /*tp_as_mapping*/
2288 0, /*tp_hash*/
2289};
2290
2291
2292
2293static PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args)
2294{
2295 char *data;
Andrew M. Kuchlingb38175e2001-02-07 20:41:17 +00002296 size_t len;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002297
Andrew M. Kuchlingb38175e2001-02-07 20:41:17 +00002298 if (!PyArg_ParseTuple(args, "s#:write", &data, &len))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002299 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002300
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002301 len = SSL_write(self->ssl, data, len);
2302 return PyInt_FromLong((long)len);
2303}
2304
2305static PyObject *SSL_SSLread(SSLObject *self, PyObject *args)
2306{
2307 PyObject *buf;
2308 int count = 0;
2309 int len = 1024;
2310 int res;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002311
Guido van Rossum43713e52000-02-29 13:59:29 +00002312 PyArg_ParseTuple(args, "|i:read", &len);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002313
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002314 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2315 return NULL; /* Error object should already be set */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002316
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002317 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2318 res = SSL_get_error(self->ssl, count);
2319
2320 switch (res) {
Jeremy Hylton42dd01a2001-02-01 23:35:20 +00002321 case SSL_ERROR_NONE:
2322 assert(count > 0);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002323 break;
Jeremy Hylton42dd01a2001-02-01 23:35:20 +00002324 case SSL_ERROR_ZERO_RETURN: /* normal EOF */
2325 assert(count == 0);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002326 break;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002327 default:
2328 return PyErr_SetFromErrno(SSLErrorObject);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002329 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002330
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002331 fflush(stderr);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002332
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002333 if (count < 0) {
2334 Py_DECREF(buf);
2335 return PyErr_SetFromErrno(SSLErrorObject);
2336 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002337
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002338 if (count != len && _PyString_Resize(&buf, count) < 0)
2339 return NULL;
2340 return buf;
2341}
2342
2343#endif /* USE_SSL */
2344
2345
Guido van Rossum30a685f1991-06-27 15:51:29 +00002346/* List of functions exported by this module. */
2347
Guido van Rossum73624e91994-10-10 17:59:00 +00002348static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002349 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002350 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002351 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002352 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002353 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002354 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002355 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002356 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002357 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002358 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002359 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002360 METH_VARARGS,getprotobyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002361 {"socket", PySocket_socket,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002362 METH_VARARGS, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002363#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002364 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002365 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002366#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002367 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002368 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002369 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002370 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002371 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002372 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002373 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002374 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002375 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002376 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002377 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002378 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002379#ifdef USE_SSL
Guido van Rossum48a680c2001-03-02 06:34:14 +00002380 {"ssl", PySocket_ssl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002381 METH_VARARGS, ssl_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002382#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002383 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002384};
2385
Guido van Rossum30a685f1991-06-27 15:51:29 +00002386
2387/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002388 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002389 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002390 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002391static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002392insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002393{
Guido van Rossum73624e91994-10-10 17:59:00 +00002394 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002395 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002396 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002397
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002398 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002399}
2400
Guido van Rossum30a685f1991-06-27 15:51:29 +00002401
Guido van Rossum8d665e61996-06-26 18:22:49 +00002402#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002403
2404/* Additional initialization and cleanup for NT/Windows */
2405
2406static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002407NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002408{
2409 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002410}
2411
2412static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002413NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002414{
2415 WSADATA WSAData;
2416 int ret;
2417 char buf[100];
2418 ret = WSAStartup(0x0101, &WSAData);
2419 switch (ret) {
2420 case 0: /* no error */
2421 atexit(NTcleanup);
2422 return 1;
2423 case WSASYSNOTREADY:
2424 PyErr_SetString(PyExc_ImportError,
2425 "WSAStartup failed: network not ready");
2426 break;
2427 case WSAVERNOTSUPPORTED:
2428 case WSAEINVAL:
2429 PyErr_SetString(PyExc_ImportError,
2430 "WSAStartup failed: requested version not supported");
2431 break;
2432 default:
2433 sprintf(buf, "WSAStartup failed: error code %d", ret);
2434 PyErr_SetString(PyExc_ImportError, buf);
2435 break;
2436 }
2437 return 0;
2438}
2439
Guido van Rossum8d665e61996-06-26 18:22:49 +00002440#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002441
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002442#if defined(PYOS_OS2)
2443
2444/* Additional initialization and cleanup for OS/2 */
2445
2446static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002447OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002448{
2449 /* No cleanup is necessary for OS/2 Sockets */
2450}
2451
2452static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002453OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002454{
2455 char reason[64];
2456 int rc = sock_init();
2457
2458 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002459 atexit(OS2cleanup);
2460 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002461 }
2462
2463 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2464 PyErr_SetString(PyExc_ImportError, reason);
2465
Guido van Rossum32c575d1997-12-02 20:37:32 +00002466 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002467}
2468
2469#endif /* PYOS_OS2 */
2470
Guido van Rossum30a685f1991-06-27 15:51:29 +00002471/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002472 * This is called when the first 'import socket' is done,
2473 * via a table in config.c, if config.c is compiled with USE_SOCKET
2474 * defined.
2475 *
2476 * For MS_WINDOWS (which means any Windows variant), this module
2477 * is actually called "_socket", and there's a wrapper "socket.py"
2478 * which implements some missing functionality (such as makefile(),
2479 * dup() and fromfd()). The import of "_socket" may fail with an
2480 * ImportError exception if initialization of WINSOCK fails. When
2481 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2482 * scheduled to be made at exit time.
2483 *
2484 * For OS/2, this module is also called "_socket" and uses a wrapper
2485 * "socket.py" which implements that functionality that is missing
2486 * when PC operating systems don't put socket descriptors in the
2487 * operating system's filesystem layer.
2488 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002489
Guido van Rossum82a5c661998-07-07 20:45:43 +00002490static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00002491"Implementation module for socket operations. See the socket module\n\
2492for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00002493
2494static char sockettype_doc[] =
2495"A socket represents one endpoint of a network connection.\n\
2496\n\
2497Methods:\n\
2498\n\
2499accept() -- accept a connection, returning new socket and client address\n\
2500bind() -- bind the socket to a local address\n\
2501close() -- close the socket\n\
2502connect() -- connect the socket to a remote address\n\
2503connect_ex() -- connect, return an error code instead of an exception \n\
2504dup() -- return a new socket object identical to the current one (*)\n\
2505fileno() -- return underlying file descriptor\n\
2506getpeername() -- return remote address (*)\n\
2507getsockname() -- return local address\n\
2508getsockopt() -- get socket options\n\
2509listen() -- start listening for incoming connections\n\
2510makefile() -- return a file object corresponding tot the socket (*)\n\
2511recv() -- receive data\n\
2512recvfrom() -- receive data and sender's address\n\
2513send() -- send data\n\
2514sendto() -- send data to a given address\n\
2515setblocking() -- set or clear the blocking I/O flag\n\
2516setsockopt() -- set socket options\n\
2517shutdown() -- shut down traffic in one or both directions\n\
2518\n\
2519(*) not available on all platforms!)";
2520
Guido van Rossum3886bb61998-12-04 18:50:17 +00002521DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002522init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002523{
Guido van Rossum73624e91994-10-10 17:59:00 +00002524 PyObject *m, *d;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002525#ifdef RISCOS
2526 _kernel_swi_regs r;
2527 r.r[0]=0;
2528 _kernel_swi(0x43380, &r, &r);
2529 taskwindow = r.r[0];
2530#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00002531#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002532 if (!NTinit())
2533 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002534#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002535#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002536 if (!OS2init())
2537 return;
Fred Drakea136d492000-08-16 14:18:30 +00002538#endif /* __TOS_OS2__ */
2539#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002540#endif /* RISCOS */
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002541#ifdef USE_SSL
2542 SSL_Type.ob_type = &PyType_Type;
2543#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00002544 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00002545 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002546 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2547 if (PySocket_Error == NULL)
2548 return;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002549#ifdef USE_SSL
2550 SSL_load_error_strings();
2551 SSLeay_add_ssl_algorithms();
2552 SSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2553 if (SSLErrorObject == NULL)
2554 return;
2555 PyDict_SetItemString(d, "sslerror", SSLErrorObject);
2556 Py_INCREF(&SSL_Type);
2557 if (PyDict_SetItemString(d, "SSLType",
2558 (PyObject *)&SSL_Type) != 0)
2559 return;
2560#endif /* USE_SSL */
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002561 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002562 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002563 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002564 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002565 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002566 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002567 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002568
2569 /* Address families (we only support AF_INET and AF_UNIX) */
2570#ifdef AF_UNSPEC
2571 insint(d, "AF_UNSPEC", AF_UNSPEC);
2572#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002573 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002574#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002575 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002576#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002577#ifdef AF_AX25
2578 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2579#endif
2580#ifdef AF_IPX
2581 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2582#endif
2583#ifdef AF_APPLETALK
2584 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2585#endif
2586#ifdef AF_NETROM
2587 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2588#endif
2589#ifdef AF_BRIDGE
2590 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2591#endif
2592#ifdef AF_AAL5
2593 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2594#endif
2595#ifdef AF_X25
2596 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2597#endif
2598#ifdef AF_INET6
2599 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2600#endif
2601#ifdef AF_ROSE
2602 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2603#endif
Jeremy Hylton22308652001-02-02 03:23:09 +00002604#if defined(linux) && defined(AF_PACKET)
2605 insint(d, "AF_PACKET", AF_PACKET);
2606 insint(d, "PF_PACKET", PF_PACKET);
2607 insint(d, "PACKET_HOST", PACKET_HOST);
2608 insint(d, "PACKET_BROADCAST", PACKET_BROADCAST);
2609 insint(d, "PACKET_MULTICAST", PACKET_MULTICAST);
2610 insint(d, "PACKET_OTHERHOST", PACKET_OTHERHOST);
2611 insint(d, "PACKET_OUTGOING", PACKET_OUTGOING);
2612 insint(d, "PACKET_LOOPBACK", PACKET_LOOPBACK);
2613 insint(d, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002614#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002615
2616 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002617 insint(d, "SOCK_STREAM", SOCK_STREAM);
2618 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002619#ifndef __BEOS__
2620/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002621 insint(d, "SOCK_RAW", SOCK_RAW);
2622 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2623 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002624#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002625
2626#ifdef SO_DEBUG
2627 insint(d, "SO_DEBUG", SO_DEBUG);
2628#endif
2629#ifdef SO_ACCEPTCONN
2630 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2631#endif
2632#ifdef SO_REUSEADDR
2633 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2634#endif
2635#ifdef SO_KEEPALIVE
2636 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2637#endif
2638#ifdef SO_DONTROUTE
2639 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2640#endif
2641#ifdef SO_BROADCAST
2642 insint(d, "SO_BROADCAST", SO_BROADCAST);
2643#endif
2644#ifdef SO_USELOOPBACK
2645 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2646#endif
2647#ifdef SO_LINGER
2648 insint(d, "SO_LINGER", SO_LINGER);
2649#endif
2650#ifdef SO_OOBINLINE
2651 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2652#endif
2653#ifdef SO_REUSEPORT
2654 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2655#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002656#ifdef SO_SNDBUF
2657 insint(d, "SO_SNDBUF", SO_SNDBUF);
2658#endif
2659#ifdef SO_RCVBUF
2660 insint(d, "SO_RCVBUF", SO_RCVBUF);
2661#endif
2662#ifdef SO_SNDLOWAT
2663 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2664#endif
2665#ifdef SO_RCVLOWAT
2666 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2667#endif
2668#ifdef SO_SNDTIMEO
2669 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2670#endif
2671#ifdef SO_RCVTIMEO
2672 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2673#endif
2674#ifdef SO_ERROR
2675 insint(d, "SO_ERROR", SO_ERROR);
2676#endif
2677#ifdef SO_TYPE
2678 insint(d, "SO_TYPE", SO_TYPE);
2679#endif
2680
2681 /* Maximum number of connections for "listen" */
2682#ifdef SOMAXCONN
2683 insint(d, "SOMAXCONN", SOMAXCONN);
2684#else
2685 insint(d, "SOMAXCONN", 5); /* Common value */
2686#endif
2687
2688 /* Flags for send, recv */
2689#ifdef MSG_OOB
2690 insint(d, "MSG_OOB", MSG_OOB);
2691#endif
2692#ifdef MSG_PEEK
2693 insint(d, "MSG_PEEK", MSG_PEEK);
2694#endif
2695#ifdef MSG_DONTROUTE
2696 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2697#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002698#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00002699 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002700#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002701#ifdef MSG_EOR
2702 insint(d, "MSG_EOR", MSG_EOR);
2703#endif
2704#ifdef MSG_TRUNC
2705 insint(d, "MSG_TRUNC", MSG_TRUNC);
2706#endif
2707#ifdef MSG_CTRUNC
2708 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2709#endif
2710#ifdef MSG_WAITALL
2711 insint(d, "MSG_WAITALL", MSG_WAITALL);
2712#endif
2713#ifdef MSG_BTAG
2714 insint(d, "MSG_BTAG", MSG_BTAG);
2715#endif
2716#ifdef MSG_ETAG
2717 insint(d, "MSG_ETAG", MSG_ETAG);
2718#endif
2719
2720 /* Protocol level and numbers, usable for [gs]etsockopt */
2721#ifdef SOL_SOCKET
2722 insint(d, "SOL_SOCKET", SOL_SOCKET);
2723#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002724#ifdef SOL_IP
2725 insint(d, "SOL_IP", SOL_IP);
2726#else
2727 insint(d, "SOL_IP", 0);
2728#endif
2729#ifdef SOL_IPX
2730 insint(d, "SOL_IPX", SOL_IPX);
2731#endif
2732#ifdef SOL_AX25
2733 insint(d, "SOL_AX25", SOL_AX25);
2734#endif
2735#ifdef SOL_ATALK
2736 insint(d, "SOL_ATALK", SOL_ATALK);
2737#endif
2738#ifdef SOL_NETROM
2739 insint(d, "SOL_NETROM", SOL_NETROM);
2740#endif
2741#ifdef SOL_ROSE
2742 insint(d, "SOL_ROSE", SOL_ROSE);
2743#endif
2744#ifdef SOL_TCP
2745 insint(d, "SOL_TCP", SOL_TCP);
2746#else
2747 insint(d, "SOL_TCP", 6);
2748#endif
2749#ifdef SOL_UDP
2750 insint(d, "SOL_UDP", SOL_UDP);
2751#else
2752 insint(d, "SOL_UDP", 17);
2753#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002754#ifdef IPPROTO_IP
2755 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002756#else
2757 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002758#endif
2759#ifdef IPPROTO_ICMP
2760 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002761#else
2762 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002763#endif
2764#ifdef IPPROTO_IGMP
2765 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2766#endif
2767#ifdef IPPROTO_GGP
2768 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2769#endif
2770#ifdef IPPROTO_TCP
2771 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002772#else
2773 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002774#endif
2775#ifdef IPPROTO_EGP
2776 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2777#endif
2778#ifdef IPPROTO_PUP
2779 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2780#endif
2781#ifdef IPPROTO_UDP
2782 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002783#else
2784 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002785#endif
2786#ifdef IPPROTO_IDP
2787 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2788#endif
2789#ifdef IPPROTO_HELLO
2790 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2791#endif
2792#ifdef IPPROTO_ND
2793 insint(d, "IPPROTO_ND", IPPROTO_ND);
2794#endif
2795#ifdef IPPROTO_TP
2796 insint(d, "IPPROTO_TP", IPPROTO_TP);
2797#endif
2798#ifdef IPPROTO_XTP
2799 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2800#endif
2801#ifdef IPPROTO_EON
2802 insint(d, "IPPROTO_EON", IPPROTO_EON);
2803#endif
2804#ifdef IPPROTO_BIP
2805 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2806#endif
2807/**/
2808#ifdef IPPROTO_RAW
2809 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002810#else
2811 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002812#endif
2813#ifdef IPPROTO_MAX
2814 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2815#endif
2816
2817 /* Some port configuration */
2818#ifdef IPPORT_RESERVED
2819 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2820#else
2821 insint(d, "IPPORT_RESERVED", 1024);
2822#endif
2823#ifdef IPPORT_USERRESERVED
2824 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2825#else
2826 insint(d, "IPPORT_USERRESERVED", 5000);
2827#endif
2828
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002829 /* Some reserved IP v.4 addresses */
2830#ifdef INADDR_ANY
2831 insint(d, "INADDR_ANY", INADDR_ANY);
2832#else
2833 insint(d, "INADDR_ANY", 0x00000000);
2834#endif
2835#ifdef INADDR_BROADCAST
2836 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2837#else
2838 insint(d, "INADDR_BROADCAST", 0xffffffff);
2839#endif
2840#ifdef INADDR_LOOPBACK
2841 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2842#else
2843 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2844#endif
2845#ifdef INADDR_UNSPEC_GROUP
2846 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2847#else
2848 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2849#endif
2850#ifdef INADDR_ALLHOSTS_GROUP
2851 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2852#else
2853 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2854#endif
2855#ifdef INADDR_MAX_LOCAL_GROUP
2856 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2857#else
2858 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2859#endif
2860#ifdef INADDR_NONE
2861 insint(d, "INADDR_NONE", INADDR_NONE);
2862#else
2863 insint(d, "INADDR_NONE", 0xffffffff);
2864#endif
2865
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002866 /* IP [gs]etsockopt options */
2867#ifdef IP_OPTIONS
2868 insint(d, "IP_OPTIONS", IP_OPTIONS);
2869#endif
2870#ifdef IP_HDRINCL
2871 insint(d, "IP_HDRINCL", IP_HDRINCL);
2872#endif
2873#ifdef IP_TOS
2874 insint(d, "IP_TOS", IP_TOS);
2875#endif
2876#ifdef IP_TTL
2877 insint(d, "IP_TTL", IP_TTL);
2878#endif
2879#ifdef IP_RECVOPTS
2880 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2881#endif
2882#ifdef IP_RECVRETOPTS
2883 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2884#endif
2885#ifdef IP_RECVDSTADDR
2886 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2887#endif
2888#ifdef IP_RETOPTS
2889 insint(d, "IP_RETOPTS", IP_RETOPTS);
2890#endif
2891#ifdef IP_MULTICAST_IF
2892 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2893#endif
2894#ifdef IP_MULTICAST_TTL
2895 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2896#endif
2897#ifdef IP_MULTICAST_LOOP
2898 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2899#endif
2900#ifdef IP_ADD_MEMBERSHIP
2901 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2902#endif
2903#ifdef IP_DROP_MEMBERSHIP
2904 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2905#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002906#ifdef IP_DEFAULT_MULTICAST_TTL
2907 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
2908#endif
2909#ifdef IP_DEFAULT_MULTICAST_LOOP
2910 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
2911#endif
2912#ifdef IP_MAX_MEMBERSHIPS
2913 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
2914#endif
2915
2916 /* TCP options */
2917#ifdef TCP_NODELAY
2918 insint(d, "TCP_NODELAY", TCP_NODELAY);
2919#endif
2920#ifdef TCP_MAXSEG
2921 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
2922#endif
2923
2924 /* IPX options */
2925#ifdef IPX_TYPE
2926 insint(d, "IPX_TYPE", IPX_TYPE);
2927#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002928
2929 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002930#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002931 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002932#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002933}