blob: 1841024ebd5d102042758b6afc768d5031a84017 [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
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000198#include "addrinfo.h"
199
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000200#ifdef USE_SSL
Andrew M. Kuchling697a0b02001-01-18 17:41:41 +0000201#include "openssl/rsa.h"
202#include "openssl/crypto.h"
203#include "openssl/x509.h"
204#include "openssl/pem.h"
205#include "openssl/ssl.h"
206#include "openssl/err.h"
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000207#endif /* USE_SSL */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000208
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000209#ifndef HAVE_INET_PTON
Martin v. Löwis51777ce2001-06-25 06:38:03 +0000210int inet_pton (int af, char *src, void *dst);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000211char *inet_ntop(int af, void *src, char *dst, socklen_t size);
212#endif
213
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000214/* I know this is a bad practice, but it is the easiest... */
215#ifndef HAVE_GETADDRINFO
216#include "getaddrinfo.c"
217#endif
218#ifndef HAVE_GETNAMEINFO
219#include "getnameinfo.c"
220#endif
221
Guido van Rossumbcc20741998-08-04 22:53:56 +0000222#if defined(MS_WINDOWS) || defined(__BEOS__)
223/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000224/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000225#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000226#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000227#endif
228
Fred Drakea04eaad2000-06-30 02:46:07 +0000229/* abstract the socket file descriptor type */
230#ifdef MS_WINDOWS
231typedef SOCKET SOCKET_T;
232# ifdef MS_WIN64
233# define SIZEOF_SOCKET_T 8
234# else
235# define SIZEOF_SOCKET_T 4
236# endif
237#else
238typedef int SOCKET_T;
239# define SIZEOF_SOCKET_T SIZEOF_INT
240#endif
241
242
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000243#if defined(PYOS_OS2)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000244#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000245#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000246#endif
247
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000248#ifndef SOCKETCLOSE
249#define SOCKETCLOSE close
250#endif
251
Guido van Rossum30a685f1991-06-27 15:51:29 +0000252/* Global variable holding the exception type for errors detected
253 by this module (but not argument type or memory errors, etc.). */
254
Guido van Rossum73624e91994-10-10 17:59:00 +0000255static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000256
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000257#ifdef USE_SSL
258static PyObject *SSLErrorObject;
259#endif /* USE_SSL */
260
Guido van Rossum30a685f1991-06-27 15:51:29 +0000261
Guido van Rossum48a680c2001-03-02 06:34:14 +0000262#ifdef RISCOS
263/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
264static int taskwindow;
265#endif
266
267
Guido van Rossum30a685f1991-06-27 15:51:29 +0000268/* Convenience function to raise an error according to errno
269 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000270
Guido van Rossum73624e91994-10-10 17:59:00 +0000271static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000272PySocket_Err(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000273{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000274#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000275 int err_no = WSAGetLastError();
276 if (err_no) {
277 static struct { int no; const char *msg; } *msgp, msgs[] = {
278 { WSAEINTR, "Interrupted system call" },
279 { WSAEBADF, "Bad file descriptor" },
280 { WSAEACCES, "Permission denied" },
281 { WSAEFAULT, "Bad address" },
282 { WSAEINVAL, "Invalid argument" },
283 { WSAEMFILE, "Too many open files" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000284 { WSAEWOULDBLOCK,
Mark Hammond46a733d2000-07-24 01:45:11 +0000285 "The socket operation could not complete "
286 "without blocking" },
287 { WSAEINPROGRESS, "Operation now in progress" },
288 { WSAEALREADY, "Operation already in progress" },
289 { WSAENOTSOCK, "Socket operation on non-socket" },
290 { WSAEDESTADDRREQ, "Destination address required" },
291 { WSAEMSGSIZE, "Message too long" },
292 { WSAEPROTOTYPE, "Protocol wrong type for socket" },
293 { WSAENOPROTOOPT, "Protocol not available" },
294 { WSAEPROTONOSUPPORT, "Protocol not supported" },
295 { WSAESOCKTNOSUPPORT, "Socket type not supported" },
296 { WSAEOPNOTSUPP, "Operation not supported" },
297 { WSAEPFNOSUPPORT, "Protocol family not supported" },
298 { WSAEAFNOSUPPORT, "Address family not supported" },
299 { WSAEADDRINUSE, "Address already in use" },
300 { WSAEADDRNOTAVAIL,
301 "Can't assign requested address" },
302 { WSAENETDOWN, "Network is down" },
303 { WSAENETUNREACH, "Network is unreachable" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000304 { WSAENETRESET,
Mark Hammond46a733d2000-07-24 01:45:11 +0000305 "Network dropped connection on reset" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000306 { WSAECONNABORTED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000307 "Software caused connection abort" },
308 { WSAECONNRESET, "Connection reset by peer" },
309 { WSAENOBUFS, "No buffer space available" },
310 { WSAEISCONN, "Socket is already connected" },
311 { WSAENOTCONN, "Socket is not connected" },
312 { WSAESHUTDOWN, "Can't send after socket shutdown" },
313 { WSAETOOMANYREFS,
314 "Too many references: can't splice" },
315 { WSAETIMEDOUT, "Operation timed out" },
316 { WSAECONNREFUSED, "Connection refused" },
317 { WSAELOOP, "Too many levels of symbolic links" },
318 { WSAENAMETOOLONG, "File name too long" },
319 { WSAEHOSTDOWN, "Host is down" },
320 { WSAEHOSTUNREACH, "No route to host" },
321 { WSAENOTEMPTY, "Directory not empty" },
322 { WSAEPROCLIM, "Too many processes" },
323 { WSAEUSERS, "Too many users" },
324 { WSAEDQUOT, "Disc quota exceeded" },
325 { WSAESTALE, "Stale NFS file handle" },
326 { WSAEREMOTE, "Too many levels of remote in path" },
327 { WSASYSNOTREADY,
328 "Network subsystem is unvailable" },
329 { WSAVERNOTSUPPORTED,
330 "WinSock version is not supported" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000331 { WSANOTINITIALISED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000332 "Successful WSAStartup() not yet performed" },
333 { WSAEDISCON, "Graceful shutdown in progress" },
334 /* Resolver errors */
335 { WSAHOST_NOT_FOUND, "No such host is known" },
336 { WSATRY_AGAIN, "Host not found, or server failed" },
337 { WSANO_RECOVERY,
338 "Unexpected server error encountered" },
339 { WSANO_DATA, "Valid name without requested data" },
340 { WSANO_ADDRESS, "No address, look for MX record" },
341 { 0, NULL }
342 };
Guido van Rossum73624e91994-10-10 17:59:00 +0000343 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000344 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000345
Mark Hammond46a733d2000-07-24 01:45:11 +0000346 for (msgp = msgs; msgp->msg; msgp++) {
347 if (err_no == msgp->no) {
348 msg = msgp->msg;
349 break;
350 }
351 }
352
353 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000354 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000355 PyErr_SetObject(PySocket_Error, v);
356 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000357 }
358 return NULL;
359 }
360 else
361#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000362
363#if defined(PYOS_OS2)
364 if (sock_errno() != NO_ERROR) {
365 APIRET rc;
366 ULONG msglen;
367 char outbuf[100];
368 int myerrorcode = sock_errno();
369
370 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
371 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
372 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
373 if (rc == NO_ERROR) {
374 PyObject *v;
375
376 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
377 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
378 char *lastc = &outbuf[ strlen(outbuf)-1 ];
379 while (lastc > outbuf && isspace(*lastc))
380 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
381 }
382 v = Py_BuildValue("(is)", myerrorcode, outbuf);
383 if (v != NULL) {
384 PyErr_SetObject(PySocket_Error, v);
385 Py_DECREF(v);
386 }
387 return NULL;
388 }
389 }
390#endif
391
Guido van Rossum73624e91994-10-10 17:59:00 +0000392 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000393}
394
Guido van Rossum30a685f1991-06-27 15:51:29 +0000395
396/* The object holding a socket. It holds some extra information,
397 like the address family, which is used to decode socket address
398 arguments properly. */
399
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000400typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000401 PyObject_HEAD
Fred Drakea04eaad2000-06-30 02:46:07 +0000402 SOCKET_T sock_fd; /* Socket file descriptor */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000403 int sock_family; /* Address family, e.g., AF_INET */
404 int sock_type; /* Socket type, e.g., SOCK_STREAM */
405 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000406 union sock_addr {
407 struct sockaddr_in in;
408#ifdef AF_UNIX
409 struct sockaddr_un un;
410#endif
Jeremy Hylton22308652001-02-02 03:23:09 +0000411#if defined(linux) && defined(AF_PACKET)
412 struct sockaddr_ll ll;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000413#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000414 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000415} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000416
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000417#ifdef USE_SSL
Guido van Rossum30a685f1991-06-27 15:51:29 +0000418
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000419typedef struct {
420 PyObject_HEAD
421 PySocketSockObject *Socket; /* Socket on which we're layered */
422 PyObject *x_attr; /* Attributes dictionary */
423 SSL_CTX* ctx;
424 SSL* ssl;
425 X509* server_cert;
426 BIO* sbio;
427 char server[256];
428 char issuer[256];
429
430} SSLObject;
431
432staticforward PyTypeObject SSL_Type;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000433staticforward PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args);
434staticforward PyObject *SSL_SSLread(SSLObject *self, PyObject *args);
435
436#define SSLObject_Check(v) ((v)->ob_type == &SSL_Type)
437
438#endif /* USE_SSL */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000439
Guido van Rossum30a685f1991-06-27 15:51:29 +0000440/* A forward reference to the Socktype type object.
441 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000442 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000443 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000444
Guido van Rossum73624e91994-10-10 17:59:00 +0000445staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000446
Guido van Rossum30a685f1991-06-27 15:51:29 +0000447
448/* Create a new socket object.
449 This just creates the object and initializes it.
450 If the creation fails, return NULL and set an exception (implicit
451 in NEWOBJ()). */
452
Guido van Rossum73624e91994-10-10 17:59:00 +0000453static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000454PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000455{
Guido van Rossum48a680c2001-03-02 06:34:14 +0000456#ifdef RISCOS
457 int block = 1;
458#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000459 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000460 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000461 s = PyObject_New(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000462 if (s != NULL) {
463 s->sock_fd = fd;
464 s->sock_family = family;
465 s->sock_type = type;
466 s->sock_proto = proto;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000467#ifdef RISCOS
468 if(taskwindow) {
469 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
470 }
471#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000472 }
473 return s;
474}
475
Guido van Rossum30a685f1991-06-27 15:51:29 +0000476
Guido van Rossum48a680c2001-03-02 06:34:14 +0000477/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000478 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000479#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000480PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000481#endif
482
483
Guido van Rossum30a685f1991-06-27 15:51:29 +0000484/* Convert a string specifying a host name or one of a few symbolic
485 names to a numeric IP address. This usually calls gethostbyname()
486 to do the work; the names "" and "<broadcast>" are special.
487 Return the length (should always be 4 bytes), or negative if
488 an error occurred; then an exception is raised. */
489
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000490static int
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000491setipaddr(char* name, struct sockaddr_in * addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000492{
493 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000494 int d1, d2, d3, d4;
Guido van Rossum955becc1999-03-22 20:14:53 +0000495 int h_length;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000496 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000497#ifdef HAVE_GETHOSTBYNAME_R
498 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000499#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
500 struct hostent_data data;
501#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000502 char buf[1001];
503 int buf_len = (sizeof buf) - 1;
504 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000505#endif
506#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000507 int result;
508#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000509#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000510
Guido van Rossuma376cc51996-12-05 23:43:35 +0000511 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000512 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000513 addr_ret->sin_addr.s_addr = INADDR_ANY;
514 return 4;
515 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000516 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000517 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
518 return 4;
519 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000520 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
521 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
522 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
523 addr_ret->sin_addr.s_addr = htonl(
524 ((long) d1 << 24) | ((long) d2 << 16) |
525 ((long) d3 << 8) | ((long) d4 << 0));
526 return 4;
527 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000528 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000529#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000530#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000531 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &hp, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000532#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000533 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000534#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +0000535 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000536 result = gethostbyname_r(name, &hp_allocated, &data);
537 hp = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000538#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000539#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000540#ifdef USE_GETHOSTBYNAME_LOCK
541 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000542#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000543 hp = gethostbyname(name);
544#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000545 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000546
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000547 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000548#ifdef HAVE_HSTRERROR
Guido van Rossum48a680c2001-03-02 06:34:14 +0000549 /* Let's get real error message to return */
550 extern int h_errno;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000551 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
552#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000553 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000554#endif
Guido van Rossum3baaa131999-03-22 21:44:51 +0000555#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000556 PyThread_release_lock(gethostbyname_lock);
557#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000558 return -1;
559 }
560 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
Guido van Rossum955becc1999-03-22 20:14:53 +0000561 h_length = hp->h_length;
Guido van Rossum3baaa131999-03-22 21:44:51 +0000562#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000563 PyThread_release_lock(gethostbyname_lock);
564#endif
565 return h_length;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000566}
567
Guido van Rossum30a685f1991-06-27 15:51:29 +0000568
Guido van Rossum30a685f1991-06-27 15:51:29 +0000569/* Create a string object representing an IP address.
570 This is always a string of the form 'dd.dd.dd.dd' (with variable
571 size numbers). */
572
Guido van Rossum73624e91994-10-10 17:59:00 +0000573static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000574makeipaddr(struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000575{
Fred Drakee5065292001-07-19 21:16:41 +0000576 unsigned long x = ntohl(addr->sin_addr.s_addr);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000577 char buf[100];
578 sprintf(buf, "%d.%d.%d.%d",
579 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
580 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000581 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000582}
583
584
585/* Create an object representing the given socket address,
586 suitable for passing it back to bind(), connect() etc.
587 The family field of the sockaddr structure is inspected
588 to determine what kind of address it really is. */
589
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000590/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000591static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000592makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000593{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000594 if (addrlen == 0) {
595 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000596 Py_INCREF(Py_None);
597 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000598 }
599
Guido van Rossumbcc20741998-08-04 22:53:56 +0000600#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000601 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000602 addr->sa_family = AF_INET;
603#endif
604
Guido van Rossum30a685f1991-06-27 15:51:29 +0000605 switch (addr->sa_family) {
606
607 case AF_INET:
608 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000609 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000610 PyObject *addrobj = makeipaddr(a);
611 PyObject *ret = NULL;
612 if (addrobj) {
613 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
614 Py_DECREF(addrobj);
615 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000616 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000617 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000618
Guido van Rossumb6775db1994-08-01 11:34:53 +0000619#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000620 case AF_UNIX:
621 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000622 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000623 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000624 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000625#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000626
Jeremy Hylton22308652001-02-02 03:23:09 +0000627#if defined(linux) && defined(AF_PACKET)
628 case AF_PACKET:
629 {
630 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
631 char *ifname = "";
632 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000633 /* need to look up interface name give index */
634 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000635 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000636 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000637 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000638 }
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000639 return Py_BuildValue("shbhs#", ifname, ntohs(a->sll_protocol),
Guido van Rossum48a680c2001-03-02 06:34:14 +0000640 a->sll_pkttype, a->sll_hatype,
641 a->sll_addr, a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000642 }
643#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000644
Guido van Rossum30a685f1991-06-27 15:51:29 +0000645 /* More cases here... */
646
647 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000648 /* If we don't know the address family, don't raise an
649 exception -- return it as a tuple. */
650 return Py_BuildValue("is#",
651 addr->sa_family,
652 addr->sa_data,
653 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000654
Guido van Rossum30a685f1991-06-27 15:51:29 +0000655 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000656}
657
Guido van Rossum30a685f1991-06-27 15:51:29 +0000658
659/* Parse a socket address argument according to the socket object's
660 address family. Return 1 if the address was in the proper format,
661 0 of not. The address is returned through addr_ret, its length
662 through len_ret. */
663
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000664static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000665getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000666 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000667{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000668 switch (s->sock_family) {
669
Guido van Rossumb6775db1994-08-01 11:34:53 +0000670#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000671 case AF_UNIX:
672 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000673 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000674 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000675 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000676 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000677 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000678 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000679 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000680 PyErr_SetString(PySocket_Error,
681 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000682 return 0;
683 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000684 addr->sun_family = AF_UNIX;
685 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000686 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000687 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000688 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000689 return 1;
690 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000691#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000692
Guido van Rossum30a685f1991-06-27 15:51:29 +0000693 case AF_INET:
694 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000695 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000696 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000697 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000698 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000699 if (!PyTuple_Check(args)) {
700 PyErr_Format(PyExc_TypeError,
701 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
702 args->ob_type->tp_name);
703 return 0;
704 }
705 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000706 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000707 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000708 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000709 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000710 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000711 *addr_ret = (struct sockaddr *) addr;
712 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000713 return 1;
714 }
715
Jeremy Hylton22308652001-02-02 03:23:09 +0000716#if defined(linux) && defined(AF_PACKET)
717 case AF_PACKET:
718 {
719 struct sockaddr_ll* addr;
720 struct ifreq ifr;
721 char *interfaceName;
722 int protoNumber;
723 int hatype = 0;
724 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000725 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000726
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000727 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
728 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000729 return 0;
730 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
731 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000732 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
733 PyErr_SetFromErrno(PySocket_Error);
Jeremy Hylton22308652001-02-02 03:23:09 +0000734 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000735 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000736 addr = &(s->sock_addr.ll);
737 addr->sll_family = AF_PACKET;
738 addr->sll_protocol = htons((short)protoNumber);
739 addr->sll_ifindex = ifr.ifr_ifindex;
740 addr->sll_pkttype = pkttype;
741 addr->sll_hatype = hatype;
742 *addr_ret = (struct sockaddr *) addr;
743 *len_ret = sizeof *addr;
744 return 1;
745 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000746#endif
747
748
Guido van Rossum30a685f1991-06-27 15:51:29 +0000749 /* More cases here... */
750
751 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000752 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000753 return 0;
754
755 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000756}
757
Guido van Rossum30a685f1991-06-27 15:51:29 +0000758
Guido van Rossum48a680c2001-03-02 06:34:14 +0000759/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000760 Return 1 if the family is known, 0 otherwise. The length is returned
761 through len_ret. */
762
763static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000764getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000765{
766 switch (s->sock_family) {
767
Guido van Rossumb6775db1994-08-01 11:34:53 +0000768#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000769 case AF_UNIX:
770 {
771 *len_ret = sizeof (struct sockaddr_un);
772 return 1;
773 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000774#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000775
776 case AF_INET:
777 {
778 *len_ret = sizeof (struct sockaddr_in);
779 return 1;
780 }
781
Jeremy Hylton22308652001-02-02 03:23:09 +0000782#if defined(linux) && defined(AF_PACKET)
783 case AF_PACKET:
784 {
785 *len_ret = sizeof (struct sockaddr_ll);
786 return 1;
787 }
788#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000789
Guido van Rossum710e1df1992-06-12 10:39:36 +0000790 /* More cases here... */
791
792 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000793 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000794 return 0;
795
796 }
797}
798
799
Guido van Rossum30a685f1991-06-27 15:51:29 +0000800/* s.accept() method */
801
Guido van Rossum73624e91994-10-10 17:59:00 +0000802static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000803PySocketSock_accept(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000804{
805 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000806 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000807 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000808 PyObject *sock = NULL;
809 PyObject *addr = NULL;
810 PyObject *res = NULL;
811
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000812 if (!PyArg_ParseTuple(args, ":accept"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000813 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000814 if (!getsockaddrlen(s, &addrlen))
815 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000816 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000817 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000818 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000819 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000820#ifdef MS_WINDOWS
821 if (newfd == INVALID_SOCKET)
822#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000823 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000824#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000825 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000826
Guido van Rossum30a685f1991-06-27 15:51:29 +0000827 /* Create the new object with unspecified family,
828 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000829 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000830 s->sock_family,
831 s->sock_type,
832 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000833 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000834 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000835 goto finally;
836 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000837 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000838 addrlen);
839 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +0000840 goto finally;
841
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000842 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000843
844 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000845 Py_XDECREF(sock);
846 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000847 return res;
848}
849
Guido van Rossum82a5c661998-07-07 20:45:43 +0000850static char accept_doc[] =
851"accept() -> (socket object, address info)\n\
852\n\
853Wait for an incoming connection. Return a new socket representing the\n\
854connection, and the address of the client. For IP sockets, the address\n\
855info is a pair (hostaddr, port).";
856
Guido van Rossum30a685f1991-06-27 15:51:29 +0000857
Guido van Rossume4485b01994-09-07 14:32:49 +0000858/* s.setblocking(1 | 0) method */
859
Guido van Rossum73624e91994-10-10 17:59:00 +0000860static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000861PySocketSock_setblocking(PySocketSockObject *s, PyObject *args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000862{
863 int block;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000864#ifndef RISCOS
Guido van Rossum644a12b1997-04-09 19:24:53 +0000865#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000866 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000867#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000868#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000869 if (!PyArg_ParseTuple(args, "i:setblocking", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000870 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000871 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000872#ifdef __BEOS__
873 block = !block;
874 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
875 (void *)(&block), sizeof( int ) );
876#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000877#ifndef RISCOS
Guido van Rossum6f489d91996-06-28 20:15:15 +0000878#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000879#ifdef PYOS_OS2
880 block = !block;
881 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
882#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000883 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
884 if (block)
885 delay_flag &= (~O_NDELAY);
886 else
887 delay_flag |= O_NDELAY;
888 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000889#endif /* !PYOS_OS2 */
890#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000891 block = !block;
892 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000893#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000894#endif /* __BEOS__ */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000895#endif /* RISCOS */
Guido van Rossum73624e91994-10-10 17:59:00 +0000896 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000897
Guido van Rossum73624e91994-10-10 17:59:00 +0000898 Py_INCREF(Py_None);
899 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000900}
Guido van Rossume4485b01994-09-07 14:32:49 +0000901
Guido van Rossum82a5c661998-07-07 20:45:43 +0000902static char setblocking_doc[] =
903"setblocking(flag)\n\
904\n\
905Set the socket to blocking (flag is true) or non-blocking (false).\n\
906This uses the FIONBIO ioctl with the O_NDELAY flag.";
907
Guido van Rossume4485b01994-09-07 14:32:49 +0000908
Guido van Rossum48a680c2001-03-02 06:34:14 +0000909#ifdef RISCOS
910/* s.sleeptaskw(1 | 0) method */
911
912static PyObject *
913PySocketSock_sleeptaskw(PySocketSockObject *s,PyObject *args)
914{
915 int block;
916 int delay_flag;
917 if (!PyArg_GetInt(args, &block))
918 return NULL;
919 Py_BEGIN_ALLOW_THREADS
920 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
921 Py_END_ALLOW_THREADS
922
923 Py_INCREF(Py_None);
924 return Py_None;
925}
926static char sleeptaskw_doc[] =
927"sleeptaskw(flag)\n\
928\n\
929Allow sleeps in taskwindows.";
930#endif
931
932
Guido van Rossumaee08791992-09-08 09:05:33 +0000933/* s.setsockopt() method.
934 With an integer third argument, sets an integer option.
935 With a string third argument, sets an option from a buffer;
936 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000937
Guido van Rossum73624e91994-10-10 17:59:00 +0000938static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000939PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000940{
941 int level;
942 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000943 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000944 char *buf;
945 int buflen;
946 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000947
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000948 if (PyArg_ParseTuple(args, "iii:setsockopt",
949 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000950 buf = (char *) &flag;
951 buflen = sizeof flag;
952 }
953 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000954 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000955 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
956 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000957 return NULL;
958 }
Thomas Wouters334fb892000-07-25 12:56:38 +0000959 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000960 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000961 return PySocket_Err();
962 Py_INCREF(Py_None);
963 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000964}
965
Guido van Rossum82a5c661998-07-07 20:45:43 +0000966static char setsockopt_doc[] =
967"setsockopt(level, option, value)\n\
968\n\
969Set a socket option. See the Unix manual for level and option.\n\
970The value argument can either be an integer or a string.";
971
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000972
Guido van Rossumaee08791992-09-08 09:05:33 +0000973/* s.getsockopt() method.
974 With two arguments, retrieves an integer option.
975 With a third integer argument, retrieves a string buffer of that size;
976 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000977
Guido van Rossum73624e91994-10-10 17:59:00 +0000978static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000979PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000980{
981 int level;
982 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000983 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000984 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000985 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000986
Guido van Rossumbcc20741998-08-04 22:53:56 +0000987#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +0000988 /* We have incomplete socket support. */
989 PyErr_SetString(PySocket_Error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +0000990 return NULL;
991#else
992
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000993 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
994 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +0000995 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000996
Guido van Rossumbe32c891996-06-20 16:25:29 +0000997 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000998 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000999 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001000 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001001 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001002 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001003 return PySocket_Err();
1004 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001005 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001006 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001007 PyErr_SetString(PySocket_Error,
1008 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001009 return NULL;
1010 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001011 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001012 if (buf == NULL)
1013 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001014 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001015 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001016 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001017 Py_DECREF(buf);
1018 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +00001019 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001020 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001021 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001022#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001023}
1024
Guido van Rossum82a5c661998-07-07 20:45:43 +00001025static char getsockopt_doc[] =
1026"getsockopt(level, option[, buffersize]) -> value\n\
1027\n\
1028Get a socket option. See the Unix manual for level and option.\n\
1029If a nonzero buffersize argument is given, the return value is a\n\
1030string of that length; otherwise it is an integer.";
1031
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001032
Fred Drake728819a2000-07-01 03:40:12 +00001033/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001034
Guido van Rossum73624e91994-10-10 17:59:00 +00001035static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001036PySocketSock_bind(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001037{
1038 struct sockaddr *addr;
1039 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001040 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001041 PyObject *addro;
1042 if (!PyArg_ParseTuple(args, "O:bind", &addro))
1043 return NULL;
1044 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001045 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001046 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001047 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001048 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001049 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001050 return PySocket_Err();
1051 Py_INCREF(Py_None);
1052 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001053}
1054
Guido van Rossum82a5c661998-07-07 20:45:43 +00001055static char bind_doc[] =
1056"bind(address)\n\
1057\n\
1058Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001059pair (host, port); the host must refer to the local host. For raw packet\n\
1060sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001061
Guido van Rossum30a685f1991-06-27 15:51:29 +00001062
1063/* s.close() method.
1064 Set the file descriptor to -1 so operations tried subsequently
1065 will surely fail. */
1066
Guido van Rossum73624e91994-10-10 17:59:00 +00001067static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001068PySocketSock_close(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001069{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001070 SOCKET_T fd;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001071 if (!PyArg_ParseTuple(args, ":close"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001072 return NULL;
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001073 if ((fd = s->sock_fd) != -1) {
1074 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001075 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001076 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001077 Py_END_ALLOW_THREADS
1078 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001079 Py_INCREF(Py_None);
1080 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001081}
1082
Guido van Rossum82a5c661998-07-07 20:45:43 +00001083static char close_doc[] =
1084"close()\n\
1085\n\
1086Close the socket. It cannot be used after this call.";
1087
Guido van Rossum30a685f1991-06-27 15:51:29 +00001088
Fred Drake728819a2000-07-01 03:40:12 +00001089/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001090
Guido van Rossum73624e91994-10-10 17:59:00 +00001091static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001092PySocketSock_connect(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001093{
1094 struct sockaddr *addr;
1095 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001096 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001097 PyObject *addro;
1098 if (!PyArg_ParseTuple(args, "O:connect", &addro))
1099 return NULL;
1100 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001101 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001102 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001103 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001104 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001105 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001106 return PySocket_Err();
1107 Py_INCREF(Py_None);
1108 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001109}
1110
Guido van Rossum82a5c661998-07-07 20:45:43 +00001111static char connect_doc[] =
1112"connect(address)\n\
1113\n\
1114Connect the socket to a remote address. For IP sockets, the address\n\
1115is a pair (host, port).";
1116
Guido van Rossum30a685f1991-06-27 15:51:29 +00001117
Fred Drake728819a2000-07-01 03:40:12 +00001118/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001119
1120static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001121PySocketSock_connect_ex(PySocketSockObject *s, PyObject *args)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001122{
1123 struct sockaddr *addr;
1124 int addrlen;
1125 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001126 PyObject *addro;
1127 if (!PyArg_ParseTuple(args, "O:connect_ex", &addro))
1128 return NULL;
1129 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001130 return NULL;
1131 Py_BEGIN_ALLOW_THREADS
1132 res = connect(s->sock_fd, addr, addrlen);
1133 Py_END_ALLOW_THREADS
1134 if (res != 0)
1135 res = errno;
1136 return PyInt_FromLong((long) res);
1137}
1138
Guido van Rossum82a5c661998-07-07 20:45:43 +00001139static char connect_ex_doc[] =
1140"connect_ex(address)\n\
1141\n\
1142This is like connect(address), but returns an error code (the errno value)\n\
1143instead of raising an exception when an error occurs.";
1144
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001145
Guido van Rossumed233a51992-06-23 09:07:03 +00001146/* s.fileno() method */
1147
Guido van Rossum73624e91994-10-10 17:59:00 +00001148static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001149PySocketSock_fileno(PySocketSockObject *s, PyObject *args)
Guido van Rossumed233a51992-06-23 09:07:03 +00001150{
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001151 if (!PyArg_ParseTuple(args, ":fileno"))
Guido van Rossumed233a51992-06-23 09:07:03 +00001152 return NULL;
Fred Drakea04eaad2000-06-30 02:46:07 +00001153#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001154 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001155#else
1156 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1157#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001158}
1159
Guido van Rossum82a5c661998-07-07 20:45:43 +00001160static char fileno_doc[] =
1161"fileno() -> integer\n\
1162\n\
1163Return the integer file descriptor of the socket.";
1164
Guido van Rossumed233a51992-06-23 09:07:03 +00001165
Guido van Rossumbe32c891996-06-20 16:25:29 +00001166#ifndef NO_DUP
1167/* s.dup() method */
1168
1169static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001170PySocketSock_dup(PySocketSockObject *s, PyObject *args)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001171{
Fred Drakea04eaad2000-06-30 02:46:07 +00001172 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001173 PyObject *sock;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001174 if (!PyArg_ParseTuple(args, ":dup"))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001175 return NULL;
1176 newfd = dup(s->sock_fd);
1177 if (newfd < 0)
1178 return PySocket_Err();
1179 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001180 s->sock_family,
1181 s->sock_type,
1182 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001183 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001184 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001185 return sock;
1186}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001187
1188static char dup_doc[] =
1189"dup() -> socket object\n\
1190\n\
1191Return a new socket object connected to the same system resource.";
1192
Guido van Rossumbe32c891996-06-20 16:25:29 +00001193#endif
1194
1195
Guido van Rossumc89705d1992-11-26 08:54:07 +00001196/* s.getsockname() method */
1197
Guido van Rossum73624e91994-10-10 17:59:00 +00001198static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001199PySocketSock_getsockname(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001200{
1201 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001202 int res;
1203 socklen_t addrlen;
1204
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001205 if (!PyArg_ParseTuple(args, ":getsockname"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001206 return NULL;
1207 if (!getsockaddrlen(s, &addrlen))
1208 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001209 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001210 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001211 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001212 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001213 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001214 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001215 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001216}
1217
Guido van Rossum82a5c661998-07-07 20:45:43 +00001218static char getsockname_doc[] =
1219"getsockname() -> address info\n\
1220\n\
1221Return the address of the local endpoint. For IP sockets, the address\n\
1222info is a pair (hostaddr, port).";
1223
Guido van Rossumc89705d1992-11-26 08:54:07 +00001224
Guido van Rossumb6775db1994-08-01 11:34:53 +00001225#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001226/* s.getpeername() method */
1227
Guido van Rossum73624e91994-10-10 17:59:00 +00001228static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001229PySocketSock_getpeername(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001230{
1231 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001232 int res;
1233 socklen_t addrlen;
1234
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001235 if (!PyArg_ParseTuple(args, ":getpeername"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001236 return NULL;
1237 if (!getsockaddrlen(s, &addrlen))
1238 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001239 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001240 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001241 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001242 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001243 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001244 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001245 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001246}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001247
1248static char getpeername_doc[] =
1249"getpeername() -> address info\n\
1250\n\
1251Return the address of the remote endpoint. For IP sockets, the address\n\
1252info is a pair (hostaddr, port).";
1253
Guido van Rossumb6775db1994-08-01 11:34:53 +00001254#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001255
1256
Guido van Rossum30a685f1991-06-27 15:51:29 +00001257/* s.listen(n) method */
1258
Guido van Rossum73624e91994-10-10 17:59:00 +00001259static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001260PySocketSock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001261{
1262 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001263 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001264 if (!PyArg_ParseTuple(args, "i:listen", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001265 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001266 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001267 if (backlog < 1)
1268 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001269 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001270 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001271 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001272 return PySocket_Err();
1273 Py_INCREF(Py_None);
1274 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001275}
1276
Guido van Rossum82a5c661998-07-07 20:45:43 +00001277static char listen_doc[] =
1278"listen(backlog)\n\
1279\n\
1280Enable a server to accept connections. The backlog argument must be at\n\
1281least 1; it specifies the number of unaccepted connection that the system\n\
1282will allow before refusing new connections.";
1283
1284
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001285#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001286/* s.makefile(mode) method.
1287 Create a new open file object referring to a dupped version of
1288 the socket's file descriptor. (The dup() call is necessary so
1289 that the open file and socket objects may be closed independent
1290 of each other.)
1291 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1292
Guido van Rossum73624e91994-10-10 17:59:00 +00001293static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001294PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001295{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001296 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001297 char *mode = "r";
1298 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001299#ifdef MS_WIN32
1300 intptr_t fd;
1301#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001302 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001303#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001304 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001305 PyObject *f;
1306
Guido van Rossum43713e52000-02-29 13:59:29 +00001307 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001308 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001309#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001310 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1311 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001312#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001313 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001314#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001315 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001316 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001317 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001318 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001319 }
1320 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1321 if (f != NULL)
1322 PyFile_SetBufSize(f, bufsize);
1323 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001324}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001325
1326static char makefile_doc[] =
1327"makefile([mode[, buffersize]]) -> file object\n\
1328\n\
1329Return a regular file object corresponding to the socket.\n\
1330The mode and buffersize arguments are as for the built-in open() function.";
1331
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001332#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001333
Guido van Rossum48a680c2001-03-02 06:34:14 +00001334
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001335/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001336
Guido van Rossum73624e91994-10-10 17:59:00 +00001337static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001338PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001339{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001340 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001341 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001342 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001343 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001344 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001345 if (buf == NULL)
1346 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001347 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001348 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001349 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001350 if (n < 0) {
1351 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001352 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001353 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001354 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001355 return NULL;
1356 return buf;
1357}
1358
Guido van Rossum82a5c661998-07-07 20:45:43 +00001359static char recv_doc[] =
1360"recv(buffersize[, flags]) -> data\n\
1361\n\
1362Receive up to buffersize bytes from the socket. For the optional flags\n\
1363argument, see the Unix manual. When no data is available, block until\n\
1364at least one byte is available or until the remote end is closed. When\n\
1365the remote end is closed and all data is read, return the empty string.";
1366
Guido van Rossum30a685f1991-06-27 15:51:29 +00001367
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001368/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001369
Guido van Rossum73624e91994-10-10 17:59:00 +00001370static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001371PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001372{
1373 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001374 PyObject *buf = NULL;
1375 PyObject *addr = NULL;
1376 PyObject *ret = NULL;
1377
Guido van Rossumff3ab422000-04-24 15:16:03 +00001378 int len, n, flags = 0;
1379 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001380 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001381 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001382 if (!getsockaddrlen(s, &addrlen))
1383 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001384 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001385 if (buf == NULL)
1386 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001387 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001388 memset(addrbuf, 0, addrlen);
1389 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001390#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001391#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001392 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001393#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001394 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001395#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001396#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001397 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001398#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001399 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001400 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001401 if (n < 0) {
1402 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001403 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001404 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001405 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001406 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001407
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001408 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001409 goto finally;
1410
Guido van Rossum73624e91994-10-10 17:59:00 +00001411 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001412 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001413 Py_XDECREF(addr);
1414 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001415 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001416}
1417
Guido van Rossum82a5c661998-07-07 20:45:43 +00001418static char recvfrom_doc[] =
1419"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1420\n\
1421Like recv(buffersize, flags) but also return the sender's address info.";
1422
Guido van Rossum30a685f1991-06-27 15:51:29 +00001423
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001424/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001425
Guido van Rossum73624e91994-10-10 17:59:00 +00001426static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001427PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001428{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001429 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001430 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001431 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001432 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001433 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001434 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001435 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001436 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001437 return PySocket_Err();
1438 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001439}
1440
Guido van Rossum82a5c661998-07-07 20:45:43 +00001441static char send_doc[] =
1442"send(data[, flags])\n\
1443\n\
1444Send a data string to the socket. For the optional flags\n\
1445argument, see the Unix manual.";
1446
Guido van Rossum30a685f1991-06-27 15:51:29 +00001447
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001448/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001449
Guido van Rossum73624e91994-10-10 17:59:00 +00001450static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001451PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001452{
Guido van Rossum73624e91994-10-10 17:59:00 +00001453 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001454 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001455 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001456 int addrlen, len, n, flags;
1457 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001458 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001459 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001460 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1461 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001462 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001463 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001464 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001465 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001466 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001467 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001468 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001469 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001470 return PySocket_Err();
1471 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001472}
1473
Guido van Rossum82a5c661998-07-07 20:45:43 +00001474static char sendto_doc[] =
1475"sendto(data[, flags], address)\n\
1476\n\
1477Like send(data, flags) but allows specifying the destination address.\n\
1478For IP sockets, the address is a pair (hostaddr, port).";
1479
Guido van Rossum30a685f1991-06-27 15:51:29 +00001480
1481/* s.shutdown(how) method */
1482
Guido van Rossum73624e91994-10-10 17:59:00 +00001483static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001484PySocketSock_shutdown(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001485{
1486 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001487 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001488 if (!PyArg_ParseTuple(args, "i:shutdown", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001489 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001490 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001491 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001492 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001493 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001494 return PySocket_Err();
1495 Py_INCREF(Py_None);
1496 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001497}
1498
Guido van Rossum82a5c661998-07-07 20:45:43 +00001499static char shutdown_doc[] =
1500"shutdown(flag)\n\
1501\n\
1502Shut down the reading side of the socket (flag == 0), the writing side\n\
1503of the socket (flag == 1), or both ends (flag == 2).";
1504
Guido van Rossum30a685f1991-06-27 15:51:29 +00001505
1506/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001507
Guido van Rossum73624e91994-10-10 17:59:00 +00001508static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001509 {"accept", (PyCFunction)PySocketSock_accept, METH_VARARGS,
1510 accept_doc},
1511 {"bind", (PyCFunction)PySocketSock_bind, METH_VARARGS,
1512 bind_doc},
1513 {"close", (PyCFunction)PySocketSock_close, METH_VARARGS,
1514 close_doc},
1515 {"connect", (PyCFunction)PySocketSock_connect, METH_VARARGS,
1516 connect_doc},
1517 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_VARARGS,
1518 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001519#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001520 {"dup", (PyCFunction)PySocketSock_dup, METH_VARARGS,
1521 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001522#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001523 {"fileno", (PyCFunction)PySocketSock_fileno, METH_VARARGS,
1524 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001525#ifdef HAVE_GETPEERNAME
Guido van Rossum48a680c2001-03-02 06:34:14 +00001526 {"getpeername", (PyCFunction)PySocketSock_getpeername, METH_VARARGS,
1527 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001528#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001529 {"getsockname", (PyCFunction)PySocketSock_getsockname, METH_VARARGS,
1530 getsockname_doc},
1531 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1532 getsockopt_doc},
1533 {"listen", (PyCFunction)PySocketSock_listen, METH_VARARGS,
1534 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001535#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001536 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1537 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001538#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001539 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1540 recv_doc},
1541 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1542 recvfrom_doc},
1543 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1544 send_doc},
1545 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1546 sendto_doc},
1547 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_VARARGS,
1548 setblocking_doc},
1549 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1550 setsockopt_doc},
1551 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_VARARGS,
1552 shutdown_doc},
1553#ifdef RISCOS
1554 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1555 sleeptaskw_doc},
1556#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001557 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001558};
1559
Guido van Rossum30a685f1991-06-27 15:51:29 +00001560
Guido van Rossum73624e91994-10-10 17:59:00 +00001561/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001562 First close the file description. */
1563
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001564static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001565PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001566{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001567 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001568 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001569 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001570}
1571
Guido van Rossum30a685f1991-06-27 15:51:29 +00001572
1573/* Return a socket object's named attribute. */
1574
Guido van Rossum73624e91994-10-10 17:59:00 +00001575static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001576PySocketSock_getattr(PySocketSockObject *s, char *name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001577{
Guido van Rossum73624e91994-10-10 17:59:00 +00001578 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001579}
1580
Guido van Rossum30a685f1991-06-27 15:51:29 +00001581
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001582static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001583PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001584{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001585 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001586#if SIZEOF_SOCKET_T > SIZEOF_LONG
1587 if (s->sock_fd > LONG_MAX) {
1588 /* this can occur on Win64, and actually there is a special
1589 ugly printf formatter for decimal pointer length integer
1590 printing, only bother if necessary*/
1591 PyErr_SetString(PyExc_OverflowError,
1592 "no printf formatter to display the socket descriptor in decimal");
1593 return NULL;
1594 }
1595#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001596 sprintf(buf,
1597 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
Fred Drakea04eaad2000-06-30 02:46:07 +00001598 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001599 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001600}
1601
1602
Guido van Rossumb6775db1994-08-01 11:34:53 +00001603/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001604
Guido van Rossum73624e91994-10-10 17:59:00 +00001605static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001606 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001607 0,
1608 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001609 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001610 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001611 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001612 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001613 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001614 0, /*tp_setattr*/
1615 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001616 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001617 0, /*tp_as_number*/
1618 0, /*tp_as_sequence*/
1619 0, /*tp_as_mapping*/
1620};
1621
Guido van Rossum30a685f1991-06-27 15:51:29 +00001622
Guido van Rossum81194471991-07-27 21:42:02 +00001623/* Python interface to gethostname(). */
1624
1625/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001626static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001627PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001628{
1629 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001630 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001631 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001632 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001633 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001634 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001635 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001636 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001637 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001638 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001639 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001640}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001641
Guido van Rossum82a5c661998-07-07 20:45:43 +00001642static char gethostname_doc[] =
1643"gethostname() -> string\n\
1644\n\
1645Return the current host name.";
1646
Guido van Rossumff4949e1992-08-05 19:58:53 +00001647
Guido van Rossum30a685f1991-06-27 15:51:29 +00001648/* Python interface to gethostbyname(name). */
1649
1650/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001651static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001652PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001653{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001654 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001655 struct sockaddr_in addrbuf;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001656 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001657 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001658 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001659 return NULL;
1660 return makeipaddr(&addrbuf);
1661}
1662
Guido van Rossum82a5c661998-07-07 20:45:43 +00001663static char gethostbyname_doc[] =
1664"gethostbyname(host) -> address\n\
1665\n\
1666Return the IP address (a string of the form '255.255.255.255') for a host.";
1667
1668
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001669/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1670
1671static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001672gethost_common(struct hostent *h, struct sockaddr_in *addr)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001673{
1674 char **pch;
1675 PyObject *rtn_tuple = (PyObject *)NULL;
1676 PyObject *name_list = (PyObject *)NULL;
1677 PyObject *addr_list = (PyObject *)NULL;
1678 PyObject *tmp;
1679 if (h == NULL) {
1680#ifdef HAVE_HSTRERROR
Guido van Rossum48a680c2001-03-02 06:34:14 +00001681 /* Let's get real error message to return */
1682 extern int h_errno;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001683 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1684#else
1685 PyErr_SetString(PySocket_Error, "host not found");
1686#endif
1687 return NULL;
1688 }
1689 if ((name_list = PyList_New(0)) == NULL)
1690 goto err;
1691 if ((addr_list = PyList_New(0)) == NULL)
1692 goto err;
1693 for (pch = h->h_aliases; *pch != NULL; pch++) {
1694 int status;
1695 tmp = PyString_FromString(*pch);
1696 if (tmp == NULL)
1697 goto err;
1698 status = PyList_Append(name_list, tmp);
1699 Py_DECREF(tmp);
1700 if (status)
1701 goto err;
1702 }
1703 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1704 int status;
1705 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1706 tmp = makeipaddr(addr);
1707 if (tmp == NULL)
1708 goto err;
1709 status = PyList_Append(addr_list, tmp);
1710 Py_DECREF(tmp);
1711 if (status)
1712 goto err;
1713 }
1714 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1715 err:
1716 Py_XDECREF(name_list);
1717 Py_XDECREF(addr_list);
1718 return rtn_tuple;
1719}
1720
1721
1722/* Python interface to gethostbyname_ex(name). */
1723
1724/*ARGSUSED*/
1725static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001726PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001727{
1728 char *name;
1729 struct hostent *h;
1730 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001731 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001732#ifdef HAVE_GETHOSTBYNAME_R
1733 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001734#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1735 struct hostent_data data;
1736#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001737 char buf[16384];
1738 int buf_len = (sizeof buf) - 1;
1739 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001740#endif
1741#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001742 int result;
1743#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001744#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001745 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001746 return NULL;
1747 if (setipaddr(name, &addr) < 0)
1748 return NULL;
1749 Py_BEGIN_ALLOW_THREADS
1750#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001751#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001752 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001753#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001754 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001755#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001756 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001757 result = gethostbyname_r(name, &hp_allocated, &data);
1758 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001759#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001760#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001761#ifdef USE_GETHOSTBYNAME_LOCK
1762 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001763#endif
1764 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001765#endif /* HAVE_GETHOSTBYNAME_R */
1766 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001767 ret = gethost_common(h, &addr);
1768#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001769 PyThread_release_lock(gethostbyname_lock);
1770#endif
1771 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001772}
1773
1774static char ghbn_ex_doc[] =
1775"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1776\n\
1777Return the true host name, a list of aliases, and a list of IP addresses,\n\
1778for a host. The host argument is a string giving a host name or IP number.";
1779
1780
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001781/* Python interface to gethostbyaddr(IP). */
1782
1783/*ARGSUSED*/
1784static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001785PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001786{
Guido van Rossum48a680c2001-03-02 06:34:14 +00001787 struct sockaddr_in addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001788 char *ip_num;
1789 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001790 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001791#ifdef HAVE_GETHOSTBYNAME_R
1792 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001793#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1794 struct hostent_data data;
1795#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001796 char buf[16384];
1797 int buf_len = (sizeof buf) - 1;
1798 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001799#endif
1800#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001801 int result;
1802#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001803#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001804
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001805 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001806 return NULL;
1807 if (setipaddr(ip_num, &addr) < 0)
1808 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001809 Py_BEGIN_ALLOW_THREADS
1810#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001811#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001812 result = gethostbyaddr_r((char *)&addr.sin_addr,
1813 sizeof(addr.sin_addr),
1814 AF_INET, &hp_allocated, buf, buf_len,
1815 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001816#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001817 h = gethostbyaddr_r((char *)&addr.sin_addr,
1818 sizeof(addr.sin_addr),
Guido van Rossum48a680c2001-03-02 06:34:14 +00001819 AF_INET,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001820 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001821#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001822 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001823 result = gethostbyaddr_r((char *)&addr.sin_addr,
1824 sizeof(addr.sin_addr),
1825 AF_INET, &hp_allocated, &data);
1826 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001827#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001828#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001829#ifdef USE_GETHOSTBYNAME_LOCK
1830 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001831#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001832 h = gethostbyaddr((char *)&addr.sin_addr,
1833 sizeof(addr.sin_addr),
1834 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001835#endif /* HAVE_GETHOSTBYNAME_R */
1836 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001837 ret = gethost_common(h, &addr);
1838#ifdef USE_GETHOSTBYNAME_LOCK
1839 PyThread_release_lock(gethostbyname_lock);
1840#endif
1841 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001842}
1843
Guido van Rossum82a5c661998-07-07 20:45:43 +00001844static char gethostbyaddr_doc[] =
1845"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1846\n\
1847Return the true host name, a list of aliases, and a list of IP addresses,\n\
1848for a host. The host argument is a string giving a host name or IP number.";
1849
Guido van Rossum30a685f1991-06-27 15:51:29 +00001850
1851/* Python interface to getservbyname(name).
1852 This only returns the port number, since the other info is already
1853 known or not useful (like the list of aliases). */
1854
1855/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001856static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001857PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001858{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001859 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001860 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001861 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001862 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001863 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001864 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001865 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001866 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001867 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001868 return NULL;
1869 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001870 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001871}
1872
Guido van Rossum82a5c661998-07-07 20:45:43 +00001873static char getservbyname_doc[] =
1874"getservbyname(servicename, protocolname) -> integer\n\
1875\n\
1876Return a port number from a service name and protocol name.\n\
1877The protocol name should be 'tcp' or 'udp'.";
1878
Guido van Rossum30a685f1991-06-27 15:51:29 +00001879
Guido van Rossum3901d851996-12-19 16:35:04 +00001880/* Python interface to getprotobyname(name).
1881 This only returns the protocol number, since the other info is
1882 already known or not useful (like the list of aliases). */
1883
1884/*ARGSUSED*/
1885static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001886PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00001887{
1888 char *name;
1889 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001890#ifdef __BEOS__
1891/* Not available in BeOS yet. - [cjh] */
1892 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1893 return NULL;
1894#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001895 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00001896 return NULL;
1897 Py_BEGIN_ALLOW_THREADS
1898 sp = getprotobyname(name);
1899 Py_END_ALLOW_THREADS
1900 if (sp == NULL) {
1901 PyErr_SetString(PySocket_Error, "protocol not found");
1902 return NULL;
1903 }
1904 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001905#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001906}
1907
Guido van Rossum82a5c661998-07-07 20:45:43 +00001908static char getprotobyname_doc[] =
1909"getprotobyname(name) -> integer\n\
1910\n\
1911Return the protocol number for the named protocol. (Rarely used.)";
1912
Guido van Rossum3901d851996-12-19 16:35:04 +00001913
Guido van Rossum30a685f1991-06-27 15:51:29 +00001914/* Python interface to socket(family, type, proto).
1915 The third (protocol) argument is optional.
1916 Return a new socket object. */
1917
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001918/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001919static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001920PySocket_socket(PyObject *self, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001921{
Guido van Rossum73624e91994-10-10 17:59:00 +00001922 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001923 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001924 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001925 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001926 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001927 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001928 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001929 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001930#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001931 if (fd == INVALID_SOCKET)
1932#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001933 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001934#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001935 return PySocket_Err();
1936 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001937 /* If the object can't be created, don't forget to close the
1938 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001939 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001940 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001941 /* From now on, ignore SIGPIPE and let the error checking
1942 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001943#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001944 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00001945#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001946 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001947}
1948
Guido van Rossum82a5c661998-07-07 20:45:43 +00001949static char socket_doc[] =
1950"socket(family, type[, proto]) -> socket object\n\
1951\n\
1952Open a socket of the given type. The family argument specifies the\n\
1953address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1954The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1955or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1956specifying the default protocol.";
1957
1958
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001959#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001960/* Create a socket object from a numeric file description.
1961 Useful e.g. if stdin is a socket.
1962 Additional arguments as for socket(). */
1963
1964/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001965static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001966PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001967{
Guido van Rossum73624e91994-10-10 17:59:00 +00001968 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001969 SOCKET_T fd;
1970 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001971 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
1972 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001973 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001974 /* Dup the fd so it and the socket can be closed independently */
1975 fd = dup(fd);
1976 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001977 return PySocket_Err();
1978 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001979 /* From now on, ignore SIGPIPE and let the error checking
1980 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001981#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001982 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00001983#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001984 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001985}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001986
1987static char fromfd_doc[] =
1988"fromfd(fd, family, type[, proto]) -> socket object\n\
1989\n\
1990Create a socket object from the given file descriptor.\n\
1991The remaining arguments are the same as for socket().";
1992
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001993#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001994
Guido van Rossum82a5c661998-07-07 20:45:43 +00001995
Guido van Rossum006bf911996-06-12 04:04:55 +00001996static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001997PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001998{
1999 int x1, x2;
2000
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002001 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002002 return NULL;
2003 }
2004 x2 = (int)ntohs((short)x1);
2005 return PyInt_FromLong(x2);
2006}
2007
Guido van Rossum82a5c661998-07-07 20:45:43 +00002008static char ntohs_doc[] =
2009"ntohs(integer) -> integer\n\
2010\n\
2011Convert a 16-bit integer from network to host byte order.";
2012
2013
Guido van Rossum006bf911996-06-12 04:04:55 +00002014static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002015PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002016{
2017 int x1, x2;
2018
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002019 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002020 return NULL;
2021 }
2022 x2 = ntohl(x1);
2023 return PyInt_FromLong(x2);
2024}
2025
Guido van Rossum82a5c661998-07-07 20:45:43 +00002026static char ntohl_doc[] =
2027"ntohl(integer) -> integer\n\
2028\n\
2029Convert a 32-bit integer from network to host byte order.";
2030
2031
Guido van Rossum006bf911996-06-12 04:04:55 +00002032static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002033PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002034{
2035 int x1, x2;
2036
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002037 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002038 return NULL;
2039 }
2040 x2 = (int)htons((short)x1);
2041 return PyInt_FromLong(x2);
2042}
2043
Guido van Rossum82a5c661998-07-07 20:45:43 +00002044static char htons_doc[] =
2045"htons(integer) -> integer\n\
2046\n\
2047Convert a 16-bit integer from host to network byte order.";
2048
2049
Guido van Rossum006bf911996-06-12 04:04:55 +00002050static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002051PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002052{
2053 int x1, x2;
2054
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002055 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002056 return NULL;
2057 }
2058 x2 = htonl(x1);
2059 return PyInt_FromLong(x2);
2060}
2061
Guido van Rossum82a5c661998-07-07 20:45:43 +00002062static char htonl_doc[] =
2063"htonl(integer) -> integer\n\
2064\n\
2065Convert a 32-bit integer from host to network byte order.";
2066
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002067/*
2068 * socket.inet_aton() and socket.inet_ntoa() functions
2069 *
2070 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2071 *
2072 */
2073
Guido van Rossum48a680c2001-03-02 06:34:14 +00002074static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002075"inet_aton(string) -> packed 32-bit IP representation\n\
2076\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002077Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002078binary format used in low-level network functions.";
2079
2080static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002081PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002082{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002083#ifndef INADDR_NONE
2084#define INADDR_NONE (-1)
2085#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002086
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002087 /* Have to use inet_addr() instead */
2088 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002089 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002090
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002091 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002092 return NULL;
2093 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00002094#ifdef USE_GUSI1
Fred Drakee5065292001-07-19 21:16:41 +00002095 packed_addr = inet_addr(ip_addr).s_addr;
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002096#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002097 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002098#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002099
2100 if (packed_addr == INADDR_NONE) { /* invalid address */
2101 PyErr_SetString(PySocket_Error,
2102 "illegal IP address string passed to inet_aton");
2103 return NULL;
2104 }
2105
2106 return PyString_FromStringAndSize((char *) &packed_addr,
2107 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002108}
2109
Guido van Rossum48a680c2001-03-02 06:34:14 +00002110static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002111"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002112\n\
2113Convert an IP address from 32-bit packed binary format to string format";
2114
2115static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002116PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002117{
2118 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002119 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002120 struct in_addr packed_addr;
2121
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002122 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002123 return NULL;
2124 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002125
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002126 if (addr_len != sizeof(packed_addr)) {
2127 PyErr_SetString(PySocket_Error,
2128 "packed IP wrong length for inet_ntoa");
2129 return NULL;
2130 }
2131
2132 memcpy(&packed_addr, packed_str, addr_len);
2133
2134 return PyString_FromString(inet_ntoa(packed_addr));
2135}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002136
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002137
2138#ifdef USE_SSL
2139
2140/* This is a C function to be called for new object initialization */
2141static SSLObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002142newSSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002143{
2144 SSLObject *self;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002145
Guido van Rossumb18618d2000-05-03 23:44:39 +00002146 self = PyObject_New(SSLObject, &SSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002147 if (self == NULL){
2148 PyErr_SetObject(SSLErrorObject,
2149 PyString_FromString("newSSLObject error"));
2150 return NULL;
2151 }
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002152 memset(self->server, '\0', sizeof(char) * 256);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002153 memset(self->issuer, '\0', sizeof(char) * 256);
2154
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002155 self->x_attr = PyDict_New();
2156 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
2157 if (self->ctx == NULL) {
2158 PyErr_SetObject(SSLErrorObject,
2159 PyString_FromString("SSL_CTX_new error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002160 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002161 return NULL;
2162 }
2163
2164 if ( (key_file && !cert_file) || (!key_file && cert_file) )
2165 {
2166 PyErr_SetObject(SSLErrorObject,
2167 PyString_FromString(
2168 "Both the key & certificate files must be specified"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002169 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002170 return NULL;
2171 }
2172
2173 if (key_file && cert_file)
2174 {
2175 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
2176 SSL_FILETYPE_PEM) < 1)
2177 {
2178 PyErr_SetObject(SSLErrorObject,
2179 PyString_FromString(
2180 "SSL_CTX_use_PrivateKey_file error"));
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 (SSL_CTX_use_certificate_chain_file(self->ctx,
2186 cert_file) < 1)
2187 {
2188 PyErr_SetObject(SSLErrorObject,
2189 PyString_FromString(
2190 "SSL_CTX_use_certificate_chain_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002191 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002192 return NULL;
2193 }
2194 }
2195
2196 SSL_CTX_set_verify(self->ctx,
2197 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2198 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2199 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2200 SSL_set_connect_state(self->ssl);
2201
2202 if ((SSL_connect(self->ssl)) == -1) {
2203 /* Actually negotiate SSL connection */
2204 PyErr_SetObject(SSLErrorObject,
2205 PyString_FromString("SSL_connect error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002206 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002207 return NULL;
2208 }
2209 self->ssl->debug = 1;
2210
2211 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2212 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
2213 self->server, 256);
2214 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2215 self->issuer, 256);
2216 }
2217 self->x_attr = NULL;
2218 self->Socket = Sock;
2219 Py_INCREF(self->Socket);
2220 return self;
2221}
2222
2223/* This is the Python function called for new object initialization */
2224static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002225PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002226{
2227 SSLObject *rv;
2228 PySocketSockObject *Sock;
2229 char *key_file;
2230 char *cert_file;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002231
Guido van Rossum43713e52000-02-29 13:59:29 +00002232 if (!PyArg_ParseTuple(args, "O!zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002233 &PySocketSock_Type, (PyObject*)&Sock,
2234 &key_file, &cert_file) )
2235 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002236
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002237 rv = newSSLObject(Sock, key_file, cert_file);
2238 if ( rv == NULL )
2239 return NULL;
2240 return (PyObject *)rv;
2241}
2242
2243static char ssl_doc[] =
2244"ssl(socket, keyfile, certfile) -> sslobject";
2245
2246static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002247SSL_server(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002248{
2249 return PyString_FromString(self->server);
2250}
2251
2252static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002253SSL_issuer(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002254{
2255 return PyString_FromString(self->issuer);
2256}
2257
2258
2259/* SSL object methods */
2260
2261static PyMethodDef SSLMethods[] = {
2262 { "write", (PyCFunction)SSL_SSLwrite, 1 },
2263 { "read", (PyCFunction)SSL_SSLread, 1 },
2264 { "server", (PyCFunction)SSL_server, 1 },
2265 { "issuer", (PyCFunction)SSL_issuer, 1 },
2266 { NULL, NULL}
2267};
2268
2269static void SSL_dealloc(SSLObject *self)
2270{
2271 if (self->server_cert) /* Possible not to have one? */
2272 X509_free (self->server_cert);
2273 SSL_CTX_free(self->ctx);
2274 SSL_free(self->ssl);
2275 Py_XDECREF(self->x_attr);
2276 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002277 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002278}
2279
2280static PyObject *SSL_getattr(SSLObject *self, char *name)
2281{
2282 return Py_FindMethod(SSLMethods, (PyObject *)self, name);
2283}
2284
2285staticforward PyTypeObject SSL_Type = {
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002286 PyObject_HEAD_INIT(NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002287 0, /*ob_size*/
2288 "SSL", /*tp_name*/
2289 sizeof(SSLObject), /*tp_basicsize*/
2290 0, /*tp_itemsize*/
2291 /* methods */
2292 (destructor)SSL_dealloc, /*tp_dealloc*/
2293 0, /*tp_print*/
2294 (getattrfunc)SSL_getattr, /*tp_getattr*/
2295 0, /*tp_setattr*/
2296 0, /*tp_compare*/
2297 0, /*tp_repr*/
2298 0, /*tp_as_number*/
2299 0, /*tp_as_sequence*/
2300 0, /*tp_as_mapping*/
2301 0, /*tp_hash*/
2302};
2303
2304
2305
2306static PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args)
2307{
2308 char *data;
Andrew M. Kuchlingb38175e2001-02-07 20:41:17 +00002309 size_t len;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002310
Andrew M. Kuchlingb38175e2001-02-07 20:41:17 +00002311 if (!PyArg_ParseTuple(args, "s#:write", &data, &len))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002312 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002313
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002314 len = SSL_write(self->ssl, data, len);
2315 return PyInt_FromLong((long)len);
2316}
2317
2318static PyObject *SSL_SSLread(SSLObject *self, PyObject *args)
2319{
2320 PyObject *buf;
2321 int count = 0;
2322 int len = 1024;
2323 int res;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002324
Guido van Rossum43713e52000-02-29 13:59:29 +00002325 PyArg_ParseTuple(args, "|i:read", &len);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002326
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002327 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2328 return NULL; /* Error object should already be set */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002329
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002330 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2331 res = SSL_get_error(self->ssl, count);
2332
2333 switch (res) {
Jeremy Hylton42dd01a2001-02-01 23:35:20 +00002334 case SSL_ERROR_NONE:
2335 assert(count > 0);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002336 break;
Jeremy Hylton42dd01a2001-02-01 23:35:20 +00002337 case SSL_ERROR_ZERO_RETURN: /* normal EOF */
2338 assert(count == 0);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002339 break;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002340 default:
2341 return PyErr_SetFromErrno(SSLErrorObject);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002342 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002343
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002344 fflush(stderr);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002345
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002346 if (count < 0) {
2347 Py_DECREF(buf);
2348 return PyErr_SetFromErrno(SSLErrorObject);
2349 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002350
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002351 if (count != len && _PyString_Resize(&buf, count) < 0)
2352 return NULL;
2353 return buf;
2354}
2355
2356#endif /* USE_SSL */
2357
2358
Guido van Rossum30a685f1991-06-27 15:51:29 +00002359/* List of functions exported by this module. */
2360
Guido van Rossum73624e91994-10-10 17:59:00 +00002361static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002362 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002363 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002364 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002365 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002366 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002367 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002368 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002369 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002370 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002371 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002372 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002373 METH_VARARGS,getprotobyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002374 {"socket", PySocket_socket,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002375 METH_VARARGS, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002376#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002377 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002378 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002379#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002380 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002381 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002382 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002383 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002384 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002385 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002386 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002387 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002388 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002389 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002390 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002391 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002392#ifdef USE_SSL
Guido van Rossum48a680c2001-03-02 06:34:14 +00002393 {"ssl", PySocket_ssl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002394 METH_VARARGS, ssl_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002395#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002396 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002397};
2398
Guido van Rossum30a685f1991-06-27 15:51:29 +00002399
2400/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002401 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002402 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002403 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002404static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002405insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002406{
Guido van Rossum73624e91994-10-10 17:59:00 +00002407 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002408 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002409 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002410
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002411 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002412}
2413
Guido van Rossum30a685f1991-06-27 15:51:29 +00002414
Guido van Rossum8d665e61996-06-26 18:22:49 +00002415#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002416
2417/* Additional initialization and cleanup for NT/Windows */
2418
2419static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002420NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002421{
2422 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002423}
2424
2425static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002426NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002427{
2428 WSADATA WSAData;
2429 int ret;
2430 char buf[100];
2431 ret = WSAStartup(0x0101, &WSAData);
2432 switch (ret) {
2433 case 0: /* no error */
2434 atexit(NTcleanup);
2435 return 1;
2436 case WSASYSNOTREADY:
2437 PyErr_SetString(PyExc_ImportError,
2438 "WSAStartup failed: network not ready");
2439 break;
2440 case WSAVERNOTSUPPORTED:
2441 case WSAEINVAL:
2442 PyErr_SetString(PyExc_ImportError,
2443 "WSAStartup failed: requested version not supported");
2444 break;
2445 default:
2446 sprintf(buf, "WSAStartup failed: error code %d", ret);
2447 PyErr_SetString(PyExc_ImportError, buf);
2448 break;
2449 }
2450 return 0;
2451}
2452
Guido van Rossum8d665e61996-06-26 18:22:49 +00002453#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002454
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002455#if defined(PYOS_OS2)
2456
2457/* Additional initialization and cleanup for OS/2 */
2458
2459static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002460OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002461{
2462 /* No cleanup is necessary for OS/2 Sockets */
2463}
2464
2465static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002466OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002467{
2468 char reason[64];
2469 int rc = sock_init();
2470
2471 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002472 atexit(OS2cleanup);
2473 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002474 }
2475
2476 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2477 PyErr_SetString(PyExc_ImportError, reason);
2478
Guido van Rossum32c575d1997-12-02 20:37:32 +00002479 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002480}
2481
2482#endif /* PYOS_OS2 */
2483
Guido van Rossum30a685f1991-06-27 15:51:29 +00002484/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002485 * This is called when the first 'import socket' is done,
2486 * via a table in config.c, if config.c is compiled with USE_SOCKET
2487 * defined.
2488 *
2489 * For MS_WINDOWS (which means any Windows variant), this module
2490 * is actually called "_socket", and there's a wrapper "socket.py"
2491 * which implements some missing functionality (such as makefile(),
2492 * dup() and fromfd()). The import of "_socket" may fail with an
2493 * ImportError exception if initialization of WINSOCK fails. When
2494 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2495 * scheduled to be made at exit time.
2496 *
2497 * For OS/2, this module is also called "_socket" and uses a wrapper
2498 * "socket.py" which implements that functionality that is missing
2499 * when PC operating systems don't put socket descriptors in the
2500 * operating system's filesystem layer.
2501 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002502
Guido van Rossum82a5c661998-07-07 20:45:43 +00002503static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00002504"Implementation module for socket operations. See the socket module\n\
2505for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00002506
2507static char sockettype_doc[] =
2508"A socket represents one endpoint of a network connection.\n\
2509\n\
2510Methods:\n\
2511\n\
2512accept() -- accept a connection, returning new socket and client address\n\
2513bind() -- bind the socket to a local address\n\
2514close() -- close the socket\n\
2515connect() -- connect the socket to a remote address\n\
2516connect_ex() -- connect, return an error code instead of an exception \n\
2517dup() -- return a new socket object identical to the current one (*)\n\
2518fileno() -- return underlying file descriptor\n\
2519getpeername() -- return remote address (*)\n\
2520getsockname() -- return local address\n\
2521getsockopt() -- get socket options\n\
2522listen() -- start listening for incoming connections\n\
2523makefile() -- return a file object corresponding tot the socket (*)\n\
2524recv() -- receive data\n\
2525recvfrom() -- receive data and sender's address\n\
2526send() -- send data\n\
2527sendto() -- send data to a given address\n\
2528setblocking() -- set or clear the blocking I/O flag\n\
2529setsockopt() -- set socket options\n\
2530shutdown() -- shut down traffic in one or both directions\n\
2531\n\
2532(*) not available on all platforms!)";
2533
Guido van Rossum3886bb61998-12-04 18:50:17 +00002534DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002535init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002536{
Guido van Rossum73624e91994-10-10 17:59:00 +00002537 PyObject *m, *d;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002538#ifdef RISCOS
2539 _kernel_swi_regs r;
2540 r.r[0]=0;
2541 _kernel_swi(0x43380, &r, &r);
2542 taskwindow = r.r[0];
2543#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00002544#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002545 if (!NTinit())
2546 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002547#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002548#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002549 if (!OS2init())
2550 return;
Fred Drakea136d492000-08-16 14:18:30 +00002551#endif /* __TOS_OS2__ */
2552#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002553#endif /* RISCOS */
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002554#ifdef USE_SSL
2555 SSL_Type.ob_type = &PyType_Type;
2556#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00002557 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00002558 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002559 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2560 if (PySocket_Error == NULL)
2561 return;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002562#ifdef USE_SSL
2563 SSL_load_error_strings();
2564 SSLeay_add_ssl_algorithms();
2565 SSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2566 if (SSLErrorObject == NULL)
2567 return;
2568 PyDict_SetItemString(d, "sslerror", SSLErrorObject);
2569 Py_INCREF(&SSL_Type);
2570 if (PyDict_SetItemString(d, "SSLType",
2571 (PyObject *)&SSL_Type) != 0)
2572 return;
2573#endif /* USE_SSL */
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002574 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002575 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002576 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002577 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002578 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002579 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002580 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002581
2582 /* Address families (we only support AF_INET and AF_UNIX) */
2583#ifdef AF_UNSPEC
2584 insint(d, "AF_UNSPEC", AF_UNSPEC);
2585#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002586 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002587#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002588 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002589#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002590#ifdef AF_AX25
2591 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2592#endif
2593#ifdef AF_IPX
2594 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2595#endif
2596#ifdef AF_APPLETALK
2597 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2598#endif
2599#ifdef AF_NETROM
2600 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2601#endif
2602#ifdef AF_BRIDGE
2603 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2604#endif
2605#ifdef AF_AAL5
2606 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2607#endif
2608#ifdef AF_X25
2609 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2610#endif
2611#ifdef AF_INET6
2612 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2613#endif
2614#ifdef AF_ROSE
2615 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2616#endif
Jeremy Hylton22308652001-02-02 03:23:09 +00002617#if defined(linux) && defined(AF_PACKET)
2618 insint(d, "AF_PACKET", AF_PACKET);
2619 insint(d, "PF_PACKET", PF_PACKET);
2620 insint(d, "PACKET_HOST", PACKET_HOST);
2621 insint(d, "PACKET_BROADCAST", PACKET_BROADCAST);
2622 insint(d, "PACKET_MULTICAST", PACKET_MULTICAST);
2623 insint(d, "PACKET_OTHERHOST", PACKET_OTHERHOST);
2624 insint(d, "PACKET_OUTGOING", PACKET_OUTGOING);
2625 insint(d, "PACKET_LOOPBACK", PACKET_LOOPBACK);
2626 insint(d, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002627#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002628
2629 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002630 insint(d, "SOCK_STREAM", SOCK_STREAM);
2631 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002632#ifndef __BEOS__
2633/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002634 insint(d, "SOCK_RAW", SOCK_RAW);
2635 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2636 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002637#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002638
2639#ifdef SO_DEBUG
2640 insint(d, "SO_DEBUG", SO_DEBUG);
2641#endif
2642#ifdef SO_ACCEPTCONN
2643 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2644#endif
2645#ifdef SO_REUSEADDR
2646 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2647#endif
2648#ifdef SO_KEEPALIVE
2649 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2650#endif
2651#ifdef SO_DONTROUTE
2652 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2653#endif
2654#ifdef SO_BROADCAST
2655 insint(d, "SO_BROADCAST", SO_BROADCAST);
2656#endif
2657#ifdef SO_USELOOPBACK
2658 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2659#endif
2660#ifdef SO_LINGER
2661 insint(d, "SO_LINGER", SO_LINGER);
2662#endif
2663#ifdef SO_OOBINLINE
2664 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2665#endif
2666#ifdef SO_REUSEPORT
2667 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2668#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002669#ifdef SO_SNDBUF
2670 insint(d, "SO_SNDBUF", SO_SNDBUF);
2671#endif
2672#ifdef SO_RCVBUF
2673 insint(d, "SO_RCVBUF", SO_RCVBUF);
2674#endif
2675#ifdef SO_SNDLOWAT
2676 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2677#endif
2678#ifdef SO_RCVLOWAT
2679 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2680#endif
2681#ifdef SO_SNDTIMEO
2682 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2683#endif
2684#ifdef SO_RCVTIMEO
2685 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2686#endif
2687#ifdef SO_ERROR
2688 insint(d, "SO_ERROR", SO_ERROR);
2689#endif
2690#ifdef SO_TYPE
2691 insint(d, "SO_TYPE", SO_TYPE);
2692#endif
2693
2694 /* Maximum number of connections for "listen" */
2695#ifdef SOMAXCONN
2696 insint(d, "SOMAXCONN", SOMAXCONN);
2697#else
2698 insint(d, "SOMAXCONN", 5); /* Common value */
2699#endif
2700
2701 /* Flags for send, recv */
2702#ifdef MSG_OOB
2703 insint(d, "MSG_OOB", MSG_OOB);
2704#endif
2705#ifdef MSG_PEEK
2706 insint(d, "MSG_PEEK", MSG_PEEK);
2707#endif
2708#ifdef MSG_DONTROUTE
2709 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2710#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002711#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00002712 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002713#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002714#ifdef MSG_EOR
2715 insint(d, "MSG_EOR", MSG_EOR);
2716#endif
2717#ifdef MSG_TRUNC
2718 insint(d, "MSG_TRUNC", MSG_TRUNC);
2719#endif
2720#ifdef MSG_CTRUNC
2721 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2722#endif
2723#ifdef MSG_WAITALL
2724 insint(d, "MSG_WAITALL", MSG_WAITALL);
2725#endif
2726#ifdef MSG_BTAG
2727 insint(d, "MSG_BTAG", MSG_BTAG);
2728#endif
2729#ifdef MSG_ETAG
2730 insint(d, "MSG_ETAG", MSG_ETAG);
2731#endif
2732
2733 /* Protocol level and numbers, usable for [gs]etsockopt */
2734#ifdef SOL_SOCKET
2735 insint(d, "SOL_SOCKET", SOL_SOCKET);
2736#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002737#ifdef SOL_IP
2738 insint(d, "SOL_IP", SOL_IP);
2739#else
2740 insint(d, "SOL_IP", 0);
2741#endif
2742#ifdef SOL_IPX
2743 insint(d, "SOL_IPX", SOL_IPX);
2744#endif
2745#ifdef SOL_AX25
2746 insint(d, "SOL_AX25", SOL_AX25);
2747#endif
2748#ifdef SOL_ATALK
2749 insint(d, "SOL_ATALK", SOL_ATALK);
2750#endif
2751#ifdef SOL_NETROM
2752 insint(d, "SOL_NETROM", SOL_NETROM);
2753#endif
2754#ifdef SOL_ROSE
2755 insint(d, "SOL_ROSE", SOL_ROSE);
2756#endif
2757#ifdef SOL_TCP
2758 insint(d, "SOL_TCP", SOL_TCP);
2759#else
2760 insint(d, "SOL_TCP", 6);
2761#endif
2762#ifdef SOL_UDP
2763 insint(d, "SOL_UDP", SOL_UDP);
2764#else
2765 insint(d, "SOL_UDP", 17);
2766#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002767#ifdef IPPROTO_IP
2768 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002769#else
2770 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002771#endif
2772#ifdef IPPROTO_ICMP
2773 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002774#else
2775 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002776#endif
2777#ifdef IPPROTO_IGMP
2778 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2779#endif
2780#ifdef IPPROTO_GGP
2781 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2782#endif
2783#ifdef IPPROTO_TCP
2784 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002785#else
2786 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002787#endif
2788#ifdef IPPROTO_EGP
2789 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2790#endif
2791#ifdef IPPROTO_PUP
2792 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2793#endif
2794#ifdef IPPROTO_UDP
2795 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002796#else
2797 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002798#endif
2799#ifdef IPPROTO_IDP
2800 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2801#endif
2802#ifdef IPPROTO_HELLO
2803 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2804#endif
2805#ifdef IPPROTO_ND
2806 insint(d, "IPPROTO_ND", IPPROTO_ND);
2807#endif
2808#ifdef IPPROTO_TP
2809 insint(d, "IPPROTO_TP", IPPROTO_TP);
2810#endif
2811#ifdef IPPROTO_XTP
2812 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2813#endif
2814#ifdef IPPROTO_EON
2815 insint(d, "IPPROTO_EON", IPPROTO_EON);
2816#endif
2817#ifdef IPPROTO_BIP
2818 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2819#endif
2820/**/
2821#ifdef IPPROTO_RAW
2822 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002823#else
2824 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002825#endif
2826#ifdef IPPROTO_MAX
2827 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2828#endif
2829
2830 /* Some port configuration */
2831#ifdef IPPORT_RESERVED
2832 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2833#else
2834 insint(d, "IPPORT_RESERVED", 1024);
2835#endif
2836#ifdef IPPORT_USERRESERVED
2837 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2838#else
2839 insint(d, "IPPORT_USERRESERVED", 5000);
2840#endif
2841
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002842 /* Some reserved IP v.4 addresses */
2843#ifdef INADDR_ANY
2844 insint(d, "INADDR_ANY", INADDR_ANY);
2845#else
2846 insint(d, "INADDR_ANY", 0x00000000);
2847#endif
2848#ifdef INADDR_BROADCAST
2849 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2850#else
2851 insint(d, "INADDR_BROADCAST", 0xffffffff);
2852#endif
2853#ifdef INADDR_LOOPBACK
2854 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2855#else
2856 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2857#endif
2858#ifdef INADDR_UNSPEC_GROUP
2859 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2860#else
2861 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2862#endif
2863#ifdef INADDR_ALLHOSTS_GROUP
2864 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2865#else
2866 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2867#endif
2868#ifdef INADDR_MAX_LOCAL_GROUP
2869 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2870#else
2871 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2872#endif
2873#ifdef INADDR_NONE
2874 insint(d, "INADDR_NONE", INADDR_NONE);
2875#else
2876 insint(d, "INADDR_NONE", 0xffffffff);
2877#endif
2878
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002879 /* IP [gs]etsockopt options */
2880#ifdef IP_OPTIONS
2881 insint(d, "IP_OPTIONS", IP_OPTIONS);
2882#endif
2883#ifdef IP_HDRINCL
2884 insint(d, "IP_HDRINCL", IP_HDRINCL);
2885#endif
2886#ifdef IP_TOS
2887 insint(d, "IP_TOS", IP_TOS);
2888#endif
2889#ifdef IP_TTL
2890 insint(d, "IP_TTL", IP_TTL);
2891#endif
2892#ifdef IP_RECVOPTS
2893 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2894#endif
2895#ifdef IP_RECVRETOPTS
2896 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2897#endif
2898#ifdef IP_RECVDSTADDR
2899 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2900#endif
2901#ifdef IP_RETOPTS
2902 insint(d, "IP_RETOPTS", IP_RETOPTS);
2903#endif
2904#ifdef IP_MULTICAST_IF
2905 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2906#endif
2907#ifdef IP_MULTICAST_TTL
2908 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2909#endif
2910#ifdef IP_MULTICAST_LOOP
2911 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2912#endif
2913#ifdef IP_ADD_MEMBERSHIP
2914 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2915#endif
2916#ifdef IP_DROP_MEMBERSHIP
2917 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2918#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002919#ifdef IP_DEFAULT_MULTICAST_TTL
2920 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
2921#endif
2922#ifdef IP_DEFAULT_MULTICAST_LOOP
2923 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
2924#endif
2925#ifdef IP_MAX_MEMBERSHIPS
2926 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
2927#endif
2928
2929 /* TCP options */
2930#ifdef TCP_NODELAY
2931 insint(d, "TCP_NODELAY", TCP_NODELAY);
2932#endif
2933#ifdef TCP_MAXSEG
2934 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
2935#endif
2936
2937 /* IPX options */
2938#ifdef IPX_TYPE
2939 insint(d, "IPX_TYPE", IPX_TYPE);
2940#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002941
2942 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002943#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002944 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002945#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002946}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00002947
2948/* Simplistic emulation code for inet_pton that only works for IPv4 */
2949#ifndef HAVE_INET_PTON
Martin v. Löwisa2ca1ae2001-06-24 21:35:43 +00002950int
2951inet_pton (int af, char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00002952{
2953 if(af == AF_INET){
2954 long packed_addr;
2955#ifdef USE_GUSI1
2956 packed_addr = (long)inet_addr(src).s_addr;
2957#else
2958 packed_addr = inet_addr(src);
2959#endif
2960 if (packed_addr == INADDR_NONE)
2961 return 0;
2962 memcpy(dst, &packed_addr, 4);
2963 return 1;
2964 }
2965 /* Should set errno to EAFNOSUPPORT */
2966 return -1;
2967}
2968
2969char *
Martin v. Löwisa2ca1ae2001-06-24 21:35:43 +00002970inet_ntop(int af, void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00002971{
2972 if (af == AF_INET) {
2973 struct in_addr packed_addr;
2974 if (size < 16)
2975 /* Should set errno to ENOSPC. */
2976 return NULL;
2977 memcpy(&packed_addr, src, sizeof(packed_addr));
2978 return strncpy(dst, inet_ntoa(packed_addr), size);
2979 }
2980 /* Should set errno to EAFNOSUPPORT */
2981 return NULL;
2982}
2983#endif