blob: 962fbfa374be5ff8fc19036634387071009558f9 [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
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000181#ifdef HAVE_STDDEF_H
182#include <stddef.h>
183#endif
184
185#ifndef offsetof
186#define offsetof(type, member) ((size_t)(&((type *)0)->member))
187#endif
188
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000189#ifndef O_NDELAY
190#define O_NDELAY O_NONBLOCK /* For QNX only? */
191#endif
192
Guido van Rossumff3ab422000-04-24 15:16:03 +0000193#ifdef USE_GUSI1
Jack Jansen508537b1996-02-14 15:57:45 +0000194/* fdopen() isn't declared in stdio.h (sigh) */
195#include <GUSI.h>
196#endif
197
Tim Peters7e82b9c2001-06-24 05:08:52 +0000198/* XXX 24-Jun-2000 Tim: I have no idea what the code inside this block is
199 trying to do, and don't have time to look. Looks like Unix-specific code
200 in those files, though, which will never compile on Windows. */
201#ifndef MS_WINDOWS
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000202#include "addrinfo.h"
Tim Peters7e82b9c2001-06-24 05:08:52 +0000203#endif /* ifndef MS_WINDOWS hack */
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000204
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000205#ifdef USE_SSL
Andrew M. Kuchling697a0b02001-01-18 17:41:41 +0000206#include "openssl/rsa.h"
207#include "openssl/crypto.h"
208#include "openssl/x509.h"
209#include "openssl/pem.h"
210#include "openssl/ssl.h"
211#include "openssl/err.h"
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000212#endif /* USE_SSL */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000213
Tim Peters7e82b9c2001-06-24 05:08:52 +0000214/* XXX 24-Jun-2000 Tim: I have no idea what the code inside this block is
215 trying to do, and don't have time to look. Looks like Unix-specific code
216 in those files, though, which will never compile on Windows. */
217#ifndef MS_WINDOWS
218
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000219#ifndef HAVE_INET_PTON
Martin v. Löwis51777ce2001-06-25 06:38:03 +0000220int inet_pton (int af, char *src, void *dst);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000221char *inet_ntop(int af, void *src, char *dst, socklen_t size);
222#endif
223
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000224/* I know this is a bad practice, but it is the easiest... */
225#ifndef HAVE_GETADDRINFO
226#include "getaddrinfo.c"
227#endif
228#ifndef HAVE_GETNAMEINFO
229#include "getnameinfo.c"
230#endif
231
Tim Peters7e82b9c2001-06-24 05:08:52 +0000232#endif /* ifndef MS_WINDOWS hack */
233
Guido van Rossumbcc20741998-08-04 22:53:56 +0000234#if defined(MS_WINDOWS) || defined(__BEOS__)
235/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000236/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000237#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000238#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000239#endif
240
Fred Drakea04eaad2000-06-30 02:46:07 +0000241/* abstract the socket file descriptor type */
242#ifdef MS_WINDOWS
243typedef SOCKET SOCKET_T;
244# ifdef MS_WIN64
245# define SIZEOF_SOCKET_T 8
246# else
247# define SIZEOF_SOCKET_T 4
248# endif
249#else
250typedef int SOCKET_T;
251# define SIZEOF_SOCKET_T SIZEOF_INT
252#endif
253
254
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000255#if defined(PYOS_OS2)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000256#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000257#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000258#endif
259
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000260#ifndef SOCKETCLOSE
261#define SOCKETCLOSE close
262#endif
263
Guido van Rossum30a685f1991-06-27 15:51:29 +0000264/* Global variable holding the exception type for errors detected
265 by this module (but not argument type or memory errors, etc.). */
266
Guido van Rossum73624e91994-10-10 17:59:00 +0000267static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000268
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000269#ifdef USE_SSL
270static PyObject *SSLErrorObject;
271#endif /* USE_SSL */
272
Guido van Rossum30a685f1991-06-27 15:51:29 +0000273
Guido van Rossum48a680c2001-03-02 06:34:14 +0000274#ifdef RISCOS
275/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
276static int taskwindow;
277#endif
278
279
Guido van Rossum30a685f1991-06-27 15:51:29 +0000280/* Convenience function to raise an error according to errno
281 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000282
Guido van Rossum73624e91994-10-10 17:59:00 +0000283static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000284PySocket_Err(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000285{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000286#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000287 int err_no = WSAGetLastError();
288 if (err_no) {
289 static struct { int no; const char *msg; } *msgp, msgs[] = {
290 { WSAEINTR, "Interrupted system call" },
291 { WSAEBADF, "Bad file descriptor" },
292 { WSAEACCES, "Permission denied" },
293 { WSAEFAULT, "Bad address" },
294 { WSAEINVAL, "Invalid argument" },
295 { WSAEMFILE, "Too many open files" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000296 { WSAEWOULDBLOCK,
Mark Hammond46a733d2000-07-24 01:45:11 +0000297 "The socket operation could not complete "
298 "without blocking" },
299 { WSAEINPROGRESS, "Operation now in progress" },
300 { WSAEALREADY, "Operation already in progress" },
301 { WSAENOTSOCK, "Socket operation on non-socket" },
302 { WSAEDESTADDRREQ, "Destination address required" },
303 { WSAEMSGSIZE, "Message too long" },
304 { WSAEPROTOTYPE, "Protocol wrong type for socket" },
305 { WSAENOPROTOOPT, "Protocol not available" },
306 { WSAEPROTONOSUPPORT, "Protocol not supported" },
307 { WSAESOCKTNOSUPPORT, "Socket type not supported" },
308 { WSAEOPNOTSUPP, "Operation not supported" },
309 { WSAEPFNOSUPPORT, "Protocol family not supported" },
310 { WSAEAFNOSUPPORT, "Address family not supported" },
311 { WSAEADDRINUSE, "Address already in use" },
312 { WSAEADDRNOTAVAIL,
313 "Can't assign requested address" },
314 { WSAENETDOWN, "Network is down" },
315 { WSAENETUNREACH, "Network is unreachable" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000316 { WSAENETRESET,
Mark Hammond46a733d2000-07-24 01:45:11 +0000317 "Network dropped connection on reset" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000318 { WSAECONNABORTED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000319 "Software caused connection abort" },
320 { WSAECONNRESET, "Connection reset by peer" },
321 { WSAENOBUFS, "No buffer space available" },
322 { WSAEISCONN, "Socket is already connected" },
323 { WSAENOTCONN, "Socket is not connected" },
324 { WSAESHUTDOWN, "Can't send after socket shutdown" },
325 { WSAETOOMANYREFS,
326 "Too many references: can't splice" },
327 { WSAETIMEDOUT, "Operation timed out" },
328 { WSAECONNREFUSED, "Connection refused" },
329 { WSAELOOP, "Too many levels of symbolic links" },
330 { WSAENAMETOOLONG, "File name too long" },
331 { WSAEHOSTDOWN, "Host is down" },
332 { WSAEHOSTUNREACH, "No route to host" },
333 { WSAENOTEMPTY, "Directory not empty" },
334 { WSAEPROCLIM, "Too many processes" },
335 { WSAEUSERS, "Too many users" },
336 { WSAEDQUOT, "Disc quota exceeded" },
337 { WSAESTALE, "Stale NFS file handle" },
338 { WSAEREMOTE, "Too many levels of remote in path" },
339 { WSASYSNOTREADY,
340 "Network subsystem is unvailable" },
341 { WSAVERNOTSUPPORTED,
342 "WinSock version is not supported" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000343 { WSANOTINITIALISED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000344 "Successful WSAStartup() not yet performed" },
345 { WSAEDISCON, "Graceful shutdown in progress" },
346 /* Resolver errors */
347 { WSAHOST_NOT_FOUND, "No such host is known" },
348 { WSATRY_AGAIN, "Host not found, or server failed" },
349 { WSANO_RECOVERY,
350 "Unexpected server error encountered" },
351 { WSANO_DATA, "Valid name without requested data" },
352 { WSANO_ADDRESS, "No address, look for MX record" },
353 { 0, NULL }
354 };
Guido van Rossum73624e91994-10-10 17:59:00 +0000355 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000356 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000357
Mark Hammond46a733d2000-07-24 01:45:11 +0000358 for (msgp = msgs; msgp->msg; msgp++) {
359 if (err_no == msgp->no) {
360 msg = msgp->msg;
361 break;
362 }
363 }
364
365 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000366 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000367 PyErr_SetObject(PySocket_Error, v);
368 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000369 }
370 return NULL;
371 }
372 else
373#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000374
375#if defined(PYOS_OS2)
376 if (sock_errno() != NO_ERROR) {
377 APIRET rc;
378 ULONG msglen;
379 char outbuf[100];
380 int myerrorcode = sock_errno();
381
382 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
383 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
384 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
385 if (rc == NO_ERROR) {
386 PyObject *v;
387
388 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
389 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
390 char *lastc = &outbuf[ strlen(outbuf)-1 ];
391 while (lastc > outbuf && isspace(*lastc))
392 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
393 }
394 v = Py_BuildValue("(is)", myerrorcode, outbuf);
395 if (v != NULL) {
396 PyErr_SetObject(PySocket_Error, v);
397 Py_DECREF(v);
398 }
399 return NULL;
400 }
401 }
402#endif
403
Guido van Rossum73624e91994-10-10 17:59:00 +0000404 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000405}
406
Guido van Rossum30a685f1991-06-27 15:51:29 +0000407
408/* The object holding a socket. It holds some extra information,
409 like the address family, which is used to decode socket address
410 arguments properly. */
411
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000412typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000413 PyObject_HEAD
Fred Drakea04eaad2000-06-30 02:46:07 +0000414 SOCKET_T sock_fd; /* Socket file descriptor */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000415 int sock_family; /* Address family, e.g., AF_INET */
416 int sock_type; /* Socket type, e.g., SOCK_STREAM */
417 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000418 union sock_addr {
419 struct sockaddr_in in;
420#ifdef AF_UNIX
421 struct sockaddr_un un;
422#endif
Jeremy Hylton22308652001-02-02 03:23:09 +0000423#if defined(linux) && defined(AF_PACKET)
424 struct sockaddr_ll ll;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000425#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000426 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000427} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000428
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000429#ifdef USE_SSL
Guido van Rossum30a685f1991-06-27 15:51:29 +0000430
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000431typedef struct {
432 PyObject_HEAD
433 PySocketSockObject *Socket; /* Socket on which we're layered */
434 PyObject *x_attr; /* Attributes dictionary */
435 SSL_CTX* ctx;
436 SSL* ssl;
437 X509* server_cert;
438 BIO* sbio;
439 char server[256];
440 char issuer[256];
441
442} SSLObject;
443
444staticforward PyTypeObject SSL_Type;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000445staticforward PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args);
446staticforward PyObject *SSL_SSLread(SSLObject *self, PyObject *args);
447
448#define SSLObject_Check(v) ((v)->ob_type == &SSL_Type)
449
450#endif /* USE_SSL */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000451
Guido van Rossum30a685f1991-06-27 15:51:29 +0000452/* A forward reference to the Socktype type object.
453 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000454 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000455 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000456
Guido van Rossum73624e91994-10-10 17:59:00 +0000457staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000458
Guido van Rossum30a685f1991-06-27 15:51:29 +0000459
460/* Create a new socket object.
461 This just creates the object and initializes it.
462 If the creation fails, return NULL and set an exception (implicit
463 in NEWOBJ()). */
464
Guido van Rossum73624e91994-10-10 17:59:00 +0000465static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000466PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000467{
Guido van Rossum48a680c2001-03-02 06:34:14 +0000468#ifdef RISCOS
469 int block = 1;
470#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000471 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000472 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000473 s = PyObject_New(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000474 if (s != NULL) {
475 s->sock_fd = fd;
476 s->sock_family = family;
477 s->sock_type = type;
478 s->sock_proto = proto;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000479#ifdef RISCOS
480 if(taskwindow) {
481 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
482 }
483#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000484 }
485 return s;
486}
487
Guido van Rossum30a685f1991-06-27 15:51:29 +0000488
Guido van Rossum48a680c2001-03-02 06:34:14 +0000489/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000490 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000491#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000492PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000493#endif
494
495
Guido van Rossum30a685f1991-06-27 15:51:29 +0000496/* Convert a string specifying a host name or one of a few symbolic
497 names to a numeric IP address. This usually calls gethostbyname()
498 to do the work; the names "" and "<broadcast>" are special.
499 Return the length (should always be 4 bytes), or negative if
500 an error occurred; then an exception is raised. */
501
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000502static int
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000503setipaddr(char* name, struct sockaddr_in * addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000504{
505 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000506 int d1, d2, d3, d4;
Guido van Rossum955becc1999-03-22 20:14:53 +0000507 int h_length;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000508 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000509#ifdef HAVE_GETHOSTBYNAME_R
510 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000511#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
512 struct hostent_data data;
513#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000514 char buf[1001];
515 int buf_len = (sizeof buf) - 1;
516 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000517#endif
518#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000519 int result;
520#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000521#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000522
Guido van Rossuma376cc51996-12-05 23:43:35 +0000523 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000524 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000525 addr_ret->sin_addr.s_addr = INADDR_ANY;
526 return 4;
527 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000528 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000529 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
530 return 4;
531 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000532 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
533 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
534 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
535 addr_ret->sin_addr.s_addr = htonl(
536 ((long) d1 << 24) | ((long) d2 << 16) |
537 ((long) d3 << 8) | ((long) d4 << 0));
538 return 4;
539 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000540 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000541#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000542#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000543 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &hp, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000544#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000545 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000546#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +0000547 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000548 result = gethostbyname_r(name, &hp_allocated, &data);
549 hp = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000550#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000551#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000552#ifdef USE_GETHOSTBYNAME_LOCK
553 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000554#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000555 hp = gethostbyname(name);
556#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000557 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000558
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000559 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000560#ifdef HAVE_HSTRERROR
Guido van Rossum48a680c2001-03-02 06:34:14 +0000561 /* Let's get real error message to return */
562 extern int h_errno;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000563 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
564#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000565 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000566#endif
Guido van Rossum3baaa131999-03-22 21:44:51 +0000567#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000568 PyThread_release_lock(gethostbyname_lock);
569#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000570 return -1;
571 }
572 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
Guido van Rossum955becc1999-03-22 20:14:53 +0000573 h_length = hp->h_length;
Guido van Rossum3baaa131999-03-22 21:44:51 +0000574#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000575 PyThread_release_lock(gethostbyname_lock);
576#endif
577 return h_length;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000578}
579
Guido van Rossum30a685f1991-06-27 15:51:29 +0000580
Guido van Rossum30a685f1991-06-27 15:51:29 +0000581/* Create a string object representing an IP address.
582 This is always a string of the form 'dd.dd.dd.dd' (with variable
583 size numbers). */
584
Guido van Rossum73624e91994-10-10 17:59:00 +0000585static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000586makeipaddr(struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000587{
588 long x = ntohl(addr->sin_addr.s_addr);
589 char buf[100];
590 sprintf(buf, "%d.%d.%d.%d",
591 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
592 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000593 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000594}
595
596
597/* Create an object representing the given socket address,
598 suitable for passing it back to bind(), connect() etc.
599 The family field of the sockaddr structure is inspected
600 to determine what kind of address it really is. */
601
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000602/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000603static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000604makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000605{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000606 if (addrlen == 0) {
607 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000608 Py_INCREF(Py_None);
609 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000610 }
611
Guido van Rossumbcc20741998-08-04 22:53:56 +0000612#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000613 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000614 addr->sa_family = AF_INET;
615#endif
616
Guido van Rossum30a685f1991-06-27 15:51:29 +0000617 switch (addr->sa_family) {
618
619 case AF_INET:
620 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000621 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000622 PyObject *addrobj = makeipaddr(a);
623 PyObject *ret = NULL;
624 if (addrobj) {
625 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
626 Py_DECREF(addrobj);
627 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000628 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000629 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000630
Guido van Rossumb6775db1994-08-01 11:34:53 +0000631#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000632 case AF_UNIX:
633 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000634 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000635 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000636 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000637#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000638
Jeremy Hylton22308652001-02-02 03:23:09 +0000639#if defined(linux) && defined(AF_PACKET)
640 case AF_PACKET:
641 {
642 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
643 char *ifname = "";
644 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000645 /* need to look up interface name give index */
646 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000647 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000648 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000649 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000650 }
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000651 return Py_BuildValue("shbhs#", ifname, ntohs(a->sll_protocol),
Guido van Rossum48a680c2001-03-02 06:34:14 +0000652 a->sll_pkttype, a->sll_hatype,
653 a->sll_addr, a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000654 }
655#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000656
Guido van Rossum30a685f1991-06-27 15:51:29 +0000657 /* More cases here... */
658
659 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000660 /* If we don't know the address family, don't raise an
661 exception -- return it as a tuple. */
662 return Py_BuildValue("is#",
663 addr->sa_family,
664 addr->sa_data,
665 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000666
Guido van Rossum30a685f1991-06-27 15:51:29 +0000667 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000668}
669
Guido van Rossum30a685f1991-06-27 15:51:29 +0000670
671/* Parse a socket address argument according to the socket object's
672 address family. Return 1 if the address was in the proper format,
673 0 of not. The address is returned through addr_ret, its length
674 through len_ret. */
675
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000676static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000677getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000678 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000679{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000680 switch (s->sock_family) {
681
Guido van Rossumb6775db1994-08-01 11:34:53 +0000682#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000683 case AF_UNIX:
684 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000685 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000686 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000687 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000688 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000689 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000690 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000691 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000692 PyErr_SetString(PySocket_Error,
693 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000694 return 0;
695 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000696 addr->sun_family = AF_UNIX;
697 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000698 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000699 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000700 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000701 return 1;
702 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000703#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000704
Guido van Rossum30a685f1991-06-27 15:51:29 +0000705 case AF_INET:
706 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000707 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000708 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000709 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000710 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000711 if (!PyTuple_Check(args)) {
712 PyErr_Format(PyExc_TypeError,
713 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
714 args->ob_type->tp_name);
715 return 0;
716 }
717 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000718 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000719 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000720 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000721 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000722 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000723 *addr_ret = (struct sockaddr *) addr;
724 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000725 return 1;
726 }
727
Jeremy Hylton22308652001-02-02 03:23:09 +0000728#if defined(linux) && defined(AF_PACKET)
729 case AF_PACKET:
730 {
731 struct sockaddr_ll* addr;
732 struct ifreq ifr;
733 char *interfaceName;
734 int protoNumber;
735 int hatype = 0;
736 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000737 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000738
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000739 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
740 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000741 return 0;
742 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
743 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000744 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
745 PyErr_SetFromErrno(PySocket_Error);
Jeremy Hylton22308652001-02-02 03:23:09 +0000746 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000747 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000748 addr = &(s->sock_addr.ll);
749 addr->sll_family = AF_PACKET;
750 addr->sll_protocol = htons((short)protoNumber);
751 addr->sll_ifindex = ifr.ifr_ifindex;
752 addr->sll_pkttype = pkttype;
753 addr->sll_hatype = hatype;
754 *addr_ret = (struct sockaddr *) addr;
755 *len_ret = sizeof *addr;
756 return 1;
757 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000758#endif
759
760
Guido van Rossum30a685f1991-06-27 15:51:29 +0000761 /* More cases here... */
762
763 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000764 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000765 return 0;
766
767 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000768}
769
Guido van Rossum30a685f1991-06-27 15:51:29 +0000770
Guido van Rossum48a680c2001-03-02 06:34:14 +0000771/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000772 Return 1 if the family is known, 0 otherwise. The length is returned
773 through len_ret. */
774
775static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000776getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000777{
778 switch (s->sock_family) {
779
Guido van Rossumb6775db1994-08-01 11:34:53 +0000780#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000781 case AF_UNIX:
782 {
783 *len_ret = sizeof (struct sockaddr_un);
784 return 1;
785 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000786#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000787
788 case AF_INET:
789 {
790 *len_ret = sizeof (struct sockaddr_in);
791 return 1;
792 }
793
Jeremy Hylton22308652001-02-02 03:23:09 +0000794#if defined(linux) && defined(AF_PACKET)
795 case AF_PACKET:
796 {
797 *len_ret = sizeof (struct sockaddr_ll);
798 return 1;
799 }
800#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000801
Guido van Rossum710e1df1992-06-12 10:39:36 +0000802 /* More cases here... */
803
804 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000805 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000806 return 0;
807
808 }
809}
810
811
Guido van Rossum30a685f1991-06-27 15:51:29 +0000812/* s.accept() method */
813
Guido van Rossum73624e91994-10-10 17:59:00 +0000814static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000815PySocketSock_accept(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000816{
817 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000818 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000819 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000820 PyObject *sock = NULL;
821 PyObject *addr = NULL;
822 PyObject *res = NULL;
823
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000824 if (!PyArg_ParseTuple(args, ":accept"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000825 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000826 if (!getsockaddrlen(s, &addrlen))
827 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000828 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000829 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000830 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000831 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000832#ifdef MS_WINDOWS
833 if (newfd == INVALID_SOCKET)
834#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000835 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000836#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000837 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000838
Guido van Rossum30a685f1991-06-27 15:51:29 +0000839 /* Create the new object with unspecified family,
840 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000841 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000842 s->sock_family,
843 s->sock_type,
844 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000845 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000846 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000847 goto finally;
848 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000849 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000850 addrlen);
851 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +0000852 goto finally;
853
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000854 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000855
856 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000857 Py_XDECREF(sock);
858 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000859 return res;
860}
861
Guido van Rossum82a5c661998-07-07 20:45:43 +0000862static char accept_doc[] =
863"accept() -> (socket object, address info)\n\
864\n\
865Wait for an incoming connection. Return a new socket representing the\n\
866connection, and the address of the client. For IP sockets, the address\n\
867info is a pair (hostaddr, port).";
868
Guido van Rossum30a685f1991-06-27 15:51:29 +0000869
Guido van Rossume4485b01994-09-07 14:32:49 +0000870/* s.setblocking(1 | 0) method */
871
Guido van Rossum73624e91994-10-10 17:59:00 +0000872static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000873PySocketSock_setblocking(PySocketSockObject *s, PyObject *args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000874{
875 int block;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000876#ifndef RISCOS
Guido van Rossum644a12b1997-04-09 19:24:53 +0000877#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000878 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000879#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000880#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000881 if (!PyArg_ParseTuple(args, "i:setblocking", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000882 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000883 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000884#ifdef __BEOS__
885 block = !block;
886 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
887 (void *)(&block), sizeof( int ) );
888#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000889#ifndef RISCOS
Guido van Rossum6f489d91996-06-28 20:15:15 +0000890#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000891#ifdef PYOS_OS2
892 block = !block;
893 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
894#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000895 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
896 if (block)
897 delay_flag &= (~O_NDELAY);
898 else
899 delay_flag |= O_NDELAY;
900 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000901#endif /* !PYOS_OS2 */
902#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000903 block = !block;
904 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000905#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000906#endif /* __BEOS__ */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000907#endif /* RISCOS */
Guido van Rossum73624e91994-10-10 17:59:00 +0000908 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000909
Guido van Rossum73624e91994-10-10 17:59:00 +0000910 Py_INCREF(Py_None);
911 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000912}
Guido van Rossume4485b01994-09-07 14:32:49 +0000913
Guido van Rossum82a5c661998-07-07 20:45:43 +0000914static char setblocking_doc[] =
915"setblocking(flag)\n\
916\n\
917Set the socket to blocking (flag is true) or non-blocking (false).\n\
918This uses the FIONBIO ioctl with the O_NDELAY flag.";
919
Guido van Rossume4485b01994-09-07 14:32:49 +0000920
Guido van Rossum48a680c2001-03-02 06:34:14 +0000921#ifdef RISCOS
922/* s.sleeptaskw(1 | 0) method */
923
924static PyObject *
925PySocketSock_sleeptaskw(PySocketSockObject *s,PyObject *args)
926{
927 int block;
928 int delay_flag;
929 if (!PyArg_GetInt(args, &block))
930 return NULL;
931 Py_BEGIN_ALLOW_THREADS
932 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
933 Py_END_ALLOW_THREADS
934
935 Py_INCREF(Py_None);
936 return Py_None;
937}
938static char sleeptaskw_doc[] =
939"sleeptaskw(flag)\n\
940\n\
941Allow sleeps in taskwindows.";
942#endif
943
944
Guido van Rossumaee08791992-09-08 09:05:33 +0000945/* s.setsockopt() method.
946 With an integer third argument, sets an integer option.
947 With a string third argument, sets an option from a buffer;
948 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000949
Guido van Rossum73624e91994-10-10 17:59:00 +0000950static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000951PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000952{
953 int level;
954 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000955 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000956 char *buf;
957 int buflen;
958 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000959
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000960 if (PyArg_ParseTuple(args, "iii:setsockopt",
961 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000962 buf = (char *) &flag;
963 buflen = sizeof flag;
964 }
965 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000966 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000967 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
968 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000969 return NULL;
970 }
Thomas Wouters334fb892000-07-25 12:56:38 +0000971 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000972 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000973 return PySocket_Err();
974 Py_INCREF(Py_None);
975 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000976}
977
Guido van Rossum82a5c661998-07-07 20:45:43 +0000978static char setsockopt_doc[] =
979"setsockopt(level, option, value)\n\
980\n\
981Set a socket option. See the Unix manual for level and option.\n\
982The value argument can either be an integer or a string.";
983
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000984
Guido van Rossumaee08791992-09-08 09:05:33 +0000985/* s.getsockopt() method.
986 With two arguments, retrieves an integer option.
987 With a third integer argument, retrieves a string buffer of that size;
988 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000989
Guido van Rossum73624e91994-10-10 17:59:00 +0000990static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000991PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000992{
993 int level;
994 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000995 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000996 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000997 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000998
Guido van Rossumbcc20741998-08-04 22:53:56 +0000999#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001000 /* We have incomplete socket support. */
1001 PyErr_SetString(PySocket_Error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001002 return NULL;
1003#else
1004
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001005 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1006 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001007 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001008
Guido van Rossumbe32c891996-06-20 16:25:29 +00001009 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001010 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001011 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001012 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001013 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001014 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001015 return PySocket_Err();
1016 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001017 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001018 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001019 PyErr_SetString(PySocket_Error,
1020 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001021 return NULL;
1022 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001023 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001024 if (buf == NULL)
1025 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001026 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001027 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001028 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001029 Py_DECREF(buf);
1030 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +00001031 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001032 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001033 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001034#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001035}
1036
Guido van Rossum82a5c661998-07-07 20:45:43 +00001037static char getsockopt_doc[] =
1038"getsockopt(level, option[, buffersize]) -> value\n\
1039\n\
1040Get a socket option. See the Unix manual for level and option.\n\
1041If a nonzero buffersize argument is given, the return value is a\n\
1042string of that length; otherwise it is an integer.";
1043
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001044
Fred Drake728819a2000-07-01 03:40:12 +00001045/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001046
Guido van Rossum73624e91994-10-10 17:59:00 +00001047static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001048PySocketSock_bind(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001049{
1050 struct sockaddr *addr;
1051 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001052 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001053 PyObject *addro;
1054 if (!PyArg_ParseTuple(args, "O:bind", &addro))
1055 return NULL;
1056 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001057 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001058 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001059 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001060 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001061 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001062 return PySocket_Err();
1063 Py_INCREF(Py_None);
1064 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001065}
1066
Guido van Rossum82a5c661998-07-07 20:45:43 +00001067static char bind_doc[] =
1068"bind(address)\n\
1069\n\
1070Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001071pair (host, port); the host must refer to the local host. For raw packet\n\
1072sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001073
Guido van Rossum30a685f1991-06-27 15:51:29 +00001074
1075/* s.close() method.
1076 Set the file descriptor to -1 so operations tried subsequently
1077 will surely fail. */
1078
Guido van Rossum73624e91994-10-10 17:59:00 +00001079static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001080PySocketSock_close(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001081{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001082 SOCKET_T fd;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001083 if (!PyArg_ParseTuple(args, ":close"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001084 return NULL;
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001085 if ((fd = s->sock_fd) != -1) {
1086 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001087 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001088 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001089 Py_END_ALLOW_THREADS
1090 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001091 Py_INCREF(Py_None);
1092 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001093}
1094
Guido van Rossum82a5c661998-07-07 20:45:43 +00001095static char close_doc[] =
1096"close()\n\
1097\n\
1098Close the socket. It cannot be used after this call.";
1099
Guido van Rossum30a685f1991-06-27 15:51:29 +00001100
Fred Drake728819a2000-07-01 03:40:12 +00001101/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001102
Guido van Rossum73624e91994-10-10 17:59:00 +00001103static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001104PySocketSock_connect(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001105{
1106 struct sockaddr *addr;
1107 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001108 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001109 PyObject *addro;
1110 if (!PyArg_ParseTuple(args, "O:connect", &addro))
1111 return NULL;
1112 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001113 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001114 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001115 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001116 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001117 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001118 return PySocket_Err();
1119 Py_INCREF(Py_None);
1120 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001121}
1122
Guido van Rossum82a5c661998-07-07 20:45:43 +00001123static char connect_doc[] =
1124"connect(address)\n\
1125\n\
1126Connect the socket to a remote address. For IP sockets, the address\n\
1127is a pair (host, port).";
1128
Guido van Rossum30a685f1991-06-27 15:51:29 +00001129
Fred Drake728819a2000-07-01 03:40:12 +00001130/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001131
1132static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001133PySocketSock_connect_ex(PySocketSockObject *s, PyObject *args)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001134{
1135 struct sockaddr *addr;
1136 int addrlen;
1137 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001138 PyObject *addro;
1139 if (!PyArg_ParseTuple(args, "O:connect_ex", &addro))
1140 return NULL;
1141 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001142 return NULL;
1143 Py_BEGIN_ALLOW_THREADS
1144 res = connect(s->sock_fd, addr, addrlen);
1145 Py_END_ALLOW_THREADS
1146 if (res != 0)
1147 res = errno;
1148 return PyInt_FromLong((long) res);
1149}
1150
Guido van Rossum82a5c661998-07-07 20:45:43 +00001151static char connect_ex_doc[] =
1152"connect_ex(address)\n\
1153\n\
1154This is like connect(address), but returns an error code (the errno value)\n\
1155instead of raising an exception when an error occurs.";
1156
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001157
Guido van Rossumed233a51992-06-23 09:07:03 +00001158/* s.fileno() method */
1159
Guido van Rossum73624e91994-10-10 17:59:00 +00001160static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001161PySocketSock_fileno(PySocketSockObject *s, PyObject *args)
Guido van Rossumed233a51992-06-23 09:07:03 +00001162{
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001163 if (!PyArg_ParseTuple(args, ":fileno"))
Guido van Rossumed233a51992-06-23 09:07:03 +00001164 return NULL;
Fred Drakea04eaad2000-06-30 02:46:07 +00001165#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001166 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001167#else
1168 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1169#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001170}
1171
Guido van Rossum82a5c661998-07-07 20:45:43 +00001172static char fileno_doc[] =
1173"fileno() -> integer\n\
1174\n\
1175Return the integer file descriptor of the socket.";
1176
Guido van Rossumed233a51992-06-23 09:07:03 +00001177
Guido van Rossumbe32c891996-06-20 16:25:29 +00001178#ifndef NO_DUP
1179/* s.dup() method */
1180
1181static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001182PySocketSock_dup(PySocketSockObject *s, PyObject *args)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001183{
Fred Drakea04eaad2000-06-30 02:46:07 +00001184 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001185 PyObject *sock;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001186 if (!PyArg_ParseTuple(args, ":dup"))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001187 return NULL;
1188 newfd = dup(s->sock_fd);
1189 if (newfd < 0)
1190 return PySocket_Err();
1191 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001192 s->sock_family,
1193 s->sock_type,
1194 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001195 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001196 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001197 return sock;
1198}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001199
1200static char dup_doc[] =
1201"dup() -> socket object\n\
1202\n\
1203Return a new socket object connected to the same system resource.";
1204
Guido van Rossumbe32c891996-06-20 16:25:29 +00001205#endif
1206
1207
Guido van Rossumc89705d1992-11-26 08:54:07 +00001208/* s.getsockname() method */
1209
Guido van Rossum73624e91994-10-10 17:59:00 +00001210static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001211PySocketSock_getsockname(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001212{
1213 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001214 int res;
1215 socklen_t addrlen;
1216
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001217 if (!PyArg_ParseTuple(args, ":getsockname"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001218 return NULL;
1219 if (!getsockaddrlen(s, &addrlen))
1220 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001221 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001222 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001223 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001224 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001225 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001226 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001227 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001228}
1229
Guido van Rossum82a5c661998-07-07 20:45:43 +00001230static char getsockname_doc[] =
1231"getsockname() -> address info\n\
1232\n\
1233Return the address of the local endpoint. For IP sockets, the address\n\
1234info is a pair (hostaddr, port).";
1235
Guido van Rossumc89705d1992-11-26 08:54:07 +00001236
Guido van Rossumb6775db1994-08-01 11:34:53 +00001237#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001238/* s.getpeername() method */
1239
Guido van Rossum73624e91994-10-10 17:59:00 +00001240static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001241PySocketSock_getpeername(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001242{
1243 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001244 int res;
1245 socklen_t addrlen;
1246
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001247 if (!PyArg_ParseTuple(args, ":getpeername"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001248 return NULL;
1249 if (!getsockaddrlen(s, &addrlen))
1250 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001251 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001252 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001253 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001254 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001255 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001256 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001257 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001258}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001259
1260static char getpeername_doc[] =
1261"getpeername() -> address info\n\
1262\n\
1263Return the address of the remote endpoint. For IP sockets, the address\n\
1264info is a pair (hostaddr, port).";
1265
Guido van Rossumb6775db1994-08-01 11:34:53 +00001266#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001267
1268
Guido van Rossum30a685f1991-06-27 15:51:29 +00001269/* s.listen(n) method */
1270
Guido van Rossum73624e91994-10-10 17:59:00 +00001271static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001272PySocketSock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001273{
1274 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001275 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001276 if (!PyArg_ParseTuple(args, "i:listen", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001277 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001278 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001279 if (backlog < 1)
1280 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001281 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001282 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001283 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001284 return PySocket_Err();
1285 Py_INCREF(Py_None);
1286 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001287}
1288
Guido van Rossum82a5c661998-07-07 20:45:43 +00001289static char listen_doc[] =
1290"listen(backlog)\n\
1291\n\
1292Enable a server to accept connections. The backlog argument must be at\n\
1293least 1; it specifies the number of unaccepted connection that the system\n\
1294will allow before refusing new connections.";
1295
1296
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001297#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001298/* s.makefile(mode) method.
1299 Create a new open file object referring to a dupped version of
1300 the socket's file descriptor. (The dup() call is necessary so
1301 that the open file and socket objects may be closed independent
1302 of each other.)
1303 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1304
Guido van Rossum73624e91994-10-10 17:59:00 +00001305static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001306PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001307{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001308 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001309 char *mode = "r";
1310 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001311#ifdef MS_WIN32
1312 intptr_t fd;
1313#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001314 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001315#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001316 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001317 PyObject *f;
1318
Guido van Rossum43713e52000-02-29 13:59:29 +00001319 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001320 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001321#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001322 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1323 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001324#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001325 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001326#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001327 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001328 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001329 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001330 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001331 }
1332 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1333 if (f != NULL)
1334 PyFile_SetBufSize(f, bufsize);
1335 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001336}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001337
1338static char makefile_doc[] =
1339"makefile([mode[, buffersize]]) -> file object\n\
1340\n\
1341Return a regular file object corresponding to the socket.\n\
1342The mode and buffersize arguments are as for the built-in open() function.";
1343
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001344#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001345
Guido van Rossum48a680c2001-03-02 06:34:14 +00001346
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001347/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001348
Guido van Rossum73624e91994-10-10 17:59:00 +00001349static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001350PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001351{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001352 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001353 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001354 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001355 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001356 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001357 if (buf == NULL)
1358 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001359 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001360 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001361 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001362 if (n < 0) {
1363 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001364 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001365 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001366 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001367 return NULL;
1368 return buf;
1369}
1370
Guido van Rossum82a5c661998-07-07 20:45:43 +00001371static char recv_doc[] =
1372"recv(buffersize[, flags]) -> data\n\
1373\n\
1374Receive up to buffersize bytes from the socket. For the optional flags\n\
1375argument, see the Unix manual. When no data is available, block until\n\
1376at least one byte is available or until the remote end is closed. When\n\
1377the remote end is closed and all data is read, return the empty string.";
1378
Guido van Rossum30a685f1991-06-27 15:51:29 +00001379
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001380/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001381
Guido van Rossum73624e91994-10-10 17:59:00 +00001382static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001383PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001384{
1385 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001386 PyObject *buf = NULL;
1387 PyObject *addr = NULL;
1388 PyObject *ret = NULL;
1389
Guido van Rossumff3ab422000-04-24 15:16:03 +00001390 int len, n, flags = 0;
1391 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001392 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001393 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001394 if (!getsockaddrlen(s, &addrlen))
1395 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001396 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001397 if (buf == NULL)
1398 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001399 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001400 memset(addrbuf, 0, addrlen);
1401 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001402#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001403#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001404 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001405#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001406 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001407#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001408#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001409 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001410#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001411 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001412 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001413 if (n < 0) {
1414 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001415 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001416 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001417 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001418 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001419
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001420 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001421 goto finally;
1422
Guido van Rossum73624e91994-10-10 17:59:00 +00001423 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001424 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001425 Py_XDECREF(addr);
1426 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001427 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001428}
1429
Guido van Rossum82a5c661998-07-07 20:45:43 +00001430static char recvfrom_doc[] =
1431"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1432\n\
1433Like recv(buffersize, flags) but also return the sender's address info.";
1434
Guido van Rossum30a685f1991-06-27 15:51:29 +00001435
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001436/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001437
Guido van Rossum73624e91994-10-10 17:59:00 +00001438static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001439PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001440{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001441 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001442 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001443 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001444 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001445 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001446 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001447 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001448 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001449 return PySocket_Err();
1450 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001451}
1452
Guido van Rossum82a5c661998-07-07 20:45:43 +00001453static char send_doc[] =
1454"send(data[, flags])\n\
1455\n\
1456Send a data string to the socket. For the optional flags\n\
1457argument, see the Unix manual.";
1458
Guido van Rossum30a685f1991-06-27 15:51:29 +00001459
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001460/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001461
Guido van Rossum73624e91994-10-10 17:59:00 +00001462static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001463PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001464{
Guido van Rossum73624e91994-10-10 17:59:00 +00001465 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001466 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001467 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001468 int addrlen, len, n, flags;
1469 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001470 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001471 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001472 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1473 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001474 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001475 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001476 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001477 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001478 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001479 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001480 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001481 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001482 return PySocket_Err();
1483 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001484}
1485
Guido van Rossum82a5c661998-07-07 20:45:43 +00001486static char sendto_doc[] =
1487"sendto(data[, flags], address)\n\
1488\n\
1489Like send(data, flags) but allows specifying the destination address.\n\
1490For IP sockets, the address is a pair (hostaddr, port).";
1491
Guido van Rossum30a685f1991-06-27 15:51:29 +00001492
1493/* s.shutdown(how) method */
1494
Guido van Rossum73624e91994-10-10 17:59:00 +00001495static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001496PySocketSock_shutdown(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001497{
1498 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001499 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001500 if (!PyArg_ParseTuple(args, "i:shutdown", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001501 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001502 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001503 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001504 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001505 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001506 return PySocket_Err();
1507 Py_INCREF(Py_None);
1508 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001509}
1510
Guido van Rossum82a5c661998-07-07 20:45:43 +00001511static char shutdown_doc[] =
1512"shutdown(flag)\n\
1513\n\
1514Shut down the reading side of the socket (flag == 0), the writing side\n\
1515of the socket (flag == 1), or both ends (flag == 2).";
1516
Guido van Rossum30a685f1991-06-27 15:51:29 +00001517
1518/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001519
Guido van Rossum73624e91994-10-10 17:59:00 +00001520static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001521 {"accept", (PyCFunction)PySocketSock_accept, METH_VARARGS,
1522 accept_doc},
1523 {"bind", (PyCFunction)PySocketSock_bind, METH_VARARGS,
1524 bind_doc},
1525 {"close", (PyCFunction)PySocketSock_close, METH_VARARGS,
1526 close_doc},
1527 {"connect", (PyCFunction)PySocketSock_connect, METH_VARARGS,
1528 connect_doc},
1529 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_VARARGS,
1530 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001531#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001532 {"dup", (PyCFunction)PySocketSock_dup, METH_VARARGS,
1533 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001534#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001535 {"fileno", (PyCFunction)PySocketSock_fileno, METH_VARARGS,
1536 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001537#ifdef HAVE_GETPEERNAME
Guido van Rossum48a680c2001-03-02 06:34:14 +00001538 {"getpeername", (PyCFunction)PySocketSock_getpeername, METH_VARARGS,
1539 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001540#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001541 {"getsockname", (PyCFunction)PySocketSock_getsockname, METH_VARARGS,
1542 getsockname_doc},
1543 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1544 getsockopt_doc},
1545 {"listen", (PyCFunction)PySocketSock_listen, METH_VARARGS,
1546 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001547#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001548 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1549 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001550#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001551 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1552 recv_doc},
1553 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1554 recvfrom_doc},
1555 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1556 send_doc},
1557 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1558 sendto_doc},
1559 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_VARARGS,
1560 setblocking_doc},
1561 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1562 setsockopt_doc},
1563 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_VARARGS,
1564 shutdown_doc},
1565#ifdef RISCOS
1566 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1567 sleeptaskw_doc},
1568#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001569 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001570};
1571
Guido van Rossum30a685f1991-06-27 15:51:29 +00001572
Guido van Rossum73624e91994-10-10 17:59:00 +00001573/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001574 First close the file description. */
1575
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001576static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001577PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001578{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001579 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001580 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001581 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001582}
1583
Guido van Rossum30a685f1991-06-27 15:51:29 +00001584
1585/* Return a socket object's named attribute. */
1586
Guido van Rossum73624e91994-10-10 17:59:00 +00001587static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001588PySocketSock_getattr(PySocketSockObject *s, char *name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001589{
Guido van Rossum73624e91994-10-10 17:59:00 +00001590 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001591}
1592
Guido van Rossum30a685f1991-06-27 15:51:29 +00001593
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001594static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001595PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001596{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001597 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001598#if SIZEOF_SOCKET_T > SIZEOF_LONG
1599 if (s->sock_fd > LONG_MAX) {
1600 /* this can occur on Win64, and actually there is a special
1601 ugly printf formatter for decimal pointer length integer
1602 printing, only bother if necessary*/
1603 PyErr_SetString(PyExc_OverflowError,
1604 "no printf formatter to display the socket descriptor in decimal");
1605 return NULL;
1606 }
1607#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001608 sprintf(buf,
1609 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
Fred Drakea04eaad2000-06-30 02:46:07 +00001610 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001611 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001612}
1613
1614
Guido van Rossumb6775db1994-08-01 11:34:53 +00001615/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001616
Guido van Rossum73624e91994-10-10 17:59:00 +00001617static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001618 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001619 0,
1620 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001621 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001622 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001623 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001624 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001625 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001626 0, /*tp_setattr*/
1627 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001628 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001629 0, /*tp_as_number*/
1630 0, /*tp_as_sequence*/
1631 0, /*tp_as_mapping*/
1632};
1633
Guido van Rossum30a685f1991-06-27 15:51:29 +00001634
Guido van Rossum81194471991-07-27 21:42:02 +00001635/* Python interface to gethostname(). */
1636
1637/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001638static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001639PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001640{
1641 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001642 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001643 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001644 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001645 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001646 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001647 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001648 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001649 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001650 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001651 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001652}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001653
Guido van Rossum82a5c661998-07-07 20:45:43 +00001654static char gethostname_doc[] =
1655"gethostname() -> string\n\
1656\n\
1657Return the current host name.";
1658
Guido van Rossumff4949e1992-08-05 19:58:53 +00001659
Guido van Rossum30a685f1991-06-27 15:51:29 +00001660/* Python interface to gethostbyname(name). */
1661
1662/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001663static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001664PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001665{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001666 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001667 struct sockaddr_in addrbuf;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001668 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001669 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001670 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001671 return NULL;
1672 return makeipaddr(&addrbuf);
1673}
1674
Guido van Rossum82a5c661998-07-07 20:45:43 +00001675static char gethostbyname_doc[] =
1676"gethostbyname(host) -> address\n\
1677\n\
1678Return the IP address (a string of the form '255.255.255.255') for a host.";
1679
1680
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001681/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1682
1683static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001684gethost_common(struct hostent *h, struct sockaddr_in *addr)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001685{
1686 char **pch;
1687 PyObject *rtn_tuple = (PyObject *)NULL;
1688 PyObject *name_list = (PyObject *)NULL;
1689 PyObject *addr_list = (PyObject *)NULL;
1690 PyObject *tmp;
1691 if (h == NULL) {
1692#ifdef HAVE_HSTRERROR
Guido van Rossum48a680c2001-03-02 06:34:14 +00001693 /* Let's get real error message to return */
1694 extern int h_errno;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001695 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1696#else
1697 PyErr_SetString(PySocket_Error, "host not found");
1698#endif
1699 return NULL;
1700 }
1701 if ((name_list = PyList_New(0)) == NULL)
1702 goto err;
1703 if ((addr_list = PyList_New(0)) == NULL)
1704 goto err;
1705 for (pch = h->h_aliases; *pch != NULL; pch++) {
1706 int status;
1707 tmp = PyString_FromString(*pch);
1708 if (tmp == NULL)
1709 goto err;
1710 status = PyList_Append(name_list, tmp);
1711 Py_DECREF(tmp);
1712 if (status)
1713 goto err;
1714 }
1715 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1716 int status;
1717 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1718 tmp = makeipaddr(addr);
1719 if (tmp == NULL)
1720 goto err;
1721 status = PyList_Append(addr_list, tmp);
1722 Py_DECREF(tmp);
1723 if (status)
1724 goto err;
1725 }
1726 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1727 err:
1728 Py_XDECREF(name_list);
1729 Py_XDECREF(addr_list);
1730 return rtn_tuple;
1731}
1732
1733
1734/* Python interface to gethostbyname_ex(name). */
1735
1736/*ARGSUSED*/
1737static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001738PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001739{
1740 char *name;
1741 struct hostent *h;
1742 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001743 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001744#ifdef HAVE_GETHOSTBYNAME_R
1745 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001746#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1747 struct hostent_data data;
1748#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001749 char buf[16384];
1750 int buf_len = (sizeof buf) - 1;
1751 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001752#endif
1753#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001754 int result;
1755#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001756#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001757 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001758 return NULL;
1759 if (setipaddr(name, &addr) < 0)
1760 return NULL;
1761 Py_BEGIN_ALLOW_THREADS
1762#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001763#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001764 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001765#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001766 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001767#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001768 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001769 result = gethostbyname_r(name, &hp_allocated, &data);
1770 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001771#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001772#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001773#ifdef USE_GETHOSTBYNAME_LOCK
1774 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001775#endif
1776 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001777#endif /* HAVE_GETHOSTBYNAME_R */
1778 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001779 ret = gethost_common(h, &addr);
1780#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001781 PyThread_release_lock(gethostbyname_lock);
1782#endif
1783 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001784}
1785
1786static char ghbn_ex_doc[] =
1787"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1788\n\
1789Return the true host name, a list of aliases, and a list of IP addresses,\n\
1790for a host. The host argument is a string giving a host name or IP number.";
1791
1792
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001793/* Python interface to gethostbyaddr(IP). */
1794
1795/*ARGSUSED*/
1796static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001797PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001798{
Guido van Rossum48a680c2001-03-02 06:34:14 +00001799 struct sockaddr_in addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001800 char *ip_num;
1801 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001802 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001803#ifdef HAVE_GETHOSTBYNAME_R
1804 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001805#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1806 struct hostent_data data;
1807#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001808 char buf[16384];
1809 int buf_len = (sizeof buf) - 1;
1810 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001811#endif
1812#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001813 int result;
1814#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001815#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001816
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001817 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001818 return NULL;
1819 if (setipaddr(ip_num, &addr) < 0)
1820 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001821 Py_BEGIN_ALLOW_THREADS
1822#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001823#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001824 result = gethostbyaddr_r((char *)&addr.sin_addr,
1825 sizeof(addr.sin_addr),
1826 AF_INET, &hp_allocated, buf, buf_len,
1827 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001828#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001829 h = gethostbyaddr_r((char *)&addr.sin_addr,
1830 sizeof(addr.sin_addr),
Guido van Rossum48a680c2001-03-02 06:34:14 +00001831 AF_INET,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001832 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001833#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001834 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001835 result = gethostbyaddr_r((char *)&addr.sin_addr,
1836 sizeof(addr.sin_addr),
1837 AF_INET, &hp_allocated, &data);
1838 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001839#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001840#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001841#ifdef USE_GETHOSTBYNAME_LOCK
1842 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001843#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001844 h = gethostbyaddr((char *)&addr.sin_addr,
1845 sizeof(addr.sin_addr),
1846 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001847#endif /* HAVE_GETHOSTBYNAME_R */
1848 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001849 ret = gethost_common(h, &addr);
1850#ifdef USE_GETHOSTBYNAME_LOCK
1851 PyThread_release_lock(gethostbyname_lock);
1852#endif
1853 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001854}
1855
Guido van Rossum82a5c661998-07-07 20:45:43 +00001856static char gethostbyaddr_doc[] =
1857"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1858\n\
1859Return the true host name, a list of aliases, and a list of IP addresses,\n\
1860for a host. The host argument is a string giving a host name or IP number.";
1861
Guido van Rossum30a685f1991-06-27 15:51:29 +00001862
1863/* Python interface to getservbyname(name).
1864 This only returns the port number, since the other info is already
1865 known or not useful (like the list of aliases). */
1866
1867/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001868static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001869PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001870{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001871 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001872 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001873 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001874 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001875 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001876 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001877 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001878 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001879 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001880 return NULL;
1881 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001882 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001883}
1884
Guido van Rossum82a5c661998-07-07 20:45:43 +00001885static char getservbyname_doc[] =
1886"getservbyname(servicename, protocolname) -> integer\n\
1887\n\
1888Return a port number from a service name and protocol name.\n\
1889The protocol name should be 'tcp' or 'udp'.";
1890
Guido van Rossum30a685f1991-06-27 15:51:29 +00001891
Guido van Rossum3901d851996-12-19 16:35:04 +00001892/* Python interface to getprotobyname(name).
1893 This only returns the protocol number, since the other info is
1894 already known or not useful (like the list of aliases). */
1895
1896/*ARGSUSED*/
1897static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001898PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00001899{
1900 char *name;
1901 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001902#ifdef __BEOS__
1903/* Not available in BeOS yet. - [cjh] */
1904 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1905 return NULL;
1906#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001907 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00001908 return NULL;
1909 Py_BEGIN_ALLOW_THREADS
1910 sp = getprotobyname(name);
1911 Py_END_ALLOW_THREADS
1912 if (sp == NULL) {
1913 PyErr_SetString(PySocket_Error, "protocol not found");
1914 return NULL;
1915 }
1916 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001917#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001918}
1919
Guido van Rossum82a5c661998-07-07 20:45:43 +00001920static char getprotobyname_doc[] =
1921"getprotobyname(name) -> integer\n\
1922\n\
1923Return the protocol number for the named protocol. (Rarely used.)";
1924
Guido van Rossum3901d851996-12-19 16:35:04 +00001925
Guido van Rossum30a685f1991-06-27 15:51:29 +00001926/* Python interface to socket(family, type, proto).
1927 The third (protocol) argument is optional.
1928 Return a new socket object. */
1929
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001930/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001931static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001932PySocket_socket(PyObject *self, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001933{
Guido van Rossum73624e91994-10-10 17:59:00 +00001934 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001935 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001936 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001937 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001938 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001939 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001940 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001941 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001942#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001943 if (fd == INVALID_SOCKET)
1944#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001945 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001946#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001947 return PySocket_Err();
1948 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001949 /* If the object can't be created, don't forget to close the
1950 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001951 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001952 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001953 /* From now on, ignore SIGPIPE and let the error checking
1954 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001955#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001956 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00001957#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001958 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001959}
1960
Guido van Rossum82a5c661998-07-07 20:45:43 +00001961static char socket_doc[] =
1962"socket(family, type[, proto]) -> socket object\n\
1963\n\
1964Open a socket of the given type. The family argument specifies the\n\
1965address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1966The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1967or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1968specifying the default protocol.";
1969
1970
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001971#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001972/* Create a socket object from a numeric file description.
1973 Useful e.g. if stdin is a socket.
1974 Additional arguments as for socket(). */
1975
1976/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001977static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001978PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001979{
Guido van Rossum73624e91994-10-10 17:59:00 +00001980 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001981 SOCKET_T fd;
1982 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001983 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
1984 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001985 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001986 /* Dup the fd so it and the socket can be closed independently */
1987 fd = dup(fd);
1988 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001989 return PySocket_Err();
1990 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001991 /* From now on, ignore SIGPIPE and let the error checking
1992 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001993#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001994 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00001995#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001996 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001997}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001998
1999static char fromfd_doc[] =
2000"fromfd(fd, family, type[, proto]) -> socket object\n\
2001\n\
2002Create a socket object from the given file descriptor.\n\
2003The remaining arguments are the same as for socket().";
2004
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002005#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002006
Guido van Rossum82a5c661998-07-07 20:45:43 +00002007
Guido van Rossum006bf911996-06-12 04:04:55 +00002008static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002009PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002010{
2011 int x1, x2;
2012
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002013 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002014 return NULL;
2015 }
2016 x2 = (int)ntohs((short)x1);
2017 return PyInt_FromLong(x2);
2018}
2019
Guido van Rossum82a5c661998-07-07 20:45:43 +00002020static char ntohs_doc[] =
2021"ntohs(integer) -> integer\n\
2022\n\
2023Convert a 16-bit integer from network to host byte order.";
2024
2025
Guido van Rossum006bf911996-06-12 04:04:55 +00002026static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002027PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002028{
2029 int x1, x2;
2030
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002031 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002032 return NULL;
2033 }
2034 x2 = ntohl(x1);
2035 return PyInt_FromLong(x2);
2036}
2037
Guido van Rossum82a5c661998-07-07 20:45:43 +00002038static char ntohl_doc[] =
2039"ntohl(integer) -> integer\n\
2040\n\
2041Convert a 32-bit integer from network to host byte order.";
2042
2043
Guido van Rossum006bf911996-06-12 04:04:55 +00002044static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002045PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002046{
2047 int x1, x2;
2048
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002049 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002050 return NULL;
2051 }
2052 x2 = (int)htons((short)x1);
2053 return PyInt_FromLong(x2);
2054}
2055
Guido van Rossum82a5c661998-07-07 20:45:43 +00002056static char htons_doc[] =
2057"htons(integer) -> integer\n\
2058\n\
2059Convert a 16-bit integer from host to network byte order.";
2060
2061
Guido van Rossum006bf911996-06-12 04:04:55 +00002062static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002063PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002064{
2065 int x1, x2;
2066
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002067 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002068 return NULL;
2069 }
2070 x2 = htonl(x1);
2071 return PyInt_FromLong(x2);
2072}
2073
Guido van Rossum82a5c661998-07-07 20:45:43 +00002074static char htonl_doc[] =
2075"htonl(integer) -> integer\n\
2076\n\
2077Convert a 32-bit integer from host to network byte order.";
2078
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002079/*
2080 * socket.inet_aton() and socket.inet_ntoa() functions
2081 *
2082 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2083 *
2084 */
2085
Guido van Rossum48a680c2001-03-02 06:34:14 +00002086static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002087"inet_aton(string) -> packed 32-bit IP representation\n\
2088\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002089Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002090binary format used in low-level network functions.";
2091
2092static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002093PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002094{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002095#ifndef INADDR_NONE
2096#define INADDR_NONE (-1)
2097#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002098
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002099 /* Have to use inet_addr() instead */
2100 char *ip_addr;
2101 long packed_addr;
2102
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002103 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002104 return NULL;
2105 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00002106#ifdef USE_GUSI1
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002107 packed_addr = (long)inet_addr(ip_addr).s_addr;
2108#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002109 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002110#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002111
2112 if (packed_addr == INADDR_NONE) { /* invalid address */
2113 PyErr_SetString(PySocket_Error,
2114 "illegal IP address string passed to inet_aton");
2115 return NULL;
2116 }
2117
2118 return PyString_FromStringAndSize((char *) &packed_addr,
2119 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002120}
2121
Guido van Rossum48a680c2001-03-02 06:34:14 +00002122static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002123"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002124\n\
2125Convert an IP address from 32-bit packed binary format to string format";
2126
2127static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002128PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002129{
2130 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002131 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002132 struct in_addr packed_addr;
2133
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002134 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002135 return NULL;
2136 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002137
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002138 if (addr_len != sizeof(packed_addr)) {
2139 PyErr_SetString(PySocket_Error,
2140 "packed IP wrong length for inet_ntoa");
2141 return NULL;
2142 }
2143
2144 memcpy(&packed_addr, packed_str, addr_len);
2145
2146 return PyString_FromString(inet_ntoa(packed_addr));
2147}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002148
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002149
2150#ifdef USE_SSL
2151
2152/* This is a C function to be called for new object initialization */
2153static SSLObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002154newSSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002155{
2156 SSLObject *self;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002157
Guido van Rossumb18618d2000-05-03 23:44:39 +00002158 self = PyObject_New(SSLObject, &SSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002159 if (self == NULL){
2160 PyErr_SetObject(SSLErrorObject,
2161 PyString_FromString("newSSLObject error"));
2162 return NULL;
2163 }
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002164 memset(self->server, '\0', sizeof(char) * 256);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002165 memset(self->issuer, '\0', sizeof(char) * 256);
2166
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002167 self->x_attr = PyDict_New();
2168 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
2169 if (self->ctx == NULL) {
2170 PyErr_SetObject(SSLErrorObject,
2171 PyString_FromString("SSL_CTX_new error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002172 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002173 return NULL;
2174 }
2175
2176 if ( (key_file && !cert_file) || (!key_file && cert_file) )
2177 {
2178 PyErr_SetObject(SSLErrorObject,
2179 PyString_FromString(
2180 "Both the key & certificate files must be specified"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002181 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002182 return NULL;
2183 }
2184
2185 if (key_file && cert_file)
2186 {
2187 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
2188 SSL_FILETYPE_PEM) < 1)
2189 {
2190 PyErr_SetObject(SSLErrorObject,
2191 PyString_FromString(
2192 "SSL_CTX_use_PrivateKey_file 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
2197 if (SSL_CTX_use_certificate_chain_file(self->ctx,
2198 cert_file) < 1)
2199 {
2200 PyErr_SetObject(SSLErrorObject,
2201 PyString_FromString(
2202 "SSL_CTX_use_certificate_chain_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002203 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002204 return NULL;
2205 }
2206 }
2207
2208 SSL_CTX_set_verify(self->ctx,
2209 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2210 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2211 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2212 SSL_set_connect_state(self->ssl);
2213
2214 if ((SSL_connect(self->ssl)) == -1) {
2215 /* Actually negotiate SSL connection */
2216 PyErr_SetObject(SSLErrorObject,
2217 PyString_FromString("SSL_connect error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002218 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002219 return NULL;
2220 }
2221 self->ssl->debug = 1;
2222
2223 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2224 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
2225 self->server, 256);
2226 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2227 self->issuer, 256);
2228 }
2229 self->x_attr = NULL;
2230 self->Socket = Sock;
2231 Py_INCREF(self->Socket);
2232 return self;
2233}
2234
2235/* This is the Python function called for new object initialization */
2236static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002237PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002238{
2239 SSLObject *rv;
2240 PySocketSockObject *Sock;
2241 char *key_file;
2242 char *cert_file;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002243
Guido van Rossum43713e52000-02-29 13:59:29 +00002244 if (!PyArg_ParseTuple(args, "O!zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002245 &PySocketSock_Type, (PyObject*)&Sock,
2246 &key_file, &cert_file) )
2247 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002248
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002249 rv = newSSLObject(Sock, key_file, cert_file);
2250 if ( rv == NULL )
2251 return NULL;
2252 return (PyObject *)rv;
2253}
2254
2255static char ssl_doc[] =
2256"ssl(socket, keyfile, certfile) -> sslobject";
2257
2258static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002259SSL_server(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002260{
2261 return PyString_FromString(self->server);
2262}
2263
2264static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002265SSL_issuer(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002266{
2267 return PyString_FromString(self->issuer);
2268}
2269
2270
2271/* SSL object methods */
2272
2273static PyMethodDef SSLMethods[] = {
2274 { "write", (PyCFunction)SSL_SSLwrite, 1 },
2275 { "read", (PyCFunction)SSL_SSLread, 1 },
2276 { "server", (PyCFunction)SSL_server, 1 },
2277 { "issuer", (PyCFunction)SSL_issuer, 1 },
2278 { NULL, NULL}
2279};
2280
2281static void SSL_dealloc(SSLObject *self)
2282{
2283 if (self->server_cert) /* Possible not to have one? */
2284 X509_free (self->server_cert);
2285 SSL_CTX_free(self->ctx);
2286 SSL_free(self->ssl);
2287 Py_XDECREF(self->x_attr);
2288 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002289 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002290}
2291
2292static PyObject *SSL_getattr(SSLObject *self, char *name)
2293{
2294 return Py_FindMethod(SSLMethods, (PyObject *)self, name);
2295}
2296
2297staticforward PyTypeObject SSL_Type = {
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002298 PyObject_HEAD_INIT(NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002299 0, /*ob_size*/
2300 "SSL", /*tp_name*/
2301 sizeof(SSLObject), /*tp_basicsize*/
2302 0, /*tp_itemsize*/
2303 /* methods */
2304 (destructor)SSL_dealloc, /*tp_dealloc*/
2305 0, /*tp_print*/
2306 (getattrfunc)SSL_getattr, /*tp_getattr*/
2307 0, /*tp_setattr*/
2308 0, /*tp_compare*/
2309 0, /*tp_repr*/
2310 0, /*tp_as_number*/
2311 0, /*tp_as_sequence*/
2312 0, /*tp_as_mapping*/
2313 0, /*tp_hash*/
2314};
2315
2316
2317
2318static PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args)
2319{
2320 char *data;
Andrew M. Kuchlingb38175e2001-02-07 20:41:17 +00002321 size_t len;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002322
Andrew M. Kuchlingb38175e2001-02-07 20:41:17 +00002323 if (!PyArg_ParseTuple(args, "s#:write", &data, &len))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002324 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002325
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002326 len = SSL_write(self->ssl, data, len);
2327 return PyInt_FromLong((long)len);
2328}
2329
2330static PyObject *SSL_SSLread(SSLObject *self, PyObject *args)
2331{
2332 PyObject *buf;
2333 int count = 0;
2334 int len = 1024;
2335 int res;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002336
Guido van Rossum43713e52000-02-29 13:59:29 +00002337 PyArg_ParseTuple(args, "|i:read", &len);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002338
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002339 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2340 return NULL; /* Error object should already be set */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002341
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002342 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2343 res = SSL_get_error(self->ssl, count);
2344
2345 switch (res) {
Jeremy Hylton42dd01a2001-02-01 23:35:20 +00002346 case SSL_ERROR_NONE:
2347 assert(count > 0);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002348 break;
Jeremy Hylton42dd01a2001-02-01 23:35:20 +00002349 case SSL_ERROR_ZERO_RETURN: /* normal EOF */
2350 assert(count == 0);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002351 break;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002352 default:
2353 return PyErr_SetFromErrno(SSLErrorObject);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002354 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002355
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002356 fflush(stderr);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002357
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002358 if (count < 0) {
2359 Py_DECREF(buf);
2360 return PyErr_SetFromErrno(SSLErrorObject);
2361 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002362
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002363 if (count != len && _PyString_Resize(&buf, count) < 0)
2364 return NULL;
2365 return buf;
2366}
2367
2368#endif /* USE_SSL */
2369
2370
Guido van Rossum30a685f1991-06-27 15:51:29 +00002371/* List of functions exported by this module. */
2372
Guido van Rossum73624e91994-10-10 17:59:00 +00002373static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002374 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002375 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002376 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002377 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002378 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002379 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002380 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002381 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002382 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002383 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002384 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002385 METH_VARARGS,getprotobyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002386 {"socket", PySocket_socket,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002387 METH_VARARGS, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002388#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002389 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002390 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002391#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002392 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002393 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002394 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002395 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002396 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002397 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002398 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002399 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002400 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002401 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002402 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002403 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002404#ifdef USE_SSL
Guido van Rossum48a680c2001-03-02 06:34:14 +00002405 {"ssl", PySocket_ssl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002406 METH_VARARGS, ssl_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002407#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002408 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002409};
2410
Guido van Rossum30a685f1991-06-27 15:51:29 +00002411
2412/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002413 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002414 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002415 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002416static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002417insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002418{
Guido van Rossum73624e91994-10-10 17:59:00 +00002419 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002420 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002421 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002422
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002423 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002424}
2425
Guido van Rossum30a685f1991-06-27 15:51:29 +00002426
Guido van Rossum8d665e61996-06-26 18:22:49 +00002427#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002428
2429/* Additional initialization and cleanup for NT/Windows */
2430
2431static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002432NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002433{
2434 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002435}
2436
2437static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002438NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002439{
2440 WSADATA WSAData;
2441 int ret;
2442 char buf[100];
2443 ret = WSAStartup(0x0101, &WSAData);
2444 switch (ret) {
2445 case 0: /* no error */
2446 atexit(NTcleanup);
2447 return 1;
2448 case WSASYSNOTREADY:
2449 PyErr_SetString(PyExc_ImportError,
2450 "WSAStartup failed: network not ready");
2451 break;
2452 case WSAVERNOTSUPPORTED:
2453 case WSAEINVAL:
2454 PyErr_SetString(PyExc_ImportError,
2455 "WSAStartup failed: requested version not supported");
2456 break;
2457 default:
2458 sprintf(buf, "WSAStartup failed: error code %d", ret);
2459 PyErr_SetString(PyExc_ImportError, buf);
2460 break;
2461 }
2462 return 0;
2463}
2464
Guido van Rossum8d665e61996-06-26 18:22:49 +00002465#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002466
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002467#if defined(PYOS_OS2)
2468
2469/* Additional initialization and cleanup for OS/2 */
2470
2471static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002472OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002473{
2474 /* No cleanup is necessary for OS/2 Sockets */
2475}
2476
2477static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002478OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002479{
2480 char reason[64];
2481 int rc = sock_init();
2482
2483 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002484 atexit(OS2cleanup);
2485 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002486 }
2487
2488 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2489 PyErr_SetString(PyExc_ImportError, reason);
2490
Guido van Rossum32c575d1997-12-02 20:37:32 +00002491 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002492}
2493
2494#endif /* PYOS_OS2 */
2495
Guido van Rossum30a685f1991-06-27 15:51:29 +00002496/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002497 * This is called when the first 'import socket' is done,
2498 * via a table in config.c, if config.c is compiled with USE_SOCKET
2499 * defined.
2500 *
2501 * For MS_WINDOWS (which means any Windows variant), this module
2502 * is actually called "_socket", and there's a wrapper "socket.py"
2503 * which implements some missing functionality (such as makefile(),
2504 * dup() and fromfd()). The import of "_socket" may fail with an
2505 * ImportError exception if initialization of WINSOCK fails. When
2506 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2507 * scheduled to be made at exit time.
2508 *
2509 * For OS/2, this module is also called "_socket" and uses a wrapper
2510 * "socket.py" which implements that functionality that is missing
2511 * when PC operating systems don't put socket descriptors in the
2512 * operating system's filesystem layer.
2513 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002514
Guido van Rossum82a5c661998-07-07 20:45:43 +00002515static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00002516"Implementation module for socket operations. See the socket module\n\
2517for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00002518
2519static char sockettype_doc[] =
2520"A socket represents one endpoint of a network connection.\n\
2521\n\
2522Methods:\n\
2523\n\
2524accept() -- accept a connection, returning new socket and client address\n\
2525bind() -- bind the socket to a local address\n\
2526close() -- close the socket\n\
2527connect() -- connect the socket to a remote address\n\
2528connect_ex() -- connect, return an error code instead of an exception \n\
2529dup() -- return a new socket object identical to the current one (*)\n\
2530fileno() -- return underlying file descriptor\n\
2531getpeername() -- return remote address (*)\n\
2532getsockname() -- return local address\n\
2533getsockopt() -- get socket options\n\
2534listen() -- start listening for incoming connections\n\
2535makefile() -- return a file object corresponding tot the socket (*)\n\
2536recv() -- receive data\n\
2537recvfrom() -- receive data and sender's address\n\
2538send() -- send data\n\
2539sendto() -- send data to a given address\n\
2540setblocking() -- set or clear the blocking I/O flag\n\
2541setsockopt() -- set socket options\n\
2542shutdown() -- shut down traffic in one or both directions\n\
2543\n\
2544(*) not available on all platforms!)";
2545
Guido van Rossum3886bb61998-12-04 18:50:17 +00002546DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002547init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002548{
Guido van Rossum73624e91994-10-10 17:59:00 +00002549 PyObject *m, *d;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002550#ifdef RISCOS
2551 _kernel_swi_regs r;
2552 r.r[0]=0;
2553 _kernel_swi(0x43380, &r, &r);
2554 taskwindow = r.r[0];
2555#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00002556#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002557 if (!NTinit())
2558 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002559#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002560#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002561 if (!OS2init())
2562 return;
Fred Drakea136d492000-08-16 14:18:30 +00002563#endif /* __TOS_OS2__ */
2564#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002565#endif /* RISCOS */
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002566#ifdef USE_SSL
2567 SSL_Type.ob_type = &PyType_Type;
2568#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00002569 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00002570 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002571 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2572 if (PySocket_Error == NULL)
2573 return;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002574#ifdef USE_SSL
2575 SSL_load_error_strings();
2576 SSLeay_add_ssl_algorithms();
2577 SSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2578 if (SSLErrorObject == NULL)
2579 return;
2580 PyDict_SetItemString(d, "sslerror", SSLErrorObject);
2581 Py_INCREF(&SSL_Type);
2582 if (PyDict_SetItemString(d, "SSLType",
2583 (PyObject *)&SSL_Type) != 0)
2584 return;
2585#endif /* USE_SSL */
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002586 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002587 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002588 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002589 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002590 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002591 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002592 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002593
2594 /* Address families (we only support AF_INET and AF_UNIX) */
2595#ifdef AF_UNSPEC
2596 insint(d, "AF_UNSPEC", AF_UNSPEC);
2597#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002598 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002599#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002600 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002601#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002602#ifdef AF_AX25
2603 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2604#endif
2605#ifdef AF_IPX
2606 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2607#endif
2608#ifdef AF_APPLETALK
2609 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2610#endif
2611#ifdef AF_NETROM
2612 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2613#endif
2614#ifdef AF_BRIDGE
2615 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2616#endif
2617#ifdef AF_AAL5
2618 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2619#endif
2620#ifdef AF_X25
2621 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2622#endif
2623#ifdef AF_INET6
2624 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2625#endif
2626#ifdef AF_ROSE
2627 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2628#endif
Jeremy Hylton22308652001-02-02 03:23:09 +00002629#if defined(linux) && defined(AF_PACKET)
2630 insint(d, "AF_PACKET", AF_PACKET);
2631 insint(d, "PF_PACKET", PF_PACKET);
2632 insint(d, "PACKET_HOST", PACKET_HOST);
2633 insint(d, "PACKET_BROADCAST", PACKET_BROADCAST);
2634 insint(d, "PACKET_MULTICAST", PACKET_MULTICAST);
2635 insint(d, "PACKET_OTHERHOST", PACKET_OTHERHOST);
2636 insint(d, "PACKET_OUTGOING", PACKET_OUTGOING);
2637 insint(d, "PACKET_LOOPBACK", PACKET_LOOPBACK);
2638 insint(d, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002639#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002640
2641 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002642 insint(d, "SOCK_STREAM", SOCK_STREAM);
2643 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002644#ifndef __BEOS__
2645/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002646 insint(d, "SOCK_RAW", SOCK_RAW);
2647 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2648 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002649#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002650
2651#ifdef SO_DEBUG
2652 insint(d, "SO_DEBUG", SO_DEBUG);
2653#endif
2654#ifdef SO_ACCEPTCONN
2655 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2656#endif
2657#ifdef SO_REUSEADDR
2658 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2659#endif
2660#ifdef SO_KEEPALIVE
2661 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2662#endif
2663#ifdef SO_DONTROUTE
2664 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2665#endif
2666#ifdef SO_BROADCAST
2667 insint(d, "SO_BROADCAST", SO_BROADCAST);
2668#endif
2669#ifdef SO_USELOOPBACK
2670 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2671#endif
2672#ifdef SO_LINGER
2673 insint(d, "SO_LINGER", SO_LINGER);
2674#endif
2675#ifdef SO_OOBINLINE
2676 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2677#endif
2678#ifdef SO_REUSEPORT
2679 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2680#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002681#ifdef SO_SNDBUF
2682 insint(d, "SO_SNDBUF", SO_SNDBUF);
2683#endif
2684#ifdef SO_RCVBUF
2685 insint(d, "SO_RCVBUF", SO_RCVBUF);
2686#endif
2687#ifdef SO_SNDLOWAT
2688 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2689#endif
2690#ifdef SO_RCVLOWAT
2691 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2692#endif
2693#ifdef SO_SNDTIMEO
2694 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2695#endif
2696#ifdef SO_RCVTIMEO
2697 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2698#endif
2699#ifdef SO_ERROR
2700 insint(d, "SO_ERROR", SO_ERROR);
2701#endif
2702#ifdef SO_TYPE
2703 insint(d, "SO_TYPE", SO_TYPE);
2704#endif
2705
2706 /* Maximum number of connections for "listen" */
2707#ifdef SOMAXCONN
2708 insint(d, "SOMAXCONN", SOMAXCONN);
2709#else
2710 insint(d, "SOMAXCONN", 5); /* Common value */
2711#endif
2712
2713 /* Flags for send, recv */
2714#ifdef MSG_OOB
2715 insint(d, "MSG_OOB", MSG_OOB);
2716#endif
2717#ifdef MSG_PEEK
2718 insint(d, "MSG_PEEK", MSG_PEEK);
2719#endif
2720#ifdef MSG_DONTROUTE
2721 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2722#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002723#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00002724 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002725#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002726#ifdef MSG_EOR
2727 insint(d, "MSG_EOR", MSG_EOR);
2728#endif
2729#ifdef MSG_TRUNC
2730 insint(d, "MSG_TRUNC", MSG_TRUNC);
2731#endif
2732#ifdef MSG_CTRUNC
2733 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2734#endif
2735#ifdef MSG_WAITALL
2736 insint(d, "MSG_WAITALL", MSG_WAITALL);
2737#endif
2738#ifdef MSG_BTAG
2739 insint(d, "MSG_BTAG", MSG_BTAG);
2740#endif
2741#ifdef MSG_ETAG
2742 insint(d, "MSG_ETAG", MSG_ETAG);
2743#endif
2744
2745 /* Protocol level and numbers, usable for [gs]etsockopt */
2746#ifdef SOL_SOCKET
2747 insint(d, "SOL_SOCKET", SOL_SOCKET);
2748#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002749#ifdef SOL_IP
2750 insint(d, "SOL_IP", SOL_IP);
2751#else
2752 insint(d, "SOL_IP", 0);
2753#endif
2754#ifdef SOL_IPX
2755 insint(d, "SOL_IPX", SOL_IPX);
2756#endif
2757#ifdef SOL_AX25
2758 insint(d, "SOL_AX25", SOL_AX25);
2759#endif
2760#ifdef SOL_ATALK
2761 insint(d, "SOL_ATALK", SOL_ATALK);
2762#endif
2763#ifdef SOL_NETROM
2764 insint(d, "SOL_NETROM", SOL_NETROM);
2765#endif
2766#ifdef SOL_ROSE
2767 insint(d, "SOL_ROSE", SOL_ROSE);
2768#endif
2769#ifdef SOL_TCP
2770 insint(d, "SOL_TCP", SOL_TCP);
2771#else
2772 insint(d, "SOL_TCP", 6);
2773#endif
2774#ifdef SOL_UDP
2775 insint(d, "SOL_UDP", SOL_UDP);
2776#else
2777 insint(d, "SOL_UDP", 17);
2778#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002779#ifdef IPPROTO_IP
2780 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002781#else
2782 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002783#endif
2784#ifdef IPPROTO_ICMP
2785 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002786#else
2787 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002788#endif
2789#ifdef IPPROTO_IGMP
2790 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2791#endif
2792#ifdef IPPROTO_GGP
2793 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2794#endif
2795#ifdef IPPROTO_TCP
2796 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002797#else
2798 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002799#endif
2800#ifdef IPPROTO_EGP
2801 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2802#endif
2803#ifdef IPPROTO_PUP
2804 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2805#endif
2806#ifdef IPPROTO_UDP
2807 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002808#else
2809 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002810#endif
2811#ifdef IPPROTO_IDP
2812 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2813#endif
2814#ifdef IPPROTO_HELLO
2815 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2816#endif
2817#ifdef IPPROTO_ND
2818 insint(d, "IPPROTO_ND", IPPROTO_ND);
2819#endif
2820#ifdef IPPROTO_TP
2821 insint(d, "IPPROTO_TP", IPPROTO_TP);
2822#endif
2823#ifdef IPPROTO_XTP
2824 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2825#endif
2826#ifdef IPPROTO_EON
2827 insint(d, "IPPROTO_EON", IPPROTO_EON);
2828#endif
2829#ifdef IPPROTO_BIP
2830 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2831#endif
2832/**/
2833#ifdef IPPROTO_RAW
2834 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002835#else
2836 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002837#endif
2838#ifdef IPPROTO_MAX
2839 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2840#endif
2841
2842 /* Some port configuration */
2843#ifdef IPPORT_RESERVED
2844 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2845#else
2846 insint(d, "IPPORT_RESERVED", 1024);
2847#endif
2848#ifdef IPPORT_USERRESERVED
2849 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2850#else
2851 insint(d, "IPPORT_USERRESERVED", 5000);
2852#endif
2853
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002854 /* Some reserved IP v.4 addresses */
2855#ifdef INADDR_ANY
2856 insint(d, "INADDR_ANY", INADDR_ANY);
2857#else
2858 insint(d, "INADDR_ANY", 0x00000000);
2859#endif
2860#ifdef INADDR_BROADCAST
2861 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2862#else
2863 insint(d, "INADDR_BROADCAST", 0xffffffff);
2864#endif
2865#ifdef INADDR_LOOPBACK
2866 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2867#else
2868 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2869#endif
2870#ifdef INADDR_UNSPEC_GROUP
2871 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2872#else
2873 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2874#endif
2875#ifdef INADDR_ALLHOSTS_GROUP
2876 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2877#else
2878 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2879#endif
2880#ifdef INADDR_MAX_LOCAL_GROUP
2881 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2882#else
2883 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2884#endif
2885#ifdef INADDR_NONE
2886 insint(d, "INADDR_NONE", INADDR_NONE);
2887#else
2888 insint(d, "INADDR_NONE", 0xffffffff);
2889#endif
2890
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002891 /* IP [gs]etsockopt options */
2892#ifdef IP_OPTIONS
2893 insint(d, "IP_OPTIONS", IP_OPTIONS);
2894#endif
2895#ifdef IP_HDRINCL
2896 insint(d, "IP_HDRINCL", IP_HDRINCL);
2897#endif
2898#ifdef IP_TOS
2899 insint(d, "IP_TOS", IP_TOS);
2900#endif
2901#ifdef IP_TTL
2902 insint(d, "IP_TTL", IP_TTL);
2903#endif
2904#ifdef IP_RECVOPTS
2905 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2906#endif
2907#ifdef IP_RECVRETOPTS
2908 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2909#endif
2910#ifdef IP_RECVDSTADDR
2911 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2912#endif
2913#ifdef IP_RETOPTS
2914 insint(d, "IP_RETOPTS", IP_RETOPTS);
2915#endif
2916#ifdef IP_MULTICAST_IF
2917 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2918#endif
2919#ifdef IP_MULTICAST_TTL
2920 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2921#endif
2922#ifdef IP_MULTICAST_LOOP
2923 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2924#endif
2925#ifdef IP_ADD_MEMBERSHIP
2926 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2927#endif
2928#ifdef IP_DROP_MEMBERSHIP
2929 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2930#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002931#ifdef IP_DEFAULT_MULTICAST_TTL
2932 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
2933#endif
2934#ifdef IP_DEFAULT_MULTICAST_LOOP
2935 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
2936#endif
2937#ifdef IP_MAX_MEMBERSHIPS
2938 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
2939#endif
2940
2941 /* TCP options */
2942#ifdef TCP_NODELAY
2943 insint(d, "TCP_NODELAY", TCP_NODELAY);
2944#endif
2945#ifdef TCP_MAXSEG
2946 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
2947#endif
2948
2949 /* IPX options */
2950#ifdef IPX_TYPE
2951 insint(d, "IPX_TYPE", IPX_TYPE);
2952#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002953
2954 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002955#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002956 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002957#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002958}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00002959
2960/* Simplistic emulation code for inet_pton that only works for IPv4 */
2961#ifndef HAVE_INET_PTON
Martin v. Löwisa2ca1ae2001-06-24 21:35:43 +00002962int
2963inet_pton (int af, char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00002964{
2965 if(af == AF_INET){
2966 long packed_addr;
2967#ifdef USE_GUSI1
2968 packed_addr = (long)inet_addr(src).s_addr;
2969#else
2970 packed_addr = inet_addr(src);
2971#endif
2972 if (packed_addr == INADDR_NONE)
2973 return 0;
2974 memcpy(dst, &packed_addr, 4);
2975 return 1;
2976 }
2977 /* Should set errno to EAFNOSUPPORT */
2978 return -1;
2979}
2980
2981char *
Martin v. Löwisa2ca1ae2001-06-24 21:35:43 +00002982inet_ntop(int af, void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00002983{
2984 if (af == AF_INET) {
2985 struct in_addr packed_addr;
2986 if (size < 16)
2987 /* Should set errno to ENOSPC. */
2988 return NULL;
2989 memcpy(&packed_addr, src, sizeof(packed_addr));
2990 return strncpy(dst, inet_ntoa(packed_addr), size);
2991 }
2992 /* Should set errno to EAFNOSUPPORT */
2993 return NULL;
2994}
2995#endif