blob: ca123ad49dd914df2e8507e5bbb711e0b407f5c6 [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:
40 ("eth0",0x1234). Optional 3rd and 4th elements in the tuple
41 specify packet-type and ha-type -- these are ignored by
42 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 Rossumb6775db1994-08-01 11:34:53 +0000126#include <sys/types.h>
Guido van Rossumed233a51992-06-23 09:07:03 +0000127
Guido van Rossum81194471991-07-27 21:42:02 +0000128#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000129#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000130#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000131#include <sys/socket.h>
132#include <netinet/in.h>
Fred Drake51d90362000-10-06 15:37:06 +0000133#if !(defined(__BEOS__) || defined(__CYGWIN__))
Andrew M. Kuchling52a644c2000-03-31 17:24:30 +0000134#include <netinet/tcp.h>
Fred Drake11b09362000-05-16 13:30:12 +0000135#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000136
Guido van Rossum9376b741999-09-15 22:01:40 +0000137/* Headers needed for inet_ntoa() and inet_addr() */
138#ifdef __BEOS__
139#include <net/netdb.h>
140#else
Guido van Rossumff3ab422000-04-24 15:16:03 +0000141#ifndef USE_GUSI1
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000142#include <arpa/inet.h>
Guido van Rossum9376b741999-09-15 22:01:40 +0000143#endif
Guido van Rossum1b6e4631999-11-04 18:22:29 +0000144#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000145
Guido van Rossume4485b01994-09-07 14:32:49 +0000146#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000147#else
148#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000149#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000150#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000151#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000152#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000153#else
154#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000155#endif
156
Jeremy Hylton22308652001-02-02 03:23:09 +0000157#if defined(linux) && defined(AF_PACKET)
158#include <sys/ioctl.h>
159#include <net/if.h>
160#include <netpacket/packet.h>
161#endif
162
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000163#ifndef O_NDELAY
164#define O_NDELAY O_NONBLOCK /* For QNX only? */
165#endif
166
Guido van Rossumff3ab422000-04-24 15:16:03 +0000167#ifdef USE_GUSI1
Jack Jansen508537b1996-02-14 15:57:45 +0000168/* fdopen() isn't declared in stdio.h (sigh) */
169#include <GUSI.h>
170#endif
171
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000172#ifdef USE_SSL
Andrew M. Kuchling697a0b02001-01-18 17:41:41 +0000173#include "openssl/rsa.h"
174#include "openssl/crypto.h"
175#include "openssl/x509.h"
176#include "openssl/pem.h"
177#include "openssl/ssl.h"
178#include "openssl/err.h"
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000179#endif /* USE_SSL */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000180
Guido van Rossumbcc20741998-08-04 22:53:56 +0000181#if defined(MS_WINDOWS) || defined(__BEOS__)
182/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000183/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000184#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000185#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000186#endif
187
Fred Drakea04eaad2000-06-30 02:46:07 +0000188/* abstract the socket file descriptor type */
189#ifdef MS_WINDOWS
190typedef SOCKET SOCKET_T;
191# ifdef MS_WIN64
192# define SIZEOF_SOCKET_T 8
193# else
194# define SIZEOF_SOCKET_T 4
195# endif
196#else
197typedef int SOCKET_T;
198# define SIZEOF_SOCKET_T SIZEOF_INT
199#endif
200
201
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000202#if defined(PYOS_OS2)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000203#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000204#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000205#endif
206
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000207#ifndef SOCKETCLOSE
208#define SOCKETCLOSE close
209#endif
210
Guido van Rossum30a685f1991-06-27 15:51:29 +0000211/* Global variable holding the exception type for errors detected
212 by this module (but not argument type or memory errors, etc.). */
213
Guido van Rossum73624e91994-10-10 17:59:00 +0000214static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000215
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000216#ifdef USE_SSL
217static PyObject *SSLErrorObject;
218#endif /* USE_SSL */
219
Guido van Rossum30a685f1991-06-27 15:51:29 +0000220
221/* Convenience function to raise an error according to errno
222 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000223
Guido van Rossum73624e91994-10-10 17:59:00 +0000224static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000225PySocket_Err(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000226{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000227#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000228 int err_no = WSAGetLastError();
229 if (err_no) {
230 static struct { int no; const char *msg; } *msgp, msgs[] = {
231 { WSAEINTR, "Interrupted system call" },
232 { WSAEBADF, "Bad file descriptor" },
233 { WSAEACCES, "Permission denied" },
234 { WSAEFAULT, "Bad address" },
235 { WSAEINVAL, "Invalid argument" },
236 { WSAEMFILE, "Too many open files" },
237 { WSAEWOULDBLOCK,
238 "The socket operation could not complete "
239 "without blocking" },
240 { WSAEINPROGRESS, "Operation now in progress" },
241 { WSAEALREADY, "Operation already in progress" },
242 { WSAENOTSOCK, "Socket operation on non-socket" },
243 { WSAEDESTADDRREQ, "Destination address required" },
244 { WSAEMSGSIZE, "Message too long" },
245 { WSAEPROTOTYPE, "Protocol wrong type for socket" },
246 { WSAENOPROTOOPT, "Protocol not available" },
247 { WSAEPROTONOSUPPORT, "Protocol not supported" },
248 { WSAESOCKTNOSUPPORT, "Socket type not supported" },
249 { WSAEOPNOTSUPP, "Operation not supported" },
250 { WSAEPFNOSUPPORT, "Protocol family not supported" },
251 { WSAEAFNOSUPPORT, "Address family not supported" },
252 { WSAEADDRINUSE, "Address already in use" },
253 { WSAEADDRNOTAVAIL,
254 "Can't assign requested address" },
255 { WSAENETDOWN, "Network is down" },
256 { WSAENETUNREACH, "Network is unreachable" },
257 { WSAENETRESET,
258 "Network dropped connection on reset" },
259 { WSAECONNABORTED,
260 "Software caused connection abort" },
261 { WSAECONNRESET, "Connection reset by peer" },
262 { WSAENOBUFS, "No buffer space available" },
263 { WSAEISCONN, "Socket is already connected" },
264 { WSAENOTCONN, "Socket is not connected" },
265 { WSAESHUTDOWN, "Can't send after socket shutdown" },
266 { WSAETOOMANYREFS,
267 "Too many references: can't splice" },
268 { WSAETIMEDOUT, "Operation timed out" },
269 { WSAECONNREFUSED, "Connection refused" },
270 { WSAELOOP, "Too many levels of symbolic links" },
271 { WSAENAMETOOLONG, "File name too long" },
272 { WSAEHOSTDOWN, "Host is down" },
273 { WSAEHOSTUNREACH, "No route to host" },
274 { WSAENOTEMPTY, "Directory not empty" },
275 { WSAEPROCLIM, "Too many processes" },
276 { WSAEUSERS, "Too many users" },
277 { WSAEDQUOT, "Disc quota exceeded" },
278 { WSAESTALE, "Stale NFS file handle" },
279 { WSAEREMOTE, "Too many levels of remote in path" },
280 { WSASYSNOTREADY,
281 "Network subsystem is unvailable" },
282 { WSAVERNOTSUPPORTED,
283 "WinSock version is not supported" },
284 { WSANOTINITIALISED,
285 "Successful WSAStartup() not yet performed" },
286 { WSAEDISCON, "Graceful shutdown in progress" },
287 /* Resolver errors */
288 { WSAHOST_NOT_FOUND, "No such host is known" },
289 { WSATRY_AGAIN, "Host not found, or server failed" },
290 { WSANO_RECOVERY,
291 "Unexpected server error encountered" },
292 { WSANO_DATA, "Valid name without requested data" },
293 { WSANO_ADDRESS, "No address, look for MX record" },
294 { 0, NULL }
295 };
Guido van Rossum73624e91994-10-10 17:59:00 +0000296 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000297 const char *msg = "winsock error";
298
299 for (msgp = msgs; msgp->msg; msgp++) {
300 if (err_no == msgp->no) {
301 msg = msgp->msg;
302 break;
303 }
304 }
305
306 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000307 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000308 PyErr_SetObject(PySocket_Error, v);
309 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000310 }
311 return NULL;
312 }
313 else
314#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000315
316#if defined(PYOS_OS2)
317 if (sock_errno() != NO_ERROR) {
318 APIRET rc;
319 ULONG msglen;
320 char outbuf[100];
321 int myerrorcode = sock_errno();
322
323 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
324 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
325 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
326 if (rc == NO_ERROR) {
327 PyObject *v;
328
329 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
330 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
331 char *lastc = &outbuf[ strlen(outbuf)-1 ];
332 while (lastc > outbuf && isspace(*lastc))
333 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
334 }
335 v = Py_BuildValue("(is)", myerrorcode, outbuf);
336 if (v != NULL) {
337 PyErr_SetObject(PySocket_Error, v);
338 Py_DECREF(v);
339 }
340 return NULL;
341 }
342 }
343#endif
344
Guido van Rossum73624e91994-10-10 17:59:00 +0000345 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000346}
347
Guido van Rossum30a685f1991-06-27 15:51:29 +0000348
349/* The object holding a socket. It holds some extra information,
350 like the address family, which is used to decode socket address
351 arguments properly. */
352
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000353typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000354 PyObject_HEAD
Fred Drakea04eaad2000-06-30 02:46:07 +0000355 SOCKET_T sock_fd; /* Socket file descriptor */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000356 int sock_family; /* Address family, e.g., AF_INET */
357 int sock_type; /* Socket type, e.g., SOCK_STREAM */
358 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000359 union sock_addr {
360 struct sockaddr_in in;
361#ifdef AF_UNIX
362 struct sockaddr_un un;
363#endif
Jeremy Hylton22308652001-02-02 03:23:09 +0000364#if defined(linux) && defined(AF_PACKET)
365 struct sockaddr_ll ll;
366#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000367 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000368} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000369
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000370#ifdef USE_SSL
Guido van Rossum30a685f1991-06-27 15:51:29 +0000371
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000372typedef struct {
373 PyObject_HEAD
374 PySocketSockObject *Socket; /* Socket on which we're layered */
375 PyObject *x_attr; /* Attributes dictionary */
376 SSL_CTX* ctx;
377 SSL* ssl;
378 X509* server_cert;
379 BIO* sbio;
380 char server[256];
381 char issuer[256];
382
383} SSLObject;
384
385staticforward PyTypeObject SSL_Type;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000386staticforward PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args);
387staticforward PyObject *SSL_SSLread(SSLObject *self, PyObject *args);
388
389#define SSLObject_Check(v) ((v)->ob_type == &SSL_Type)
390
391#endif /* USE_SSL */
392
Guido van Rossum30a685f1991-06-27 15:51:29 +0000393/* A forward reference to the Socktype type object.
394 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000395 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000396 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000397
Guido van Rossum73624e91994-10-10 17:59:00 +0000398staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000399
Guido van Rossum30a685f1991-06-27 15:51:29 +0000400
401/* Create a new socket object.
402 This just creates the object and initializes it.
403 If the creation fails, return NULL and set an exception (implicit
404 in NEWOBJ()). */
405
Guido van Rossum73624e91994-10-10 17:59:00 +0000406static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000407PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000408{
Guido van Rossum73624e91994-10-10 17:59:00 +0000409 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000410 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000411 s = PyObject_New(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000412 if (s != NULL) {
413 s->sock_fd = fd;
414 s->sock_family = family;
415 s->sock_type = type;
416 s->sock_proto = proto;
417 }
418 return s;
419}
420
Guido van Rossum30a685f1991-06-27 15:51:29 +0000421
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000422/* Lock to allow python interpreter to continue, but only allow one
423 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000424#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000425PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000426#endif
427
428
Guido van Rossum30a685f1991-06-27 15:51:29 +0000429/* Convert a string specifying a host name or one of a few symbolic
430 names to a numeric IP address. This usually calls gethostbyname()
431 to do the work; the names "" and "<broadcast>" are special.
432 Return the length (should always be 4 bytes), or negative if
433 an error occurred; then an exception is raised. */
434
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000435static int
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000436setipaddr(char* name, struct sockaddr_in * addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000437{
438 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000439 int d1, d2, d3, d4;
Guido van Rossum955becc1999-03-22 20:14:53 +0000440 int h_length;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000441 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000442#ifdef HAVE_GETHOSTBYNAME_R
443 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000444#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
445 struct hostent_data data;
446#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000447 char buf[1001];
448 int buf_len = (sizeof buf) - 1;
449 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000450#endif
451#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000452 int result;
453#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000454#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000455
Guido van Rossuma376cc51996-12-05 23:43:35 +0000456 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000457 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000458 addr_ret->sin_addr.s_addr = INADDR_ANY;
459 return 4;
460 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000461 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000462 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
463 return 4;
464 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000465 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
466 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
467 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
468 addr_ret->sin_addr.s_addr = htonl(
469 ((long) d1 << 24) | ((long) d2 << 16) |
470 ((long) d3 << 8) | ((long) d4 << 0));
471 return 4;
472 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000473 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000474#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000475#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000476 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &hp, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000477#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000478 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000479#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +0000480 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000481 result = gethostbyname_r(name, &hp_allocated, &data);
482 hp = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000483#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000484#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000485#ifdef USE_GETHOSTBYNAME_LOCK
486 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000487#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000488 hp = gethostbyname(name);
489#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000490 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000491
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000492 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000493#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000494 /* Let's get real error message to return */
495 extern int h_errno;
496 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
497#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000498 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000499#endif
Guido van Rossum3baaa131999-03-22 21:44:51 +0000500#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000501 PyThread_release_lock(gethostbyname_lock);
502#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000503 return -1;
504 }
505 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
Guido van Rossum955becc1999-03-22 20:14:53 +0000506 h_length = hp->h_length;
Guido van Rossum3baaa131999-03-22 21:44:51 +0000507#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000508 PyThread_release_lock(gethostbyname_lock);
509#endif
510 return h_length;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000511}
512
Guido van Rossum30a685f1991-06-27 15:51:29 +0000513
Guido van Rossum30a685f1991-06-27 15:51:29 +0000514/* Create a string object representing an IP address.
515 This is always a string of the form 'dd.dd.dd.dd' (with variable
516 size numbers). */
517
Guido van Rossum73624e91994-10-10 17:59:00 +0000518static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000519makeipaddr(struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000520{
521 long x = ntohl(addr->sin_addr.s_addr);
522 char buf[100];
523 sprintf(buf, "%d.%d.%d.%d",
524 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
525 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000526 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000527}
528
529
530/* Create an object representing the given socket address,
531 suitable for passing it back to bind(), connect() etc.
532 The family field of the sockaddr structure is inspected
533 to determine what kind of address it really is. */
534
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000535/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000536static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000537makesockaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000538{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000539 if (addrlen == 0) {
540 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000541 Py_INCREF(Py_None);
542 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000543 }
544
Guido van Rossumbcc20741998-08-04 22:53:56 +0000545#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000546 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000547 addr->sa_family = AF_INET;
548#endif
549
Guido van Rossum30a685f1991-06-27 15:51:29 +0000550 switch (addr->sa_family) {
551
552 case AF_INET:
553 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000554 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000555 PyObject *addrobj = makeipaddr(a);
556 PyObject *ret = NULL;
557 if (addrobj) {
558 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
559 Py_DECREF(addrobj);
560 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000561 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000562 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000563
Guido van Rossumb6775db1994-08-01 11:34:53 +0000564#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000565 case AF_UNIX:
566 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000567 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000568 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000569 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000570#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000571
Jeremy Hylton22308652001-02-02 03:23:09 +0000572#if defined(linux) && defined(AF_PACKET)
573 case AF_PACKET:
574 {
575 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
576 char *ifname = "";
577 struct ifreq ifr;
578 int s;
579 /* need a socket on which we can do an ioctl to look
580 * up interface name from index, but only if index is
581 * non-zero.
582 */
583 if (a->sll_ifindex
584 && ((s = socket(AF_PACKET, SOCK_RAW, 0)) >= 0)) {
585 ifr.ifr_ifindex = a->sll_ifindex;
586 if (ioctl(s, SIOCGIFNAME, &ifr) == 0)
587 ifname = ifr.ifr_name;
588 close(s);
589 }
590 return Py_BuildValue("shbh", ifname, ntohs(a->sll_protocol),
591 a->sll_pkttype, a->sll_hatype);
592 }
593#endif
594
Guido van Rossum30a685f1991-06-27 15:51:29 +0000595 /* More cases here... */
596
597 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000598 /* If we don't know the address family, don't raise an
599 exception -- return it as a tuple. */
600 return Py_BuildValue("is#",
601 addr->sa_family,
602 addr->sa_data,
603 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000604
Guido van Rossum30a685f1991-06-27 15:51:29 +0000605 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000606}
607
Guido van Rossum30a685f1991-06-27 15:51:29 +0000608
609/* Parse a socket address argument according to the socket object's
610 address family. Return 1 if the address was in the proper format,
611 0 of not. The address is returned through addr_ret, its length
612 through len_ret. */
613
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000614static int
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000615getsockaddrarg(PySocketSockObject *s, PyObject *args, struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000616{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000617 switch (s->sock_family) {
618
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 Rossum3bbc62e1995-01-02 19:30:30 +0000622 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000623 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000624 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000625 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000626 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000627 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000628 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000629 PyErr_SetString(PySocket_Error,
630 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000631 return 0;
632 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000633 addr->sun_family = AF_UNIX;
634 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000635 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000636 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000637 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000638 return 1;
639 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000640#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000641
Guido van Rossum30a685f1991-06-27 15:51:29 +0000642 case AF_INET:
643 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000644 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000645 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000646 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000647 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000648 if (!PyTuple_Check(args)) {
649 PyErr_Format(PyExc_TypeError,
650 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
651 args->ob_type->tp_name);
652 return 0;
653 }
654 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000655 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000656 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000657 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000658 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000659 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000660 *addr_ret = (struct sockaddr *) addr;
661 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000662 return 1;
663 }
664
Jeremy Hylton22308652001-02-02 03:23:09 +0000665#if defined(linux) && defined(AF_PACKET)
666 case AF_PACKET:
667 {
668 struct sockaddr_ll* addr;
669 struct ifreq ifr;
670 char *interfaceName;
671 int protoNumber;
672 int hatype = 0;
673 int pkttype = 0;
674
675 if (!PyArg_ParseTuple(args, "si|ii", &interfaceName,
676 &protoNumber, &pkttype, &hatype))
677 return 0;
678 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
679 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
680 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr))
681 return 0;
682 addr = &(s->sock_addr.ll);
683 addr->sll_family = AF_PACKET;
684 addr->sll_protocol = htons((short)protoNumber);
685 addr->sll_ifindex = ifr.ifr_ifindex;
686 addr->sll_pkttype = pkttype;
687 addr->sll_hatype = hatype;
688 *addr_ret = (struct sockaddr *) addr;
689 *len_ret = sizeof *addr;
690 return 1;
691 }
692#endif
693
694
Guido van Rossum30a685f1991-06-27 15:51:29 +0000695 /* More cases here... */
696
697 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000698 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000699 return 0;
700
701 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000702}
703
Guido van Rossum30a685f1991-06-27 15:51:29 +0000704
Guido van Rossum710e1df1992-06-12 10:39:36 +0000705/* Get the address length according to the socket object's address family.
706 Return 1 if the family is known, 0 otherwise. The length is returned
707 through len_ret. */
708
709static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000710getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000711{
712 switch (s->sock_family) {
713
Guido van Rossumb6775db1994-08-01 11:34:53 +0000714#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000715 case AF_UNIX:
716 {
717 *len_ret = sizeof (struct sockaddr_un);
718 return 1;
719 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000720#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000721
722 case AF_INET:
723 {
724 *len_ret = sizeof (struct sockaddr_in);
725 return 1;
726 }
727
Jeremy Hylton22308652001-02-02 03:23:09 +0000728#if defined(linux) && defined(AF_PACKET)
729 case AF_PACKET:
730 {
731 *len_ret = sizeof (struct sockaddr_ll);
732 return 1;
733 }
734#endif
735
Guido van Rossum710e1df1992-06-12 10:39:36 +0000736 /* More cases here... */
737
738 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000739 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000740 return 0;
741
742 }
743}
744
745
Guido van Rossum30a685f1991-06-27 15:51:29 +0000746/* s.accept() method */
747
Guido van Rossum73624e91994-10-10 17:59:00 +0000748static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000749PySocketSock_accept(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000750{
751 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000752 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000753 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000754 PyObject *sock = NULL;
755 PyObject *addr = NULL;
756 PyObject *res = NULL;
757
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000758 if (!PyArg_ParseTuple(args, ":accept"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000759 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000760 if (!getsockaddrlen(s, &addrlen))
761 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000762 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000763 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000764 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000765#ifdef MS_WINDOWS
766 if (newfd == INVALID_SOCKET)
767#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000768 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000769#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000770 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000771
Guido van Rossum30a685f1991-06-27 15:51:29 +0000772 /* Create the new object with unspecified family,
773 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000774 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000775 s->sock_family,
776 s->sock_type,
777 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000778 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000779 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000780 goto finally;
781 }
782 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
783 goto finally;
784
785 if (!(res = Py_BuildValue("OO", sock, addr)))
786 goto finally;
787
788 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000789 Py_XDECREF(sock);
790 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000791 return res;
792}
793
Guido van Rossum82a5c661998-07-07 20:45:43 +0000794static char accept_doc[] =
795"accept() -> (socket object, address info)\n\
796\n\
797Wait for an incoming connection. Return a new socket representing the\n\
798connection, and the address of the client. For IP sockets, the address\n\
799info is a pair (hostaddr, port).";
800
Guido van Rossum30a685f1991-06-27 15:51:29 +0000801
Guido van Rossume4485b01994-09-07 14:32:49 +0000802/* s.setblocking(1 | 0) method */
803
Guido van Rossum73624e91994-10-10 17:59:00 +0000804static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000805PySocketSock_setblocking(PySocketSockObject *s, PyObject *args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000806{
807 int block;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000808#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000809 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000810#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000811 if (!PyArg_ParseTuple(args, "i:setblocking", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000812 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000813 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000814#ifdef __BEOS__
815 block = !block;
816 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
817 (void *)(&block), sizeof( int ) );
818#else
Guido van Rossum6f489d91996-06-28 20:15:15 +0000819#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000820#ifdef PYOS_OS2
821 block = !block;
822 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
823#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000824 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
825 if (block)
826 delay_flag &= (~O_NDELAY);
827 else
828 delay_flag |= O_NDELAY;
829 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000830#endif /* !PYOS_OS2 */
831#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000832 block = !block;
833 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000834#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000835#endif /* __BEOS__ */
Guido van Rossum73624e91994-10-10 17:59:00 +0000836 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000837
Guido van Rossum73624e91994-10-10 17:59:00 +0000838 Py_INCREF(Py_None);
839 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000840}
Guido van Rossume4485b01994-09-07 14:32:49 +0000841
Guido van Rossum82a5c661998-07-07 20:45:43 +0000842static char setblocking_doc[] =
843"setblocking(flag)\n\
844\n\
845Set the socket to blocking (flag is true) or non-blocking (false).\n\
846This uses the FIONBIO ioctl with the O_NDELAY flag.";
847
Guido van Rossume4485b01994-09-07 14:32:49 +0000848
Guido van Rossumaee08791992-09-08 09:05:33 +0000849/* s.setsockopt() method.
850 With an integer third argument, sets an integer option.
851 With a string third argument, sets an option from a buffer;
852 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000853
Guido van Rossum73624e91994-10-10 17:59:00 +0000854static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000855PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000856{
857 int level;
858 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000859 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000860 char *buf;
861 int buflen;
862 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000863
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000864 if (PyArg_ParseTuple(args, "iii:setsockopt",
865 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000866 buf = (char *) &flag;
867 buflen = sizeof flag;
868 }
869 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000870 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000871 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
872 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000873 return NULL;
874 }
Thomas Wouters334fb892000-07-25 12:56:38 +0000875 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000876 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000877 return PySocket_Err();
878 Py_INCREF(Py_None);
879 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000880}
881
Guido van Rossum82a5c661998-07-07 20:45:43 +0000882static char setsockopt_doc[] =
883"setsockopt(level, option, value)\n\
884\n\
885Set a socket option. See the Unix manual for level and option.\n\
886The value argument can either be an integer or a string.";
887
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000888
Guido van Rossumaee08791992-09-08 09:05:33 +0000889/* s.getsockopt() method.
890 With two arguments, retrieves an integer option.
891 With a third integer argument, retrieves a string buffer of that size;
892 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000893
Guido van Rossum73624e91994-10-10 17:59:00 +0000894static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000895PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000896{
897 int level;
898 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000899 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000900 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000901 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000902
Guido van Rossumbcc20741998-08-04 22:53:56 +0000903#ifdef __BEOS__
904/* We have incomplete socket support. */
905 PyErr_SetString( PySocket_Error, "getsockopt not supported" );
906 return NULL;
907#else
908
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000909 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
910 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +0000911 return NULL;
912
913 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000914 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000915 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000916 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +0000917 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000918 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000919 return PySocket_Err();
920 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000921 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000922 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000923 PyErr_SetString(PySocket_Error,
924 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000925 return NULL;
926 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000927 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000928 if (buf == NULL)
929 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000930 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +0000931 (void *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000932 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000933 Py_DECREF(buf);
934 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000935 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000936 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000937 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000938#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000939}
940
Guido van Rossum82a5c661998-07-07 20:45:43 +0000941static char getsockopt_doc[] =
942"getsockopt(level, option[, buffersize]) -> value\n\
943\n\
944Get a socket option. See the Unix manual for level and option.\n\
945If a nonzero buffersize argument is given, the return value is a\n\
946string of that length; otherwise it is an integer.";
947
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000948
Fred Drake728819a2000-07-01 03:40:12 +0000949/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000950
Guido van Rossum73624e91994-10-10 17:59:00 +0000951static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000952PySocketSock_bind(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000953{
954 struct sockaddr *addr;
955 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000956 int res;
Fred Drake728819a2000-07-01 03:40:12 +0000957 PyObject *addro;
958 if (!PyArg_ParseTuple(args, "O:bind", &addro))
959 return NULL;
960 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000961 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000962 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000963 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000964 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000965 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000966 return PySocket_Err();
967 Py_INCREF(Py_None);
968 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000969}
970
Guido van Rossum82a5c661998-07-07 20:45:43 +0000971static char bind_doc[] =
972"bind(address)\n\
973\n\
974Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +0000975pair (host, port); the host must refer to the local host. For raw packet\n\
976sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +0000977
Guido van Rossum30a685f1991-06-27 15:51:29 +0000978
979/* s.close() method.
980 Set the file descriptor to -1 so operations tried subsequently
981 will surely fail. */
982
Guido van Rossum73624e91994-10-10 17:59:00 +0000983static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000984PySocketSock_close(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000985{
Guido van Rossum20d3fc02000-12-18 22:23:44 +0000986 SOCKET_T fd;
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000987 if (!PyArg_ParseTuple(args, ":close"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000988 return NULL;
Guido van Rossum20d3fc02000-12-18 22:23:44 +0000989 if ((fd = s->sock_fd) != -1) {
990 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +0000991 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +0000992 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +0000993 Py_END_ALLOW_THREADS
994 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000995 Py_INCREF(Py_None);
996 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000997}
998
Guido van Rossum82a5c661998-07-07 20:45:43 +0000999static char close_doc[] =
1000"close()\n\
1001\n\
1002Close the socket. It cannot be used after this call.";
1003
Guido van Rossum30a685f1991-06-27 15:51:29 +00001004
Fred Drake728819a2000-07-01 03:40:12 +00001005/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001006
Guido van Rossum73624e91994-10-10 17:59:00 +00001007static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001008PySocketSock_connect(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001009{
1010 struct sockaddr *addr;
1011 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001012 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001013 PyObject *addro;
1014 if (!PyArg_ParseTuple(args, "O:connect", &addro))
1015 return NULL;
1016 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001017 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001018 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001019 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001020 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001021 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001022 return PySocket_Err();
1023 Py_INCREF(Py_None);
1024 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001025}
1026
Guido van Rossum82a5c661998-07-07 20:45:43 +00001027static char connect_doc[] =
1028"connect(address)\n\
1029\n\
1030Connect the socket to a remote address. For IP sockets, the address\n\
1031is a pair (host, port).";
1032
Guido van Rossum30a685f1991-06-27 15:51:29 +00001033
Fred Drake728819a2000-07-01 03:40:12 +00001034/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001035
1036static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001037PySocketSock_connect_ex(PySocketSockObject *s, PyObject *args)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001038{
1039 struct sockaddr *addr;
1040 int addrlen;
1041 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001042 PyObject *addro;
1043 if (!PyArg_ParseTuple(args, "O:connect_ex", &addro))
1044 return NULL;
1045 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001046 return NULL;
1047 Py_BEGIN_ALLOW_THREADS
1048 res = connect(s->sock_fd, addr, addrlen);
1049 Py_END_ALLOW_THREADS
1050 if (res != 0)
1051 res = errno;
1052 return PyInt_FromLong((long) res);
1053}
1054
Guido van Rossum82a5c661998-07-07 20:45:43 +00001055static char connect_ex_doc[] =
1056"connect_ex(address)\n\
1057\n\
1058This is like connect(address), but returns an error code (the errno value)\n\
1059instead of raising an exception when an error occurs.";
1060
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001061
Guido van Rossumed233a51992-06-23 09:07:03 +00001062/* s.fileno() method */
1063
Guido van Rossum73624e91994-10-10 17:59:00 +00001064static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001065PySocketSock_fileno(PySocketSockObject *s, PyObject *args)
Guido van Rossumed233a51992-06-23 09:07:03 +00001066{
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001067 if (!PyArg_ParseTuple(args, ":fileno"))
Guido van Rossumed233a51992-06-23 09:07:03 +00001068 return NULL;
Fred Drakea04eaad2000-06-30 02:46:07 +00001069#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001070 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001071#else
1072 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1073#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001074}
1075
Guido van Rossum82a5c661998-07-07 20:45:43 +00001076static char fileno_doc[] =
1077"fileno() -> integer\n\
1078\n\
1079Return the integer file descriptor of the socket.";
1080
Guido van Rossumed233a51992-06-23 09:07:03 +00001081
Guido van Rossumbe32c891996-06-20 16:25:29 +00001082#ifndef NO_DUP
1083/* s.dup() method */
1084
1085static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001086PySocketSock_dup(PySocketSockObject *s, PyObject *args)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001087{
Fred Drakea04eaad2000-06-30 02:46:07 +00001088 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001089 PyObject *sock;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001090 if (!PyArg_ParseTuple(args, ":dup"))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001091 return NULL;
1092 newfd = dup(s->sock_fd);
1093 if (newfd < 0)
1094 return PySocket_Err();
1095 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001096 s->sock_family,
1097 s->sock_type,
1098 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001099 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001100 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001101 return sock;
1102}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001103
1104static char dup_doc[] =
1105"dup() -> socket object\n\
1106\n\
1107Return a new socket object connected to the same system resource.";
1108
Guido van Rossumbe32c891996-06-20 16:25:29 +00001109#endif
1110
1111
Guido van Rossumc89705d1992-11-26 08:54:07 +00001112/* s.getsockname() method */
1113
Guido van Rossum73624e91994-10-10 17:59:00 +00001114static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001115PySocketSock_getsockname(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001116{
1117 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001118 int res;
1119 socklen_t addrlen;
1120
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001121 if (!PyArg_ParseTuple(args, ":getsockname"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001122 return NULL;
1123 if (!getsockaddrlen(s, &addrlen))
1124 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001125 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001126 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001127 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001128 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001129 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001130 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001131 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1132}
1133
Guido van Rossum82a5c661998-07-07 20:45:43 +00001134static char getsockname_doc[] =
1135"getsockname() -> address info\n\
1136\n\
1137Return the address of the local endpoint. For IP sockets, the address\n\
1138info is a pair (hostaddr, port).";
1139
Guido van Rossumc89705d1992-11-26 08:54:07 +00001140
Guido van Rossumb6775db1994-08-01 11:34:53 +00001141#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001142/* s.getpeername() method */
1143
Guido van Rossum73624e91994-10-10 17:59:00 +00001144static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001145PySocketSock_getpeername(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001146{
1147 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001148 int res;
1149 socklen_t addrlen;
1150
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001151 if (!PyArg_ParseTuple(args, ":getpeername"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001152 return NULL;
1153 if (!getsockaddrlen(s, &addrlen))
1154 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001155 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001156 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001157 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001158 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001159 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001160 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1161}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001162
1163static char getpeername_doc[] =
1164"getpeername() -> address info\n\
1165\n\
1166Return the address of the remote endpoint. For IP sockets, the address\n\
1167info is a pair (hostaddr, port).";
1168
Guido van Rossumb6775db1994-08-01 11:34:53 +00001169#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001170
1171
Guido van Rossum30a685f1991-06-27 15:51:29 +00001172/* s.listen(n) method */
1173
Guido van Rossum73624e91994-10-10 17:59:00 +00001174static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001175PySocketSock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001176{
1177 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001178 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001179 if (!PyArg_ParseTuple(args, "i:listen", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001180 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001181 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001182 if (backlog < 1)
1183 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001184 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001185 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001186 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001187 return PySocket_Err();
1188 Py_INCREF(Py_None);
1189 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001190}
1191
Guido van Rossum82a5c661998-07-07 20:45:43 +00001192static char listen_doc[] =
1193"listen(backlog)\n\
1194\n\
1195Enable a server to accept connections. The backlog argument must be at\n\
1196least 1; it specifies the number of unaccepted connection that the system\n\
1197will allow before refusing new connections.";
1198
1199
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001200#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001201/* s.makefile(mode) method.
1202 Create a new open file object referring to a dupped version of
1203 the socket's file descriptor. (The dup() call is necessary so
1204 that the open file and socket objects may be closed independent
1205 of each other.)
1206 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1207
Guido van Rossum73624e91994-10-10 17:59:00 +00001208static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001209PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001210{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001211 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001212 char *mode = "r";
1213 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001214#ifdef MS_WIN32
1215 intptr_t fd;
1216#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001217 int fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001218#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001219 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001220 PyObject *f;
1221
Guido van Rossum43713e52000-02-29 13:59:29 +00001222 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001223 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001224#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001225 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1226 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001227#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001228 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001229#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001230 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001231 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001232 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001233 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001234 }
1235 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1236 if (f != NULL)
1237 PyFile_SetBufSize(f, bufsize);
1238 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001239}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001240
1241static char makefile_doc[] =
1242"makefile([mode[, buffersize]]) -> file object\n\
1243\n\
1244Return a regular file object corresponding to the socket.\n\
1245The mode and buffersize arguments are as for the built-in open() function.";
1246
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001247#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001248
Guido van Rossum82a5c661998-07-07 20:45:43 +00001249
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001250/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001251
Guido van Rossum73624e91994-10-10 17:59:00 +00001252static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001253PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001254{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001255 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001256 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001257 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001258 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001259 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001260 if (buf == NULL)
1261 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001262 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001263 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001264 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001265 if (n < 0) {
1266 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001267 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001268 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001269 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001270 return NULL;
1271 return buf;
1272}
1273
Guido van Rossum82a5c661998-07-07 20:45:43 +00001274static char recv_doc[] =
1275"recv(buffersize[, flags]) -> data\n\
1276\n\
1277Receive up to buffersize bytes from the socket. For the optional flags\n\
1278argument, see the Unix manual. When no data is available, block until\n\
1279at least one byte is available or until the remote end is closed. When\n\
1280the remote end is closed and all data is read, return the empty string.";
1281
Guido van Rossum30a685f1991-06-27 15:51:29 +00001282
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001283/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001284
Guido van Rossum73624e91994-10-10 17:59:00 +00001285static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001286PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001287{
1288 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001289 PyObject *buf = NULL;
1290 PyObject *addr = NULL;
1291 PyObject *ret = NULL;
1292
Guido van Rossumff3ab422000-04-24 15:16:03 +00001293 int len, n, flags = 0;
1294 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001295 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001296 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001297 if (!getsockaddrlen(s, &addrlen))
1298 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001299 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001300 if (buf == NULL)
1301 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001302 Py_BEGIN_ALLOW_THREADS
1303 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001304#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001305#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001306 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001307#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001308 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001309#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001310#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001311 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001312#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001313 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001314 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001315 if (n < 0) {
1316 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001317 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001318 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001319 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001320 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00001321
1322 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
1323 goto finally;
1324
Guido van Rossum73624e91994-10-10 17:59:00 +00001325 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001326 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001327 Py_XDECREF(addr);
1328 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001329 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001330}
1331
Guido van Rossum82a5c661998-07-07 20:45:43 +00001332static char recvfrom_doc[] =
1333"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1334\n\
1335Like recv(buffersize, flags) but also return the sender's address info.";
1336
Guido van Rossum30a685f1991-06-27 15:51:29 +00001337
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001338/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001339
Guido van Rossum73624e91994-10-10 17:59:00 +00001340static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001341PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001342{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001343 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001344 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001345 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001346 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001347 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001348 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001349 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001350 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001351 return PySocket_Err();
1352 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001353}
1354
Guido van Rossum82a5c661998-07-07 20:45:43 +00001355static char send_doc[] =
1356"send(data[, flags])\n\
1357\n\
1358Send a data string to the socket. For the optional flags\n\
1359argument, see the Unix manual.";
1360
Guido van Rossum30a685f1991-06-27 15:51:29 +00001361
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001362/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001363
Guido van Rossum73624e91994-10-10 17:59:00 +00001364static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001365PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001366{
Guido van Rossum73624e91994-10-10 17:59:00 +00001367 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001368 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001369 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001370 int addrlen, len, n, flags;
1371 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001372 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001373 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001374 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1375 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001376 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001377 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001378 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001379 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001380 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001381 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001382 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001383 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001384 return PySocket_Err();
1385 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001386}
1387
Guido van Rossum82a5c661998-07-07 20:45:43 +00001388static char sendto_doc[] =
1389"sendto(data[, flags], address)\n\
1390\n\
1391Like send(data, flags) but allows specifying the destination address.\n\
1392For IP sockets, the address is a pair (hostaddr, port).";
1393
Guido van Rossum30a685f1991-06-27 15:51:29 +00001394
1395/* s.shutdown(how) method */
1396
Guido van Rossum73624e91994-10-10 17:59:00 +00001397static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001398PySocketSock_shutdown(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001399{
1400 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001401 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001402 if (!PyArg_ParseTuple(args, "i:shutdown", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001403 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001404 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001405 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001406 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001407 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001408 return PySocket_Err();
1409 Py_INCREF(Py_None);
1410 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001411}
1412
Guido van Rossum82a5c661998-07-07 20:45:43 +00001413static char shutdown_doc[] =
1414"shutdown(flag)\n\
1415\n\
1416Shut down the reading side of the socket (flag == 0), the writing side\n\
1417of the socket (flag == 1), or both ends (flag == 2).";
1418
Guido van Rossum30a685f1991-06-27 15:51:29 +00001419
1420/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001421
Guido van Rossum73624e91994-10-10 17:59:00 +00001422static PyMethodDef PySocketSock_methods[] = {
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001423 {"accept", (PyCFunction)PySocketSock_accept, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001424 accept_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001425 {"bind", (PyCFunction)PySocketSock_bind, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001426 bind_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001427 {"close", (PyCFunction)PySocketSock_close, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001428 close_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001429 {"connect", (PyCFunction)PySocketSock_connect, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001430 connect_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001431 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001432 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001433#ifndef NO_DUP
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001434 {"dup", (PyCFunction)PySocketSock_dup, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001435 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001436#endif
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001437 {"fileno", (PyCFunction)PySocketSock_fileno, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001438 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001439#ifdef HAVE_GETPEERNAME
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001440 {"getpeername", (PyCFunction)PySocketSock_getpeername, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001441 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001442#endif
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001443 {"getsockname", (PyCFunction)PySocketSock_getsockname, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001444 getsockname_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001445 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001446 getsockopt_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001447 {"listen", (PyCFunction)PySocketSock_listen, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001448 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001449#ifndef NO_DUP
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001450 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001451 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001452#endif
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001453 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001454 recv_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001455 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001456 recvfrom_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001457 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001458 send_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001459 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001460 sendto_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001461 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001462 setblocking_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001463 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001464 setsockopt_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00001465 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_VARARGS,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001466 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001467 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001468};
1469
Guido van Rossum30a685f1991-06-27 15:51:29 +00001470
Guido van Rossum73624e91994-10-10 17:59:00 +00001471/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001472 First close the file description. */
1473
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001474static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001475PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001476{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001477 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001478 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001479 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001480}
1481
Guido van Rossum30a685f1991-06-27 15:51:29 +00001482
1483/* Return a socket object's named attribute. */
1484
Guido van Rossum73624e91994-10-10 17:59:00 +00001485static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001486PySocketSock_getattr(PySocketSockObject *s, char *name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001487{
Guido van Rossum73624e91994-10-10 17:59:00 +00001488 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001489}
1490
Guido van Rossum30a685f1991-06-27 15:51:29 +00001491
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001492static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001493PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001494{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001495 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001496#if SIZEOF_SOCKET_T > SIZEOF_LONG
1497 if (s->sock_fd > LONG_MAX) {
1498 /* this can occur on Win64, and actually there is a special
1499 ugly printf formatter for decimal pointer length integer
1500 printing, only bother if necessary*/
1501 PyErr_SetString(PyExc_OverflowError,
1502 "no printf formatter to display the socket descriptor in decimal");
1503 return NULL;
1504 }
1505#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001506 sprintf(buf,
Fred Drakea04eaad2000-06-30 02:46:07 +00001507 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
1508 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001509 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001510}
1511
1512
Guido van Rossumb6775db1994-08-01 11:34:53 +00001513/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001514
Guido van Rossum73624e91994-10-10 17:59:00 +00001515static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001516 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001517 0,
1518 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001519 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001520 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001521 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001522 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001523 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001524 0, /*tp_setattr*/
1525 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001526 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001527 0, /*tp_as_number*/
1528 0, /*tp_as_sequence*/
1529 0, /*tp_as_mapping*/
1530};
1531
Guido van Rossum30a685f1991-06-27 15:51:29 +00001532
Guido van Rossum81194471991-07-27 21:42:02 +00001533/* Python interface to gethostname(). */
1534
1535/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001536static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001537PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001538{
1539 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001540 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001541 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001542 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001543 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001544 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001545 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001546 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001547 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001548 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001549 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001550}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001551
Guido van Rossum82a5c661998-07-07 20:45:43 +00001552static char gethostname_doc[] =
1553"gethostname() -> string\n\
1554\n\
1555Return the current host name.";
1556
Guido van Rossumff4949e1992-08-05 19:58:53 +00001557
Guido van Rossum30a685f1991-06-27 15:51:29 +00001558/* Python interface to gethostbyname(name). */
1559
1560/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001561static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001562PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001563{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001564 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001565 struct sockaddr_in addrbuf;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001566 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001567 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001568 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001569 return NULL;
1570 return makeipaddr(&addrbuf);
1571}
1572
Guido van Rossum82a5c661998-07-07 20:45:43 +00001573static char gethostbyname_doc[] =
1574"gethostbyname(host) -> address\n\
1575\n\
1576Return the IP address (a string of the form '255.255.255.255') for a host.";
1577
1578
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001579/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1580
1581static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001582gethost_common(struct hostent *h, struct sockaddr_in *addr)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001583{
1584 char **pch;
1585 PyObject *rtn_tuple = (PyObject *)NULL;
1586 PyObject *name_list = (PyObject *)NULL;
1587 PyObject *addr_list = (PyObject *)NULL;
1588 PyObject *tmp;
1589 if (h == NULL) {
1590#ifdef HAVE_HSTRERROR
1591 /* Let's get real error message to return */
1592 extern int h_errno;
1593 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1594#else
1595 PyErr_SetString(PySocket_Error, "host not found");
1596#endif
1597 return NULL;
1598 }
1599 if ((name_list = PyList_New(0)) == NULL)
1600 goto err;
1601 if ((addr_list = PyList_New(0)) == NULL)
1602 goto err;
1603 for (pch = h->h_aliases; *pch != NULL; pch++) {
1604 int status;
1605 tmp = PyString_FromString(*pch);
1606 if (tmp == NULL)
1607 goto err;
1608 status = PyList_Append(name_list, tmp);
1609 Py_DECREF(tmp);
1610 if (status)
1611 goto err;
1612 }
1613 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1614 int status;
1615 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1616 tmp = makeipaddr(addr);
1617 if (tmp == NULL)
1618 goto err;
1619 status = PyList_Append(addr_list, tmp);
1620 Py_DECREF(tmp);
1621 if (status)
1622 goto err;
1623 }
1624 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1625 err:
1626 Py_XDECREF(name_list);
1627 Py_XDECREF(addr_list);
1628 return rtn_tuple;
1629}
1630
1631
1632/* Python interface to gethostbyname_ex(name). */
1633
1634/*ARGSUSED*/
1635static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001636PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001637{
1638 char *name;
1639 struct hostent *h;
1640 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001641 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001642#ifdef HAVE_GETHOSTBYNAME_R
1643 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001644#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1645 struct hostent_data data;
1646#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001647 char buf[16384];
1648 int buf_len = (sizeof buf) - 1;
1649 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001650#endif
1651#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001652 int result;
1653#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001654#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001655 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001656 return NULL;
1657 if (setipaddr(name, &addr) < 0)
1658 return NULL;
1659 Py_BEGIN_ALLOW_THREADS
1660#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001661#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001662 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001663#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001664 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001665#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001666 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001667 result = gethostbyname_r(name, &hp_allocated, &data);
1668 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001669#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001670#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001671#ifdef USE_GETHOSTBYNAME_LOCK
1672 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001673#endif
1674 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001675#endif /* HAVE_GETHOSTBYNAME_R */
1676 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001677 ret = gethost_common(h, &addr);
1678#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001679 PyThread_release_lock(gethostbyname_lock);
1680#endif
1681 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001682}
1683
1684static char ghbn_ex_doc[] =
1685"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1686\n\
1687Return the true host name, a list of aliases, and a list of IP addresses,\n\
1688for a host. The host argument is a string giving a host name or IP number.";
1689
1690
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001691/* Python interface to gethostbyaddr(IP). */
1692
1693/*ARGSUSED*/
1694static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001695PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001696{
1697 struct sockaddr_in addr;
1698 char *ip_num;
1699 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001700 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001701#ifdef HAVE_GETHOSTBYNAME_R
1702 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001703#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1704 struct hostent_data data;
1705#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001706 char buf[16384];
1707 int buf_len = (sizeof buf) - 1;
1708 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001709#endif
1710#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001711 int result;
1712#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001713#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001714
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001715 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001716 return NULL;
1717 if (setipaddr(ip_num, &addr) < 0)
1718 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001719 Py_BEGIN_ALLOW_THREADS
1720#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001721#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001722 result = gethostbyaddr_r((char *)&addr.sin_addr,
1723 sizeof(addr.sin_addr),
1724 AF_INET, &hp_allocated, buf, buf_len,
1725 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001726#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001727 h = gethostbyaddr_r((char *)&addr.sin_addr,
1728 sizeof(addr.sin_addr),
1729 AF_INET,
1730 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001731#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001732 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001733 result = gethostbyaddr_r((char *)&addr.sin_addr,
1734 sizeof(addr.sin_addr),
1735 AF_INET, &hp_allocated, &data);
1736 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001737#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001738#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001739#ifdef USE_GETHOSTBYNAME_LOCK
1740 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001741#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001742 h = gethostbyaddr((char *)&addr.sin_addr,
1743 sizeof(addr.sin_addr),
1744 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001745#endif /* HAVE_GETHOSTBYNAME_R */
1746 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001747 ret = gethost_common(h, &addr);
1748#ifdef USE_GETHOSTBYNAME_LOCK
1749 PyThread_release_lock(gethostbyname_lock);
1750#endif
1751 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001752}
1753
Guido van Rossum82a5c661998-07-07 20:45:43 +00001754static char gethostbyaddr_doc[] =
1755"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1756\n\
1757Return the true host name, a list of aliases, and a list of IP addresses,\n\
1758for a host. The host argument is a string giving a host name or IP number.";
1759
Guido van Rossum30a685f1991-06-27 15:51:29 +00001760
1761/* Python interface to getservbyname(name).
1762 This only returns the port number, since the other info is already
1763 known or not useful (like the list of aliases). */
1764
1765/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001766static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001767PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001768{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001769 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001770 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001771 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001772 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001773 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001774 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001775 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001776 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001777 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001778 return NULL;
1779 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001780 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001781}
1782
Guido van Rossum82a5c661998-07-07 20:45:43 +00001783static char getservbyname_doc[] =
1784"getservbyname(servicename, protocolname) -> integer\n\
1785\n\
1786Return a port number from a service name and protocol name.\n\
1787The protocol name should be 'tcp' or 'udp'.";
1788
Guido van Rossum30a685f1991-06-27 15:51:29 +00001789
Guido van Rossum3901d851996-12-19 16:35:04 +00001790/* Python interface to getprotobyname(name).
1791 This only returns the protocol number, since the other info is
1792 already known or not useful (like the list of aliases). */
1793
1794/*ARGSUSED*/
1795static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001796PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00001797{
1798 char *name;
1799 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001800#ifdef __BEOS__
1801/* Not available in BeOS yet. - [cjh] */
1802 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1803 return NULL;
1804#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001805 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00001806 return NULL;
1807 Py_BEGIN_ALLOW_THREADS
1808 sp = getprotobyname(name);
1809 Py_END_ALLOW_THREADS
1810 if (sp == NULL) {
1811 PyErr_SetString(PySocket_Error, "protocol not found");
1812 return NULL;
1813 }
1814 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001815#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001816}
1817
Guido van Rossum82a5c661998-07-07 20:45:43 +00001818static char getprotobyname_doc[] =
1819"getprotobyname(name) -> integer\n\
1820\n\
1821Return the protocol number for the named protocol. (Rarely used.)";
1822
Guido van Rossum3901d851996-12-19 16:35:04 +00001823
Guido van Rossum30a685f1991-06-27 15:51:29 +00001824/* Python interface to socket(family, type, proto).
1825 The third (protocol) argument is optional.
1826 Return a new socket object. */
1827
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001828/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001829static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001830PySocket_socket(PyObject *self, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001831{
Guido van Rossum73624e91994-10-10 17:59:00 +00001832 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001833 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001834 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001835 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001836 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001837 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001838 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001839 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001840#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001841 if (fd == INVALID_SOCKET)
1842#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001843 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001844#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001845 return PySocket_Err();
1846 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001847 /* If the object can't be created, don't forget to close the
1848 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001849 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001850 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001851 /* From now on, ignore SIGPIPE and let the error checking
1852 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001853#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001854 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001855#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001856 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001857}
1858
Guido van Rossum82a5c661998-07-07 20:45:43 +00001859static char socket_doc[] =
1860"socket(family, type[, proto]) -> socket object\n\
1861\n\
1862Open a socket of the given type. The family argument specifies the\n\
1863address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1864The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1865or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1866specifying the default protocol.";
1867
1868
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001869#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001870/* Create a socket object from a numeric file description.
1871 Useful e.g. if stdin is a socket.
1872 Additional arguments as for socket(). */
1873
1874/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001875static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001876PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001877{
Guido van Rossum73624e91994-10-10 17:59:00 +00001878 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001879 SOCKET_T fd;
1880 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001881 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
1882 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001883 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001884 /* Dup the fd so it and the socket can be closed independently */
1885 fd = dup(fd);
1886 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001887 return PySocket_Err();
1888 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001889 /* From now on, ignore SIGPIPE and let the error checking
1890 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001891#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001892 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001893#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001894 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001895}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001896
1897static char fromfd_doc[] =
1898"fromfd(fd, family, type[, proto]) -> socket object\n\
1899\n\
1900Create a socket object from the given file descriptor.\n\
1901The remaining arguments are the same as for socket().";
1902
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001903#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001904
Guido van Rossum82a5c661998-07-07 20:45:43 +00001905
Guido van Rossum006bf911996-06-12 04:04:55 +00001906static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001907PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001908{
1909 int x1, x2;
1910
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001911 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001912 return NULL;
1913 }
1914 x2 = (int)ntohs((short)x1);
1915 return PyInt_FromLong(x2);
1916}
1917
Guido van Rossum82a5c661998-07-07 20:45:43 +00001918static char ntohs_doc[] =
1919"ntohs(integer) -> integer\n\
1920\n\
1921Convert a 16-bit integer from network to host byte order.";
1922
1923
Guido van Rossum006bf911996-06-12 04:04:55 +00001924static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001925PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001926{
1927 int x1, x2;
1928
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001929 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001930 return NULL;
1931 }
1932 x2 = ntohl(x1);
1933 return PyInt_FromLong(x2);
1934}
1935
Guido van Rossum82a5c661998-07-07 20:45:43 +00001936static char ntohl_doc[] =
1937"ntohl(integer) -> integer\n\
1938\n\
1939Convert a 32-bit integer from network to host byte order.";
1940
1941
Guido van Rossum006bf911996-06-12 04:04:55 +00001942static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001943PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001944{
1945 int x1, x2;
1946
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001947 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001948 return NULL;
1949 }
1950 x2 = (int)htons((short)x1);
1951 return PyInt_FromLong(x2);
1952}
1953
Guido van Rossum82a5c661998-07-07 20:45:43 +00001954static char htons_doc[] =
1955"htons(integer) -> integer\n\
1956\n\
1957Convert a 16-bit integer from host to network byte order.";
1958
1959
Guido van Rossum006bf911996-06-12 04:04:55 +00001960static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001961PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001962{
1963 int x1, x2;
1964
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001965 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001966 return NULL;
1967 }
1968 x2 = htonl(x1);
1969 return PyInt_FromLong(x2);
1970}
1971
Guido van Rossum82a5c661998-07-07 20:45:43 +00001972static char htonl_doc[] =
1973"htonl(integer) -> integer\n\
1974\n\
1975Convert a 32-bit integer from host to network byte order.";
1976
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001977/*
1978 * socket.inet_aton() and socket.inet_ntoa() functions
1979 *
1980 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
1981 *
1982 */
1983
1984static char inet_aton_doc[] =
1985"inet_aton(string) -> packed 32-bit IP representation\n\
1986\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001987Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001988binary format used in low-level network functions.";
1989
1990static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001991PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001992{
Guido van Rossuma2e48551999-09-09 15:42:59 +00001993#ifndef INADDR_NONE
1994#define INADDR_NONE (-1)
1995#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001996
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001997 /* Have to use inet_addr() instead */
1998 char *ip_addr;
1999 long packed_addr;
2000
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002001 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002002 return NULL;
2003 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00002004#ifdef USE_GUSI1
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002005 packed_addr = (long)inet_addr(ip_addr).s_addr;
2006#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002007 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002008#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002009
2010 if (packed_addr == INADDR_NONE) { /* invalid address */
2011 PyErr_SetString(PySocket_Error,
2012 "illegal IP address string passed to inet_aton");
2013 return NULL;
2014 }
2015
2016 return PyString_FromStringAndSize((char *) &packed_addr,
2017 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002018}
2019
2020static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002021"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002022\n\
2023Convert an IP address from 32-bit packed binary format to string format";
2024
2025static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002026PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002027{
2028 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002029 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002030 struct in_addr packed_addr;
2031
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002032 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002033 return NULL;
2034 }
2035
2036 if (addr_len != sizeof(packed_addr)) {
2037 PyErr_SetString(PySocket_Error,
2038 "packed IP wrong length for inet_ntoa");
2039 return NULL;
2040 }
2041
2042 memcpy(&packed_addr, packed_str, addr_len);
2043
2044 return PyString_FromString(inet_ntoa(packed_addr));
2045}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002046
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002047
2048#ifdef USE_SSL
2049
2050/* This is a C function to be called for new object initialization */
2051static SSLObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002052newSSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002053{
2054 SSLObject *self;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002055
Guido van Rossumb18618d2000-05-03 23:44:39 +00002056 self = PyObject_New(SSLObject, &SSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002057 if (self == NULL){
2058 PyErr_SetObject(SSLErrorObject,
2059 PyString_FromString("newSSLObject error"));
2060 return NULL;
2061 }
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002062 memset(self->server, '\0', sizeof(char) * 256);
2063 memset(self->issuer, '\0', sizeof(char) * 256);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002064
2065 self->x_attr = PyDict_New();
2066 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
2067 if (self->ctx == NULL) {
2068 PyErr_SetObject(SSLErrorObject,
2069 PyString_FromString("SSL_CTX_new error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002070 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002071 return NULL;
2072 }
2073
2074 if ( (key_file && !cert_file) || (!key_file && cert_file) )
2075 {
2076 PyErr_SetObject(SSLErrorObject,
2077 PyString_FromString(
2078 "Both the key & certificate files must be specified"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002079 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002080 return NULL;
2081 }
2082
2083 if (key_file && cert_file)
2084 {
2085 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
2086 SSL_FILETYPE_PEM) < 1)
2087 {
2088 PyErr_SetObject(SSLErrorObject,
2089 PyString_FromString(
2090 "SSL_CTX_use_PrivateKey_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002091 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002092 return NULL;
2093 }
2094
2095 if (SSL_CTX_use_certificate_chain_file(self->ctx,
2096 cert_file) < 1)
2097 {
2098 PyErr_SetObject(SSLErrorObject,
2099 PyString_FromString(
2100 "SSL_CTX_use_certificate_chain_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002101 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002102 return NULL;
2103 }
2104 }
2105
2106 SSL_CTX_set_verify(self->ctx,
2107 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2108 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2109 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2110 SSL_set_connect_state(self->ssl);
2111
2112 if ((SSL_connect(self->ssl)) == -1) {
2113 /* Actually negotiate SSL connection */
2114 PyErr_SetObject(SSLErrorObject,
2115 PyString_FromString("SSL_connect error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002116 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002117 return NULL;
2118 }
2119 self->ssl->debug = 1;
2120
2121 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2122 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
2123 self->server, 256);
2124 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2125 self->issuer, 256);
2126 }
2127 self->x_attr = NULL;
2128 self->Socket = Sock;
2129 Py_INCREF(self->Socket);
2130 return self;
2131}
2132
2133/* This is the Python function called for new object initialization */
2134static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002135PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002136{
2137 SSLObject *rv;
2138 PySocketSockObject *Sock;
2139 char *key_file;
2140 char *cert_file;
2141
Guido van Rossum43713e52000-02-29 13:59:29 +00002142 if (!PyArg_ParseTuple(args, "O!zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002143 &PySocketSock_Type, (PyObject*)&Sock,
2144 &key_file, &cert_file) )
2145 return NULL;
2146
2147 rv = newSSLObject(Sock, key_file, cert_file);
2148 if ( rv == NULL )
2149 return NULL;
2150 return (PyObject *)rv;
2151}
2152
2153static char ssl_doc[] =
2154"ssl(socket, keyfile, certfile) -> sslobject";
2155
2156static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002157SSL_server(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002158{
2159 return PyString_FromString(self->server);
2160}
2161
2162static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002163SSL_issuer(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002164{
2165 return PyString_FromString(self->issuer);
2166}
2167
2168
2169/* SSL object methods */
2170
2171static PyMethodDef SSLMethods[] = {
2172 { "write", (PyCFunction)SSL_SSLwrite, 1 },
2173 { "read", (PyCFunction)SSL_SSLread, 1 },
2174 { "server", (PyCFunction)SSL_server, 1 },
2175 { "issuer", (PyCFunction)SSL_issuer, 1 },
2176 { NULL, NULL}
2177};
2178
2179static void SSL_dealloc(SSLObject *self)
2180{
2181 if (self->server_cert) /* Possible not to have one? */
2182 X509_free (self->server_cert);
2183 SSL_CTX_free(self->ctx);
2184 SSL_free(self->ssl);
2185 Py_XDECREF(self->x_attr);
2186 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002187 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002188}
2189
2190static PyObject *SSL_getattr(SSLObject *self, char *name)
2191{
2192 return Py_FindMethod(SSLMethods, (PyObject *)self, name);
2193}
2194
2195staticforward PyTypeObject SSL_Type = {
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002196 PyObject_HEAD_INIT(NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002197 0, /*ob_size*/
2198 "SSL", /*tp_name*/
2199 sizeof(SSLObject), /*tp_basicsize*/
2200 0, /*tp_itemsize*/
2201 /* methods */
2202 (destructor)SSL_dealloc, /*tp_dealloc*/
2203 0, /*tp_print*/
2204 (getattrfunc)SSL_getattr, /*tp_getattr*/
2205 0, /*tp_setattr*/
2206 0, /*tp_compare*/
2207 0, /*tp_repr*/
2208 0, /*tp_as_number*/
2209 0, /*tp_as_sequence*/
2210 0, /*tp_as_mapping*/
2211 0, /*tp_hash*/
2212};
2213
2214
2215
2216static PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args)
2217{
2218 char *data;
Fred Drakea04eaad2000-06-30 02:46:07 +00002219 size_t len = 0;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002220
Guido van Rossum43713e52000-02-29 13:59:29 +00002221 if (!PyArg_ParseTuple(args, "s|i:write", &data, &len))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002222 return NULL;
2223
2224 if (!len)
2225 len = strlen(data);
2226
2227 len = SSL_write(self->ssl, data, len);
2228 return PyInt_FromLong((long)len);
2229}
2230
2231static PyObject *SSL_SSLread(SSLObject *self, PyObject *args)
2232{
2233 PyObject *buf;
2234 int count = 0;
2235 int len = 1024;
2236 int res;
2237
Guido van Rossum43713e52000-02-29 13:59:29 +00002238 PyArg_ParseTuple(args, "|i:read", &len);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002239
2240 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2241 return NULL; /* Error object should already be set */
2242
2243 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2244 res = SSL_get_error(self->ssl, count);
2245
2246 switch (res) {
Jeremy Hylton42dd01a2001-02-01 23:35:20 +00002247 case SSL_ERROR_NONE:
2248 assert(count > 0);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002249 break;
Jeremy Hylton42dd01a2001-02-01 23:35:20 +00002250 case SSL_ERROR_ZERO_RETURN: /* normal EOF */
2251 assert(count == 0);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002252 break;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002253 default:
2254 return PyErr_SetFromErrno(SSLErrorObject);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002255 }
2256
2257 fflush(stderr);
2258
2259 if (count < 0) {
2260 Py_DECREF(buf);
2261 return PyErr_SetFromErrno(SSLErrorObject);
2262 }
2263
2264 if (count != len && _PyString_Resize(&buf, count) < 0)
2265 return NULL;
2266 return buf;
2267}
2268
2269#endif /* USE_SSL */
2270
2271
Guido van Rossum30a685f1991-06-27 15:51:29 +00002272/* List of functions exported by this module. */
2273
Guido van Rossum73624e91994-10-10 17:59:00 +00002274static PyMethodDef PySocket_methods[] = {
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002275 {"gethostbyname", PySocket_gethostbyname,
2276 METH_VARARGS, gethostbyname_doc},
2277 {"gethostbyname_ex", PySocket_gethostbyname_ex,
2278 METH_VARARGS, ghbn_ex_doc},
2279 {"gethostbyaddr", PySocket_gethostbyaddr,
2280 METH_VARARGS, gethostbyaddr_doc},
2281 {"gethostname", PySocket_gethostname,
2282 METH_VARARGS, gethostname_doc},
2283 {"getservbyname", PySocket_getservbyname,
2284 METH_VARARGS, getservbyname_doc},
2285 {"getprotobyname", PySocket_getprotobyname,
2286 METH_VARARGS,getprotobyname_doc},
2287 {"socket", PySocket_socket,
2288 METH_VARARGS, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002289#ifndef NO_DUP
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002290 {"fromfd", PySocket_fromfd,
2291 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002292#endif
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002293 {"ntohs", PySocket_ntohs,
2294 METH_VARARGS, ntohs_doc},
2295 {"ntohl", PySocket_ntohl,
2296 METH_VARARGS, ntohl_doc},
2297 {"htons", PySocket_htons,
2298 METH_VARARGS, htons_doc},
2299 {"htonl", PySocket_htonl,
2300 METH_VARARGS, htonl_doc},
2301 {"inet_aton", PySocket_inet_aton,
2302 METH_VARARGS, inet_aton_doc},
2303 {"inet_ntoa", PySocket_inet_ntoa,
2304 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002305#ifdef USE_SSL
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002306 {"ssl", PySocket_ssl,
2307 METH_VARARGS, ssl_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002308#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002309 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002310};
2311
Guido van Rossum30a685f1991-06-27 15:51:29 +00002312
2313/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002314 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002315 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002316 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002317static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002318insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002319{
Guido van Rossum73624e91994-10-10 17:59:00 +00002320 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002321 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002322 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002323
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002324 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002325}
2326
Guido van Rossum30a685f1991-06-27 15:51:29 +00002327
Guido van Rossum8d665e61996-06-26 18:22:49 +00002328#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002329
2330/* Additional initialization and cleanup for NT/Windows */
2331
2332static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002333NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002334{
2335 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002336}
2337
2338static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002339NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002340{
2341 WSADATA WSAData;
2342 int ret;
2343 char buf[100];
2344 ret = WSAStartup(0x0101, &WSAData);
2345 switch (ret) {
2346 case 0: /* no error */
2347 atexit(NTcleanup);
2348 return 1;
2349 case WSASYSNOTREADY:
2350 PyErr_SetString(PyExc_ImportError,
2351 "WSAStartup failed: network not ready");
2352 break;
2353 case WSAVERNOTSUPPORTED:
2354 case WSAEINVAL:
2355 PyErr_SetString(PyExc_ImportError,
2356 "WSAStartup failed: requested version not supported");
2357 break;
2358 default:
2359 sprintf(buf, "WSAStartup failed: error code %d", ret);
2360 PyErr_SetString(PyExc_ImportError, buf);
2361 break;
2362 }
2363 return 0;
2364}
2365
Guido van Rossum8d665e61996-06-26 18:22:49 +00002366#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002367
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002368#if defined(PYOS_OS2)
2369
2370/* Additional initialization and cleanup for OS/2 */
2371
2372static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002373OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002374{
2375 /* No cleanup is necessary for OS/2 Sockets */
2376}
2377
2378static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002379OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002380{
2381 char reason[64];
2382 int rc = sock_init();
2383
2384 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002385 atexit(OS2cleanup);
2386 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002387 }
2388
2389 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2390 PyErr_SetString(PyExc_ImportError, reason);
2391
Guido van Rossum32c575d1997-12-02 20:37:32 +00002392 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002393}
2394
2395#endif /* PYOS_OS2 */
2396
Guido van Rossum30a685f1991-06-27 15:51:29 +00002397/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002398 * This is called when the first 'import socket' is done,
2399 * via a table in config.c, if config.c is compiled with USE_SOCKET
2400 * defined.
2401 *
2402 * For MS_WINDOWS (which means any Windows variant), this module
2403 * is actually called "_socket", and there's a wrapper "socket.py"
2404 * which implements some missing functionality (such as makefile(),
2405 * dup() and fromfd()). The import of "_socket" may fail with an
2406 * ImportError exception if initialization of WINSOCK fails. When
2407 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2408 * scheduled to be made at exit time.
2409 *
2410 * For OS/2, this module is also called "_socket" and uses a wrapper
2411 * "socket.py" which implements that functionality that is missing
2412 * when PC operating systems don't put socket descriptors in the
2413 * operating system's filesystem layer.
2414 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002415
Guido van Rossum82a5c661998-07-07 20:45:43 +00002416static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00002417"Implementation module for socket operations. See the socket module\n\
2418for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00002419
2420static char sockettype_doc[] =
2421"A socket represents one endpoint of a network connection.\n\
2422\n\
2423Methods:\n\
2424\n\
2425accept() -- accept a connection, returning new socket and client address\n\
2426bind() -- bind the socket to a local address\n\
2427close() -- close the socket\n\
2428connect() -- connect the socket to a remote address\n\
2429connect_ex() -- connect, return an error code instead of an exception \n\
2430dup() -- return a new socket object identical to the current one (*)\n\
2431fileno() -- return underlying file descriptor\n\
2432getpeername() -- return remote address (*)\n\
2433getsockname() -- return local address\n\
2434getsockopt() -- get socket options\n\
2435listen() -- start listening for incoming connections\n\
2436makefile() -- return a file object corresponding tot the socket (*)\n\
2437recv() -- receive data\n\
2438recvfrom() -- receive data and sender's address\n\
2439send() -- send data\n\
2440sendto() -- send data to a given address\n\
2441setblocking() -- set or clear the blocking I/O flag\n\
2442setsockopt() -- set socket options\n\
2443shutdown() -- shut down traffic in one or both directions\n\
2444\n\
2445(*) not available on all platforms!)";
2446
Guido van Rossum3886bb61998-12-04 18:50:17 +00002447DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002448init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002449{
Guido van Rossum73624e91994-10-10 17:59:00 +00002450 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00002451#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002452 if (!NTinit())
2453 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002454#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002455#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002456 if (!OS2init())
2457 return;
Fred Drakea136d492000-08-16 14:18:30 +00002458#endif /* __TOS_OS2__ */
2459#endif /* MS_WINDOWS */
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002460#ifdef USE_SSL
2461 SSL_Type.ob_type = &PyType_Type;
2462#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00002463 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00002464 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002465 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2466 if (PySocket_Error == NULL)
2467 return;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002468#ifdef USE_SSL
2469 SSL_load_error_strings();
2470 SSLeay_add_ssl_algorithms();
2471 SSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2472 if (SSLErrorObject == NULL)
2473 return;
2474 PyDict_SetItemString(d, "sslerror", SSLErrorObject);
2475 Py_INCREF(&SSL_Type);
2476 if (PyDict_SetItemString(d, "SSLType",
2477 (PyObject *)&SSL_Type) != 0)
2478 return;
2479#endif /* USE_SSL */
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002480 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002481 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002482 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002483 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002484 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002485 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002486 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002487
2488 /* Address families (we only support AF_INET and AF_UNIX) */
2489#ifdef AF_UNSPEC
2490 insint(d, "AF_UNSPEC", AF_UNSPEC);
2491#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002492 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002493#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002494 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002495#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002496#ifdef AF_AX25
2497 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2498#endif
2499#ifdef AF_IPX
2500 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2501#endif
2502#ifdef AF_APPLETALK
2503 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2504#endif
2505#ifdef AF_NETROM
2506 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2507#endif
2508#ifdef AF_BRIDGE
2509 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2510#endif
2511#ifdef AF_AAL5
2512 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2513#endif
2514#ifdef AF_X25
2515 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2516#endif
2517#ifdef AF_INET6
2518 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2519#endif
2520#ifdef AF_ROSE
2521 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2522#endif
Jeremy Hylton22308652001-02-02 03:23:09 +00002523#if defined(linux) && defined(AF_PACKET)
2524 insint(d, "AF_PACKET", AF_PACKET);
2525 insint(d, "PF_PACKET", PF_PACKET);
2526 insint(d, "PACKET_HOST", PACKET_HOST);
2527 insint(d, "PACKET_BROADCAST", PACKET_BROADCAST);
2528 insint(d, "PACKET_MULTICAST", PACKET_MULTICAST);
2529 insint(d, "PACKET_OTHERHOST", PACKET_OTHERHOST);
2530 insint(d, "PACKET_OUTGOING", PACKET_OUTGOING);
2531 insint(d, "PACKET_LOOPBACK", PACKET_LOOPBACK);
2532 insint(d, "PACKET_FASTROUTE", PACKET_FASTROUTE);
2533#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002534
2535 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002536 insint(d, "SOCK_STREAM", SOCK_STREAM);
2537 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002538#ifndef __BEOS__
2539/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002540 insint(d, "SOCK_RAW", SOCK_RAW);
2541 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2542 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002543#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002544
2545#ifdef SO_DEBUG
2546 insint(d, "SO_DEBUG", SO_DEBUG);
2547#endif
2548#ifdef SO_ACCEPTCONN
2549 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2550#endif
2551#ifdef SO_REUSEADDR
2552 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2553#endif
2554#ifdef SO_KEEPALIVE
2555 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2556#endif
2557#ifdef SO_DONTROUTE
2558 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2559#endif
2560#ifdef SO_BROADCAST
2561 insint(d, "SO_BROADCAST", SO_BROADCAST);
2562#endif
2563#ifdef SO_USELOOPBACK
2564 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2565#endif
2566#ifdef SO_LINGER
2567 insint(d, "SO_LINGER", SO_LINGER);
2568#endif
2569#ifdef SO_OOBINLINE
2570 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2571#endif
2572#ifdef SO_REUSEPORT
2573 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2574#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002575#ifdef SO_SNDBUF
2576 insint(d, "SO_SNDBUF", SO_SNDBUF);
2577#endif
2578#ifdef SO_RCVBUF
2579 insint(d, "SO_RCVBUF", SO_RCVBUF);
2580#endif
2581#ifdef SO_SNDLOWAT
2582 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2583#endif
2584#ifdef SO_RCVLOWAT
2585 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2586#endif
2587#ifdef SO_SNDTIMEO
2588 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2589#endif
2590#ifdef SO_RCVTIMEO
2591 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2592#endif
2593#ifdef SO_ERROR
2594 insint(d, "SO_ERROR", SO_ERROR);
2595#endif
2596#ifdef SO_TYPE
2597 insint(d, "SO_TYPE", SO_TYPE);
2598#endif
2599
2600 /* Maximum number of connections for "listen" */
2601#ifdef SOMAXCONN
2602 insint(d, "SOMAXCONN", SOMAXCONN);
2603#else
2604 insint(d, "SOMAXCONN", 5); /* Common value */
2605#endif
2606
2607 /* Flags for send, recv */
2608#ifdef MSG_OOB
2609 insint(d, "MSG_OOB", MSG_OOB);
2610#endif
2611#ifdef MSG_PEEK
2612 insint(d, "MSG_PEEK", MSG_PEEK);
2613#endif
2614#ifdef MSG_DONTROUTE
2615 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2616#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002617#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00002618 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002619#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002620#ifdef MSG_EOR
2621 insint(d, "MSG_EOR", MSG_EOR);
2622#endif
2623#ifdef MSG_TRUNC
2624 insint(d, "MSG_TRUNC", MSG_TRUNC);
2625#endif
2626#ifdef MSG_CTRUNC
2627 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2628#endif
2629#ifdef MSG_WAITALL
2630 insint(d, "MSG_WAITALL", MSG_WAITALL);
2631#endif
2632#ifdef MSG_BTAG
2633 insint(d, "MSG_BTAG", MSG_BTAG);
2634#endif
2635#ifdef MSG_ETAG
2636 insint(d, "MSG_ETAG", MSG_ETAG);
2637#endif
2638
2639 /* Protocol level and numbers, usable for [gs]etsockopt */
2640#ifdef SOL_SOCKET
2641 insint(d, "SOL_SOCKET", SOL_SOCKET);
2642#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002643#ifdef SOL_IP
2644 insint(d, "SOL_IP", SOL_IP);
2645#else
2646 insint(d, "SOL_IP", 0);
2647#endif
2648#ifdef SOL_IPX
2649 insint(d, "SOL_IPX", SOL_IPX);
2650#endif
2651#ifdef SOL_AX25
2652 insint(d, "SOL_AX25", SOL_AX25);
2653#endif
2654#ifdef SOL_ATALK
2655 insint(d, "SOL_ATALK", SOL_ATALK);
2656#endif
2657#ifdef SOL_NETROM
2658 insint(d, "SOL_NETROM", SOL_NETROM);
2659#endif
2660#ifdef SOL_ROSE
2661 insint(d, "SOL_ROSE", SOL_ROSE);
2662#endif
2663#ifdef SOL_TCP
2664 insint(d, "SOL_TCP", SOL_TCP);
2665#else
2666 insint(d, "SOL_TCP", 6);
2667#endif
2668#ifdef SOL_UDP
2669 insint(d, "SOL_UDP", SOL_UDP);
2670#else
2671 insint(d, "SOL_UDP", 17);
2672#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002673#ifdef IPPROTO_IP
2674 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002675#else
2676 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002677#endif
2678#ifdef IPPROTO_ICMP
2679 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002680#else
2681 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002682#endif
2683#ifdef IPPROTO_IGMP
2684 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2685#endif
2686#ifdef IPPROTO_GGP
2687 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2688#endif
2689#ifdef IPPROTO_TCP
2690 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002691#else
2692 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002693#endif
2694#ifdef IPPROTO_EGP
2695 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2696#endif
2697#ifdef IPPROTO_PUP
2698 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2699#endif
2700#ifdef IPPROTO_UDP
2701 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002702#else
2703 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002704#endif
2705#ifdef IPPROTO_IDP
2706 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2707#endif
2708#ifdef IPPROTO_HELLO
2709 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2710#endif
2711#ifdef IPPROTO_ND
2712 insint(d, "IPPROTO_ND", IPPROTO_ND);
2713#endif
2714#ifdef IPPROTO_TP
2715 insint(d, "IPPROTO_TP", IPPROTO_TP);
2716#endif
2717#ifdef IPPROTO_XTP
2718 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2719#endif
2720#ifdef IPPROTO_EON
2721 insint(d, "IPPROTO_EON", IPPROTO_EON);
2722#endif
2723#ifdef IPPROTO_BIP
2724 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2725#endif
2726/**/
2727#ifdef IPPROTO_RAW
2728 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002729#else
2730 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002731#endif
2732#ifdef IPPROTO_MAX
2733 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2734#endif
2735
2736 /* Some port configuration */
2737#ifdef IPPORT_RESERVED
2738 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2739#else
2740 insint(d, "IPPORT_RESERVED", 1024);
2741#endif
2742#ifdef IPPORT_USERRESERVED
2743 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2744#else
2745 insint(d, "IPPORT_USERRESERVED", 5000);
2746#endif
2747
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002748 /* Some reserved IP v.4 addresses */
2749#ifdef INADDR_ANY
2750 insint(d, "INADDR_ANY", INADDR_ANY);
2751#else
2752 insint(d, "INADDR_ANY", 0x00000000);
2753#endif
2754#ifdef INADDR_BROADCAST
2755 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2756#else
2757 insint(d, "INADDR_BROADCAST", 0xffffffff);
2758#endif
2759#ifdef INADDR_LOOPBACK
2760 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2761#else
2762 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2763#endif
2764#ifdef INADDR_UNSPEC_GROUP
2765 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2766#else
2767 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2768#endif
2769#ifdef INADDR_ALLHOSTS_GROUP
2770 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2771#else
2772 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2773#endif
2774#ifdef INADDR_MAX_LOCAL_GROUP
2775 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2776#else
2777 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2778#endif
2779#ifdef INADDR_NONE
2780 insint(d, "INADDR_NONE", INADDR_NONE);
2781#else
2782 insint(d, "INADDR_NONE", 0xffffffff);
2783#endif
2784
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002785 /* IP [gs]etsockopt options */
2786#ifdef IP_OPTIONS
2787 insint(d, "IP_OPTIONS", IP_OPTIONS);
2788#endif
2789#ifdef IP_HDRINCL
2790 insint(d, "IP_HDRINCL", IP_HDRINCL);
2791#endif
2792#ifdef IP_TOS
2793 insint(d, "IP_TOS", IP_TOS);
2794#endif
2795#ifdef IP_TTL
2796 insint(d, "IP_TTL", IP_TTL);
2797#endif
2798#ifdef IP_RECVOPTS
2799 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2800#endif
2801#ifdef IP_RECVRETOPTS
2802 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2803#endif
2804#ifdef IP_RECVDSTADDR
2805 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2806#endif
2807#ifdef IP_RETOPTS
2808 insint(d, "IP_RETOPTS", IP_RETOPTS);
2809#endif
2810#ifdef IP_MULTICAST_IF
2811 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2812#endif
2813#ifdef IP_MULTICAST_TTL
2814 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2815#endif
2816#ifdef IP_MULTICAST_LOOP
2817 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2818#endif
2819#ifdef IP_ADD_MEMBERSHIP
2820 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2821#endif
2822#ifdef IP_DROP_MEMBERSHIP
2823 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2824#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002825#ifdef IP_DEFAULT_MULTICAST_TTL
2826 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
2827#endif
2828#ifdef IP_DEFAULT_MULTICAST_LOOP
2829 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
2830#endif
2831#ifdef IP_MAX_MEMBERSHIPS
2832 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
2833#endif
2834
2835 /* TCP options */
2836#ifdef TCP_NODELAY
2837 insint(d, "TCP_NODELAY", TCP_NODELAY);
2838#endif
2839#ifdef TCP_MAXSEG
2840 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
2841#endif
2842
2843 /* IPX options */
2844#ifdef IPX_TYPE
2845 insint(d, "IPX_TYPE", IPX_TYPE);
2846#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002847
2848 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002849#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002850 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002851#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002852}