blob: f146e8f12527a0043c8e785f8e669a91eb71e397 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossum6574b3e1991-06-25 21:36:08 +00009******************************************************************/
10
11/* Socket module */
12
Guido van Rossum09c8b6c1999-12-07 21:37:17 +000013/* SSL support based on patches by Brian E Gallew and Laszlo Kovacs */
14
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015/*
16This module provides an interface to Berkeley socket IPC.
17
18Limitations:
19
Guido van Rossum30a685f1991-06-27 15:51:29 +000020- only AF_INET and AF_UNIX address families are supported
Guido van Rossum81194471991-07-27 21:42:02 +000021- no read/write operations (use send/recv or makefile instead)
Guido van Rossumbe32c891996-06-20 16:25:29 +000022- additional restrictions apply on Windows
Guido van Rossum6574b3e1991-06-25 21:36:08 +000023
Guido van Rossum27e177d1995-03-16 15:43:47 +000024Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000025
Guido van Rossum27e177d1995-03-16 15:43:47 +000026- socket.error: exception raised for socket specific errors
Guido van Rossum30a685f1991-06-27 15:51:29 +000027- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000028- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000029- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000030- socket.getprotobyname(protocolname) --> protocol number
Guido van Rossum27e177d1995-03-16 15:43:47 +000031- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000032- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum006bf911996-06-12 04:04:55 +000033- socket.ntohs(16 bit value) --> new int object
34- socket.ntohl(32 bit value) --> new int object
35- socket.htons(16 bit value) --> new int object
36- socket.htonl(32 bit value) --> new int object
Guido van Rossum27e177d1995-03-16 15:43:47 +000037- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +000038- socket.inet_aton(IP address) -> 32-bit packed IP representation
39- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum09c8b6c1999-12-07 21:37:17 +000040- socket.ssl(socket, keyfile, certfile) -> new ssl object
Guido van Rossum6574b3e1991-06-25 21:36:08 +000041- an Internet socket address is a pair (hostname, port)
42 where hostname can be anything recognized by gethostbyname()
43 (including the dd.dd.dd.dd notation) and port is in host byte order
44- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000045- a UNIX domain socket address is a string specifying the pathname
Guido van Rossum6574b3e1991-06-25 21:36:08 +000046
Guido van Rossum30a685f1991-06-27 15:51:29 +000047Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048
Guido van Rossum81194471991-07-27 21:42:02 +000049- s.accept() --> new socket object, sockaddr
Fred Drake728819a2000-07-01 03:40:12 +000050- s.bind(sockaddr) --> None
Guido van Rossum27e177d1995-03-16 15:43:47 +000051- s.close() --> None
Fred Drake728819a2000-07-01 03:40:12 +000052- s.connect(sockaddr) --> None
53- s.connect_ex(sockaddr) --> 0 or errno (handy for e.g. async connect)
Guido van Rossum27e177d1995-03-16 15:43:47 +000054- s.fileno() --> file descriptor
Guido van Rossumbe32c891996-06-20 16:25:29 +000055- s.dup() --> same as socket.fromfd(os.dup(s.fileno(), ...)
Guido van Rossumc89705d1992-11-26 08:54:07 +000056- s.getpeername() --> sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000057- s.getsockname() --> sockaddr
58- s.getsockopt(level, optname[, buflen]) --> int or string
59- s.listen(backlog) --> None
Guido van Rossum6b144911995-03-14 15:05:13 +000060- s.makefile([mode[, bufsize]]) --> file object
Guido van Rossum27e177d1995-03-16 15:43:47 +000061- s.recv(buflen [,flags]) --> string
62- s.recvfrom(buflen [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000063- s.send(string [,flags]) --> nbytes
64- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum27e177d1995-03-16 15:43:47 +000065- s.setblocking(0 | 1) --> None
66- s.setsockopt(level, optname, value) --> None
67- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000068- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000069
Guido van Rossum6574b3e1991-06-25 21:36:08 +000070*/
71
Guido van Rossum73624e91994-10-10 17:59:00 +000072#include "Python.h"
Guido van Rossum3baaa131999-03-22 21:44:51 +000073
Guido van Rossum9376b741999-09-15 22:01:40 +000074/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
75 script doesn't get this right, so we hardcode some platform checks below.
76 On the other hand, not all Linux versions agree, so there the settings
77 computed by the configure script are needed! */
78
79#ifndef linux
Guido van Rossume7de2061999-03-24 17:24:33 +000080#undef HAVE_GETHOSTBYNAME_R_3_ARG
81#undef HAVE_GETHOSTBYNAME_R_5_ARG
82#undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +000083#endif
Guido van Rossume7de2061999-03-24 17:24:33 +000084
Guido van Rossum7a122991999-04-13 04:07:32 +000085#ifndef WITH_THREAD
86#undef HAVE_GETHOSTBYNAME_R
87#endif
88
Guido van Rossume7de2061999-03-24 17:24:33 +000089#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +000090#if defined(_AIX) || defined(__osf__)
Guido van Rossume7de2061999-03-24 17:24:33 +000091#define HAVE_GETHOSTBYNAME_R_3_ARG
92#elif defined(__sun__) || defined(__sgi)
93#define HAVE_GETHOSTBYNAME_R_5_ARG
94#elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +000095/* Rely on the configure script */
Guido van Rossume7de2061999-03-24 17:24:33 +000096#else
97#undef HAVE_GETHOSTBYNAME_R
98#endif
99#endif
100
Guido van Rossum3baaa131999-03-22 21:44:51 +0000101#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && !defined(MS_WINDOWS)
102#define USE_GETHOSTBYNAME_LOCK
103#endif
104
105#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum49b56061998-10-01 20:42:43 +0000106#include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000107#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000108
Guido van Rossuma376cc51996-12-05 23:43:35 +0000109#ifdef HAVE_UNISTD_H
110#include <unistd.h>
111#endif
112
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000113#if defined(PYCC_VACPP)
114#include <types.h>
115#include <io.h>
116#include <sys/ioctl.h>
117#include <utils.h>
118#include <ctype.h>
119#endif
120
121#if defined(PYOS_OS2)
122#define INCL_DOS
123#define INCL_DOSERRORS
124#define INCL_NOPMAPI
125#include <os2.h>
126#endif
127
Guido van Rossumb6775db1994-08-01 11:34:53 +0000128#include <sys/types.h>
129#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +0000130
Guido van Rossum81194471991-07-27 21:42:02 +0000131#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000132#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000133#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000134#include <sys/socket.h>
135#include <netinet/in.h>
Fred Drake11b09362000-05-16 13:30:12 +0000136#ifndef __BEOS__
Andrew M. Kuchling52a644c2000-03-31 17:24:30 +0000137#include <netinet/tcp.h>
Fred Drake11b09362000-05-16 13:30:12 +0000138#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000139
Guido van Rossum9376b741999-09-15 22:01:40 +0000140/* Headers needed for inet_ntoa() and inet_addr() */
141#ifdef __BEOS__
142#include <net/netdb.h>
143#else
Guido van Rossumff3ab422000-04-24 15:16:03 +0000144#ifndef USE_GUSI1
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000145#include <arpa/inet.h>
Guido van Rossum9376b741999-09-15 22:01:40 +0000146#endif
Guido van Rossum1b6e4631999-11-04 18:22:29 +0000147#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000148
Guido van Rossume4485b01994-09-07 14:32:49 +0000149#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000150#else
151#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000152#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000153#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000154#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000155#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000156#else
157#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000158#endif
159
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000160#ifndef O_NDELAY
161#define O_NDELAY O_NONBLOCK /* For QNX only? */
162#endif
163
Guido van Rossumff3ab422000-04-24 15:16:03 +0000164#ifdef USE_GUSI1
Jack Jansen508537b1996-02-14 15:57:45 +0000165/* fdopen() isn't declared in stdio.h (sigh) */
166#include <GUSI.h>
167#endif
168
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000169#ifdef USE_SSL
170#include "rsa.h"
171#include "crypto.h"
172#include "x509.h"
173#include "pem.h"
174#include "ssl.h"
175#include "err.h"
176#endif /* USE_SSL */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000177
Guido van Rossumbcc20741998-08-04 22:53:56 +0000178#if defined(MS_WINDOWS) || defined(__BEOS__)
179/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000180/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000181#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000182#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000183#endif
184
Fred Drakea04eaad2000-06-30 02:46:07 +0000185/* abstract the socket file descriptor type */
186#ifdef MS_WINDOWS
187typedef SOCKET SOCKET_T;
188# ifdef MS_WIN64
189# define SIZEOF_SOCKET_T 8
190# else
191# define SIZEOF_SOCKET_T 4
192# endif
193#else
194typedef int SOCKET_T;
195# define SIZEOF_SOCKET_T SIZEOF_INT
196#endif
197
198
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000199#if defined(PYOS_OS2)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000200#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000201#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000202#endif
203
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000204#ifndef SOCKETCLOSE
205#define SOCKETCLOSE close
206#endif
207
Guido van Rossum30a685f1991-06-27 15:51:29 +0000208/* Global variable holding the exception type for errors detected
209 by this module (but not argument type or memory errors, etc.). */
210
Guido van Rossum73624e91994-10-10 17:59:00 +0000211static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000212
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000213#ifdef USE_SSL
214static PyObject *SSLErrorObject;
215#endif /* USE_SSL */
216
Guido van Rossum30a685f1991-06-27 15:51:29 +0000217
218/* Convenience function to raise an error according to errno
219 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000220
Guido van Rossum73624e91994-10-10 17:59:00 +0000221static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000222PySocket_Err(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000223{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000224#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000225 int err_no = WSAGetLastError();
226 if (err_no) {
227 static struct { int no; const char *msg; } *msgp, msgs[] = {
228 { WSAEINTR, "Interrupted system call" },
229 { WSAEBADF, "Bad file descriptor" },
230 { WSAEACCES, "Permission denied" },
231 { WSAEFAULT, "Bad address" },
232 { WSAEINVAL, "Invalid argument" },
233 { WSAEMFILE, "Too many open files" },
234 { WSAEWOULDBLOCK,
235 "The socket operation could not complete "
236 "without blocking" },
237 { WSAEINPROGRESS, "Operation now in progress" },
238 { WSAEALREADY, "Operation already in progress" },
239 { WSAENOTSOCK, "Socket operation on non-socket" },
240 { WSAEDESTADDRREQ, "Destination address required" },
241 { WSAEMSGSIZE, "Message too long" },
242 { WSAEPROTOTYPE, "Protocol wrong type for socket" },
243 { WSAENOPROTOOPT, "Protocol not available" },
244 { WSAEPROTONOSUPPORT, "Protocol not supported" },
245 { WSAESOCKTNOSUPPORT, "Socket type not supported" },
246 { WSAEOPNOTSUPP, "Operation not supported" },
247 { WSAEPFNOSUPPORT, "Protocol family not supported" },
248 { WSAEAFNOSUPPORT, "Address family not supported" },
249 { WSAEADDRINUSE, "Address already in use" },
250 { WSAEADDRNOTAVAIL,
251 "Can't assign requested address" },
252 { WSAENETDOWN, "Network is down" },
253 { WSAENETUNREACH, "Network is unreachable" },
254 { WSAENETRESET,
255 "Network dropped connection on reset" },
256 { WSAECONNABORTED,
257 "Software caused connection abort" },
258 { WSAECONNRESET, "Connection reset by peer" },
259 { WSAENOBUFS, "No buffer space available" },
260 { WSAEISCONN, "Socket is already connected" },
261 { WSAENOTCONN, "Socket is not connected" },
262 { WSAESHUTDOWN, "Can't send after socket shutdown" },
263 { WSAETOOMANYREFS,
264 "Too many references: can't splice" },
265 { WSAETIMEDOUT, "Operation timed out" },
266 { WSAECONNREFUSED, "Connection refused" },
267 { WSAELOOP, "Too many levels of symbolic links" },
268 { WSAENAMETOOLONG, "File name too long" },
269 { WSAEHOSTDOWN, "Host is down" },
270 { WSAEHOSTUNREACH, "No route to host" },
271 { WSAENOTEMPTY, "Directory not empty" },
272 { WSAEPROCLIM, "Too many processes" },
273 { WSAEUSERS, "Too many users" },
274 { WSAEDQUOT, "Disc quota exceeded" },
275 { WSAESTALE, "Stale NFS file handle" },
276 { WSAEREMOTE, "Too many levels of remote in path" },
277 { WSASYSNOTREADY,
278 "Network subsystem is unvailable" },
279 { WSAVERNOTSUPPORTED,
280 "WinSock version is not supported" },
281 { WSANOTINITIALISED,
282 "Successful WSAStartup() not yet performed" },
283 { WSAEDISCON, "Graceful shutdown in progress" },
284 /* Resolver errors */
285 { WSAHOST_NOT_FOUND, "No such host is known" },
286 { WSATRY_AGAIN, "Host not found, or server failed" },
287 { WSANO_RECOVERY,
288 "Unexpected server error encountered" },
289 { WSANO_DATA, "Valid name without requested data" },
290 { WSANO_ADDRESS, "No address, look for MX record" },
291 { 0, NULL }
292 };
Guido van Rossum73624e91994-10-10 17:59:00 +0000293 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000294 const char *msg = "winsock error";
295
296 for (msgp = msgs; msgp->msg; msgp++) {
297 if (err_no == msgp->no) {
298 msg = msgp->msg;
299 break;
300 }
301 }
302
303 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000304 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000305 PyErr_SetObject(PySocket_Error, v);
306 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000307 }
308 return NULL;
309 }
310 else
311#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000312
313#if defined(PYOS_OS2)
314 if (sock_errno() != NO_ERROR) {
315 APIRET rc;
316 ULONG msglen;
317 char outbuf[100];
318 int myerrorcode = sock_errno();
319
320 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
321 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
322 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
323 if (rc == NO_ERROR) {
324 PyObject *v;
325
326 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
327 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
328 char *lastc = &outbuf[ strlen(outbuf)-1 ];
329 while (lastc > outbuf && isspace(*lastc))
330 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
331 }
332 v = Py_BuildValue("(is)", myerrorcode, outbuf);
333 if (v != NULL) {
334 PyErr_SetObject(PySocket_Error, v);
335 Py_DECREF(v);
336 }
337 return NULL;
338 }
339 }
340#endif
341
Guido van Rossum73624e91994-10-10 17:59:00 +0000342 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000343}
344
Guido van Rossum30a685f1991-06-27 15:51:29 +0000345
346/* The object holding a socket. It holds some extra information,
347 like the address family, which is used to decode socket address
348 arguments properly. */
349
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000350typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000351 PyObject_HEAD
Fred Drakea04eaad2000-06-30 02:46:07 +0000352 SOCKET_T sock_fd; /* Socket file descriptor */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000353 int sock_family; /* Address family, e.g., AF_INET */
354 int sock_type; /* Socket type, e.g., SOCK_STREAM */
355 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000356 union sock_addr {
357 struct sockaddr_in in;
358#ifdef AF_UNIX
359 struct sockaddr_un un;
360#endif
361 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000362} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000363
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000364#ifdef USE_SSL
Guido van Rossum30a685f1991-06-27 15:51:29 +0000365
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000366typedef struct {
367 PyObject_HEAD
368 PySocketSockObject *Socket; /* Socket on which we're layered */
369 PyObject *x_attr; /* Attributes dictionary */
370 SSL_CTX* ctx;
371 SSL* ssl;
372 X509* server_cert;
373 BIO* sbio;
374 char server[256];
375 char issuer[256];
376
377} SSLObject;
378
379staticforward PyTypeObject SSL_Type;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000380staticforward PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args);
381staticforward PyObject *SSL_SSLread(SSLObject *self, PyObject *args);
382
383#define SSLObject_Check(v) ((v)->ob_type == &SSL_Type)
384
385#endif /* USE_SSL */
386
Guido van Rossum30a685f1991-06-27 15:51:29 +0000387/* A forward reference to the Socktype type object.
388 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000389 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000390 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000391
Guido van Rossum73624e91994-10-10 17:59:00 +0000392staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000393
Guido van Rossum30a685f1991-06-27 15:51:29 +0000394
395/* Create a new socket object.
396 This just creates the object and initializes it.
397 If the creation fails, return NULL and set an exception (implicit
398 in NEWOBJ()). */
399
Guido van Rossum73624e91994-10-10 17:59:00 +0000400static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000401PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000402{
Guido van Rossum73624e91994-10-10 17:59:00 +0000403 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000404 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000405 s = PyObject_New(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000406 if (s != NULL) {
407 s->sock_fd = fd;
408 s->sock_family = family;
409 s->sock_type = type;
410 s->sock_proto = proto;
411 }
412 return s;
413}
414
Guido van Rossum30a685f1991-06-27 15:51:29 +0000415
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000416/* Lock to allow python interpreter to continue, but only allow one
417 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000418#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000419PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000420#endif
421
422
Guido van Rossum30a685f1991-06-27 15:51:29 +0000423/* Convert a string specifying a host name or one of a few symbolic
424 names to a numeric IP address. This usually calls gethostbyname()
425 to do the work; the names "" and "<broadcast>" are special.
426 Return the length (should always be 4 bytes), or negative if
427 an error occurred; then an exception is raised. */
428
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000429static int
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000430setipaddr(char* name, struct sockaddr_in * addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000431{
432 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000433 int d1, d2, d3, d4;
Guido van Rossum955becc1999-03-22 20:14:53 +0000434 int h_length;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000435 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000436#ifdef HAVE_GETHOSTBYNAME_R
437 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000438#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
439 struct hostent_data data;
440#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000441 char buf[1001];
442 int buf_len = (sizeof buf) - 1;
443 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000444#endif
445#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000446 int result;
447#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000448#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000449
Guido van Rossuma376cc51996-12-05 23:43:35 +0000450 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000451 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000452 addr_ret->sin_addr.s_addr = INADDR_ANY;
453 return 4;
454 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000455 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000456 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
457 return 4;
458 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000459 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
460 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
461 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
462 addr_ret->sin_addr.s_addr = htonl(
463 ((long) d1 << 24) | ((long) d2 << 16) |
464 ((long) d3 << 8) | ((long) d4 << 0));
465 return 4;
466 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000467 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000468#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000469#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000470 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &hp, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000471#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000472 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000473#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +0000474 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +0000475 result = gethostbyname_r(name, &hp_allocated, &data);
476 hp = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +0000477#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000478#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000479#ifdef USE_GETHOSTBYNAME_LOCK
480 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000481#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000482 hp = gethostbyname(name);
483#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000484 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000485
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000486 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000487#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000488 /* Let's get real error message to return */
489 extern int h_errno;
490 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
491#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000492 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000493#endif
Guido van Rossum3baaa131999-03-22 21:44:51 +0000494#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000495 PyThread_release_lock(gethostbyname_lock);
496#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000497 return -1;
498 }
499 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
Guido van Rossum955becc1999-03-22 20:14:53 +0000500 h_length = hp->h_length;
Guido van Rossum3baaa131999-03-22 21:44:51 +0000501#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +0000502 PyThread_release_lock(gethostbyname_lock);
503#endif
504 return h_length;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000505}
506
Guido van Rossum30a685f1991-06-27 15:51:29 +0000507
Guido van Rossum30a685f1991-06-27 15:51:29 +0000508/* Create a string object representing an IP address.
509 This is always a string of the form 'dd.dd.dd.dd' (with variable
510 size numbers). */
511
Guido van Rossum73624e91994-10-10 17:59:00 +0000512static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000513makeipaddr(struct sockaddr_in *addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000514{
515 long x = ntohl(addr->sin_addr.s_addr);
516 char buf[100];
517 sprintf(buf, "%d.%d.%d.%d",
518 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
519 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000520 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000521}
522
523
524/* Create an object representing the given socket address,
525 suitable for passing it back to bind(), connect() etc.
526 The family field of the sockaddr structure is inspected
527 to determine what kind of address it really is. */
528
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000529/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000530static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000531makesockaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000532{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000533 if (addrlen == 0) {
534 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000535 Py_INCREF(Py_None);
536 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000537 }
538
Guido van Rossumbcc20741998-08-04 22:53:56 +0000539#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000540 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000541 addr->sa_family = AF_INET;
542#endif
543
Guido van Rossum30a685f1991-06-27 15:51:29 +0000544 switch (addr->sa_family) {
545
546 case AF_INET:
547 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000548 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000549 PyObject *addrobj = makeipaddr(a);
550 PyObject *ret = NULL;
551 if (addrobj) {
552 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
553 Py_DECREF(addrobj);
554 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000555 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000556 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000557
Guido van Rossumb6775db1994-08-01 11:34:53 +0000558#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000559 case AF_UNIX:
560 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000561 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000562 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000563 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000564#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000565
566 /* More cases here... */
567
568 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000569 /* If we don't know the address family, don't raise an
570 exception -- return it as a tuple. */
571 return Py_BuildValue("is#",
572 addr->sa_family,
573 addr->sa_data,
574 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000575
Guido van Rossum30a685f1991-06-27 15:51:29 +0000576 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000577}
578
Guido van Rossum30a685f1991-06-27 15:51:29 +0000579
580/* Parse a socket address argument according to the socket object's
581 address family. Return 1 if the address was in the proper format,
582 0 of not. The address is returned through addr_ret, its length
583 through len_ret. */
584
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000585static int
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000586getsockaddrarg(PySocketSockObject *s, PyObject *args, struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000587{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000588 switch (s->sock_family) {
589
Guido van Rossumb6775db1994-08-01 11:34:53 +0000590#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000591 case AF_UNIX:
592 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000593 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000594 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000595 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000596 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000597 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000598 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000599 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000600 PyErr_SetString(PySocket_Error,
601 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000602 return 0;
603 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000604 addr->sun_family = AF_UNIX;
605 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000606 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000607 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000608 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000609 return 1;
610 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000611#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000612
Guido van Rossum30a685f1991-06-27 15:51:29 +0000613 case AF_INET:
614 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000615 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000616 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000617 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000618 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000619 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000620 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000621 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000622 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000623 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000624 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000625 *addr_ret = (struct sockaddr *) addr;
626 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000627 return 1;
628 }
629
Guido van Rossum30a685f1991-06-27 15:51:29 +0000630 /* More cases here... */
631
632 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000633 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000634 return 0;
635
636 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000637}
638
Guido van Rossum30a685f1991-06-27 15:51:29 +0000639
Guido van Rossum710e1df1992-06-12 10:39:36 +0000640/* Get the address length according to the socket object's address family.
641 Return 1 if the family is known, 0 otherwise. The length is returned
642 through len_ret. */
643
644static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000645getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000646{
647 switch (s->sock_family) {
648
Guido van Rossumb6775db1994-08-01 11:34:53 +0000649#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000650 case AF_UNIX:
651 {
652 *len_ret = sizeof (struct sockaddr_un);
653 return 1;
654 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000655#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000656
657 case AF_INET:
658 {
659 *len_ret = sizeof (struct sockaddr_in);
660 return 1;
661 }
662
663 /* More cases here... */
664
665 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000666 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000667 return 0;
668
669 }
670}
671
672
Guido van Rossum30a685f1991-06-27 15:51:29 +0000673/* s.accept() method */
674
Guido van Rossum73624e91994-10-10 17:59:00 +0000675static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000676PySocketSock_accept(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000677{
678 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000679 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000680 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000681 PyObject *sock = NULL;
682 PyObject *addr = NULL;
683 PyObject *res = NULL;
684
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000685 if (!PyArg_ParseTuple(args, ":accept"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000686 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000687 if (!getsockaddrlen(s, &addrlen))
688 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000689 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000690 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000691 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000692#ifdef MS_WINDOWS
693 if (newfd == INVALID_SOCKET)
694#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000695 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000696#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000697 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000698
Guido van Rossum30a685f1991-06-27 15:51:29 +0000699 /* Create the new object with unspecified family,
700 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000701 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000702 s->sock_family,
703 s->sock_type,
704 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000705 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000706 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000707 goto finally;
708 }
709 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
710 goto finally;
711
712 if (!(res = Py_BuildValue("OO", sock, addr)))
713 goto finally;
714
715 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000716 Py_XDECREF(sock);
717 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000718 return res;
719}
720
Guido van Rossum82a5c661998-07-07 20:45:43 +0000721static char accept_doc[] =
722"accept() -> (socket object, address info)\n\
723\n\
724Wait for an incoming connection. Return a new socket representing the\n\
725connection, and the address of the client. For IP sockets, the address\n\
726info is a pair (hostaddr, port).";
727
Guido van Rossum30a685f1991-06-27 15:51:29 +0000728
Guido van Rossume4485b01994-09-07 14:32:49 +0000729/* s.setblocking(1 | 0) method */
730
Guido van Rossum73624e91994-10-10 17:59:00 +0000731static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000732PySocketSock_setblocking(PySocketSockObject *s, PyObject *args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000733{
734 int block;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000735#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000736 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000737#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000738 if (!PyArg_ParseTuple(args, "i:setblocking", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000739 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000740 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000741#ifdef __BEOS__
742 block = !block;
743 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
744 (void *)(&block), sizeof( int ) );
745#else
Guido van Rossum6f489d91996-06-28 20:15:15 +0000746#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000747#ifdef PYOS_OS2
748 block = !block;
749 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
750#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000751 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
752 if (block)
753 delay_flag &= (~O_NDELAY);
754 else
755 delay_flag |= O_NDELAY;
756 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000757#endif /* !PYOS_OS2 */
758#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000759 block = !block;
760 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000761#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000762#endif /* __BEOS__ */
Guido van Rossum73624e91994-10-10 17:59:00 +0000763 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000764
Guido van Rossum73624e91994-10-10 17:59:00 +0000765 Py_INCREF(Py_None);
766 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000767}
Guido van Rossume4485b01994-09-07 14:32:49 +0000768
Guido van Rossum82a5c661998-07-07 20:45:43 +0000769static char setblocking_doc[] =
770"setblocking(flag)\n\
771\n\
772Set the socket to blocking (flag is true) or non-blocking (false).\n\
773This uses the FIONBIO ioctl with the O_NDELAY flag.";
774
Guido van Rossume4485b01994-09-07 14:32:49 +0000775
Guido van Rossumaee08791992-09-08 09:05:33 +0000776/* s.setsockopt() method.
777 With an integer third argument, sets an integer option.
778 With a string third argument, sets an option from a buffer;
779 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000780
Guido van Rossum73624e91994-10-10 17:59:00 +0000781static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000782PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000783{
784 int level;
785 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000786 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000787 char *buf;
788 int buflen;
789 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000790
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000791 if (PyArg_ParseTuple(args, "iii:setsockopt",
792 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000793 buf = (char *) &flag;
794 buflen = sizeof flag;
795 }
796 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000797 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000798 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
799 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000800 return NULL;
801 }
Thomas Wouters334fb892000-07-25 12:56:38 +0000802 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000803 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000804 return PySocket_Err();
805 Py_INCREF(Py_None);
806 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000807}
808
Guido van Rossum82a5c661998-07-07 20:45:43 +0000809static char setsockopt_doc[] =
810"setsockopt(level, option, value)\n\
811\n\
812Set a socket option. See the Unix manual for level and option.\n\
813The value argument can either be an integer or a string.";
814
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000815
Guido van Rossumaee08791992-09-08 09:05:33 +0000816/* s.getsockopt() method.
817 With two arguments, retrieves an integer option.
818 With a third integer argument, retrieves a string buffer of that size;
819 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000820
Guido van Rossum73624e91994-10-10 17:59:00 +0000821static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000822PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000823{
824 int level;
825 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000826 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000827 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000828 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000829
Guido van Rossumbcc20741998-08-04 22:53:56 +0000830#ifdef __BEOS__
831/* We have incomplete socket support. */
832 PyErr_SetString( PySocket_Error, "getsockopt not supported" );
833 return NULL;
834#else
835
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000836 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
837 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +0000838 return NULL;
839
840 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000841 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000842 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000843 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +0000844 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000845 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000846 return PySocket_Err();
847 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000848 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000849 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000850 PyErr_SetString(PySocket_Error,
851 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000852 return NULL;
853 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000854 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000855 if (buf == NULL)
856 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000857 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +0000858 (void *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000859 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000860 Py_DECREF(buf);
861 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000862 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000863 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000864 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +0000865#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000866}
867
Guido van Rossum82a5c661998-07-07 20:45:43 +0000868static char getsockopt_doc[] =
869"getsockopt(level, option[, buffersize]) -> value\n\
870\n\
871Get a socket option. See the Unix manual for level and option.\n\
872If a nonzero buffersize argument is given, the return value is a\n\
873string of that length; otherwise it is an integer.";
874
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000875
Fred Drake728819a2000-07-01 03:40:12 +0000876/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000877
Guido van Rossum73624e91994-10-10 17:59:00 +0000878static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000879PySocketSock_bind(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000880{
881 struct sockaddr *addr;
882 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000883 int res;
Fred Drake728819a2000-07-01 03:40:12 +0000884 PyObject *addro;
885 if (!PyArg_ParseTuple(args, "O:bind", &addro))
886 return NULL;
887 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000888 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000889 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000890 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000891 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000892 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000893 return PySocket_Err();
894 Py_INCREF(Py_None);
895 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000896}
897
Guido van Rossum82a5c661998-07-07 20:45:43 +0000898static char bind_doc[] =
899"bind(address)\n\
900\n\
901Bind the socket to a local address. For IP sockets, the address is a\n\
902pair (host, port); the host must refer to the local host.";
903
Guido van Rossum30a685f1991-06-27 15:51:29 +0000904
905/* s.close() method.
906 Set the file descriptor to -1 so operations tried subsequently
907 will surely fail. */
908
Guido van Rossum73624e91994-10-10 17:59:00 +0000909static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000910PySocketSock_close(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000911{
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000912 if (!PyArg_ParseTuple(args, ":close"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000913 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000914 if (s->sock_fd != -1) {
915 Py_BEGIN_ALLOW_THREADS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000916 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum08481461996-10-12 14:07:22 +0000917 Py_END_ALLOW_THREADS
918 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000919 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000920 Py_INCREF(Py_None);
921 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000922}
923
Guido van Rossum82a5c661998-07-07 20:45:43 +0000924static char close_doc[] =
925"close()\n\
926\n\
927Close the socket. It cannot be used after this call.";
928
Guido van Rossum30a685f1991-06-27 15:51:29 +0000929
Fred Drake728819a2000-07-01 03:40:12 +0000930/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000931
Guido van Rossum73624e91994-10-10 17:59:00 +0000932static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000933PySocketSock_connect(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000934{
935 struct sockaddr *addr;
936 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000937 int res;
Fred Drake728819a2000-07-01 03:40:12 +0000938 PyObject *addro;
939 if (!PyArg_ParseTuple(args, "O:connect", &addro))
940 return NULL;
941 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000942 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000943 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000944 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000945 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000946 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000947 return PySocket_Err();
948 Py_INCREF(Py_None);
949 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000950}
951
Guido van Rossum82a5c661998-07-07 20:45:43 +0000952static char connect_doc[] =
953"connect(address)\n\
954\n\
955Connect the socket to a remote address. For IP sockets, the address\n\
956is a pair (host, port).";
957
Guido van Rossum30a685f1991-06-27 15:51:29 +0000958
Fred Drake728819a2000-07-01 03:40:12 +0000959/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000960
961static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000962PySocketSock_connect_ex(PySocketSockObject *s, PyObject *args)
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000963{
964 struct sockaddr *addr;
965 int addrlen;
966 int res;
Fred Drake728819a2000-07-01 03:40:12 +0000967 PyObject *addro;
968 if (!PyArg_ParseTuple(args, "O:connect_ex", &addro))
969 return NULL;
970 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000971 return NULL;
972 Py_BEGIN_ALLOW_THREADS
973 res = connect(s->sock_fd, addr, addrlen);
974 Py_END_ALLOW_THREADS
975 if (res != 0)
976 res = errno;
977 return PyInt_FromLong((long) res);
978}
979
Guido van Rossum82a5c661998-07-07 20:45:43 +0000980static char connect_ex_doc[] =
981"connect_ex(address)\n\
982\n\
983This is like connect(address), but returns an error code (the errno value)\n\
984instead of raising an exception when an error occurs.";
985
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000986
Guido van Rossumed233a51992-06-23 09:07:03 +0000987/* s.fileno() method */
988
Guido van Rossum73624e91994-10-10 17:59:00 +0000989static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000990PySocketSock_fileno(PySocketSockObject *s, PyObject *args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000991{
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000992 if (!PyArg_ParseTuple(args, ":fileno"))
Guido van Rossumed233a51992-06-23 09:07:03 +0000993 return NULL;
Fred Drakea04eaad2000-06-30 02:46:07 +0000994#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +0000995 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +0000996#else
997 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
998#endif
Guido van Rossumed233a51992-06-23 09:07:03 +0000999}
1000
Guido van Rossum82a5c661998-07-07 20:45:43 +00001001static char fileno_doc[] =
1002"fileno() -> integer\n\
1003\n\
1004Return the integer file descriptor of the socket.";
1005
Guido van Rossumed233a51992-06-23 09:07:03 +00001006
Guido van Rossumbe32c891996-06-20 16:25:29 +00001007#ifndef NO_DUP
1008/* s.dup() method */
1009
1010static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001011PySocketSock_dup(PySocketSockObject *s, PyObject *args)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001012{
Fred Drakea04eaad2000-06-30 02:46:07 +00001013 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001014 PyObject *sock;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001015 if (!PyArg_ParseTuple(args, ":dup"))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001016 return NULL;
1017 newfd = dup(s->sock_fd);
1018 if (newfd < 0)
1019 return PySocket_Err();
1020 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001021 s->sock_family,
1022 s->sock_type,
1023 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001024 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001025 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001026 return sock;
1027}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001028
1029static char dup_doc[] =
1030"dup() -> socket object\n\
1031\n\
1032Return a new socket object connected to the same system resource.";
1033
Guido van Rossumbe32c891996-06-20 16:25:29 +00001034#endif
1035
1036
Guido van Rossumc89705d1992-11-26 08:54:07 +00001037/* s.getsockname() method */
1038
Guido van Rossum73624e91994-10-10 17:59:00 +00001039static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001040PySocketSock_getsockname(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001041{
1042 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001043 int res;
1044 socklen_t addrlen;
1045
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001046 if (!PyArg_ParseTuple(args, ":getsockname"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001047 return NULL;
1048 if (!getsockaddrlen(s, &addrlen))
1049 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001050 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001051 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001052 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001053 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001054 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001055 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001056 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1057}
1058
Guido van Rossum82a5c661998-07-07 20:45:43 +00001059static char getsockname_doc[] =
1060"getsockname() -> address info\n\
1061\n\
1062Return the address of the local endpoint. For IP sockets, the address\n\
1063info is a pair (hostaddr, port).";
1064
Guido van Rossumc89705d1992-11-26 08:54:07 +00001065
Guido van Rossumb6775db1994-08-01 11:34:53 +00001066#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001067/* s.getpeername() method */
1068
Guido van Rossum73624e91994-10-10 17:59:00 +00001069static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001070PySocketSock_getpeername(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001071{
1072 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001073 int res;
1074 socklen_t addrlen;
1075
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001076 if (!PyArg_ParseTuple(args, ":getpeername"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001077 return NULL;
1078 if (!getsockaddrlen(s, &addrlen))
1079 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001080 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001081 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001082 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001083 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001084 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +00001085 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
1086}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001087
1088static char getpeername_doc[] =
1089"getpeername() -> address info\n\
1090\n\
1091Return the address of the remote endpoint. For IP sockets, the address\n\
1092info is a pair (hostaddr, port).";
1093
Guido van Rossumb6775db1994-08-01 11:34:53 +00001094#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001095
1096
Guido van Rossum30a685f1991-06-27 15:51:29 +00001097/* s.listen(n) method */
1098
Guido van Rossum73624e91994-10-10 17:59:00 +00001099static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001100PySocketSock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001101{
1102 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001103 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001104 if (!PyArg_ParseTuple(args, "i:listen", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001105 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001106 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001107 if (backlog < 1)
1108 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001109 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001110 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001111 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001112 return PySocket_Err();
1113 Py_INCREF(Py_None);
1114 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001115}
1116
Guido van Rossum82a5c661998-07-07 20:45:43 +00001117static char listen_doc[] =
1118"listen(backlog)\n\
1119\n\
1120Enable a server to accept connections. The backlog argument must be at\n\
1121least 1; it specifies the number of unaccepted connection that the system\n\
1122will allow before refusing new connections.";
1123
1124
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001125#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001126/* s.makefile(mode) method.
1127 Create a new open file object referring to a dupped version of
1128 the socket's file descriptor. (The dup() call is necessary so
1129 that the open file and socket objects may be closed independent
1130 of each other.)
1131 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1132
Guido van Rossum73624e91994-10-10 17:59:00 +00001133static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001134PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001135{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001136 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001137 char *mode = "r";
1138 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001139#ifdef MS_WIN32
1140 intptr_t fd;
1141#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001142 int fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001143#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001144 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001145 PyObject *f;
1146
Guido van Rossum43713e52000-02-29 13:59:29 +00001147 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001148 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001149#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001150 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1151 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001152#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001153 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001154#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001155 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001156 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001157 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001158 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001159 }
1160 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1161 if (f != NULL)
1162 PyFile_SetBufSize(f, bufsize);
1163 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001164}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001165
1166static char makefile_doc[] =
1167"makefile([mode[, buffersize]]) -> file object\n\
1168\n\
1169Return a regular file object corresponding to the socket.\n\
1170The mode and buffersize arguments are as for the built-in open() function.";
1171
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001172#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001173
Guido van Rossum82a5c661998-07-07 20:45:43 +00001174
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001175/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001176
Guido van Rossum73624e91994-10-10 17:59:00 +00001177static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001178PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001179{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001180 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001181 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001182 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001183 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001184 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001185 if (buf == NULL)
1186 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001187 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001188 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001189 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001190 if (n < 0) {
1191 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001192 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001193 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001194 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001195 return NULL;
1196 return buf;
1197}
1198
Guido van Rossum82a5c661998-07-07 20:45:43 +00001199static char recv_doc[] =
1200"recv(buffersize[, flags]) -> data\n\
1201\n\
1202Receive up to buffersize bytes from the socket. For the optional flags\n\
1203argument, see the Unix manual. When no data is available, block until\n\
1204at least one byte is available or until the remote end is closed. When\n\
1205the remote end is closed and all data is read, return the empty string.";
1206
Guido van Rossum30a685f1991-06-27 15:51:29 +00001207
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001208/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001209
Guido van Rossum73624e91994-10-10 17:59:00 +00001210static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001211PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001212{
1213 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001214 PyObject *buf = NULL;
1215 PyObject *addr = NULL;
1216 PyObject *ret = NULL;
1217
Guido van Rossumff3ab422000-04-24 15:16:03 +00001218 int len, n, flags = 0;
1219 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001220 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001221 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001222 if (!getsockaddrlen(s, &addrlen))
1223 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001224 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001225 if (buf == NULL)
1226 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001227 Py_BEGIN_ALLOW_THREADS
1228 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001229#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001230#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001231 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001232#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001233 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001234#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001235#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001236 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001237#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001238 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001239 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001240 if (n < 0) {
1241 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001242 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001243 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001244 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001245 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00001246
1247 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
1248 goto finally;
1249
Guido van Rossum73624e91994-10-10 17:59:00 +00001250 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001251 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001252 Py_XDECREF(addr);
1253 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001254 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001255}
1256
Guido van Rossum82a5c661998-07-07 20:45:43 +00001257static char recvfrom_doc[] =
1258"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1259\n\
1260Like recv(buffersize, flags) but also return the sender's address info.";
1261
Guido van Rossum30a685f1991-06-27 15:51:29 +00001262
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001263/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001264
Guido van Rossum73624e91994-10-10 17:59:00 +00001265static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001266PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001267{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001268 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001269 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001270 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001271 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001272 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001273 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001274 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001275 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001276 return PySocket_Err();
1277 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001278}
1279
Guido van Rossum82a5c661998-07-07 20:45:43 +00001280static char send_doc[] =
1281"send(data[, flags])\n\
1282\n\
1283Send a data string to the socket. For the optional flags\n\
1284argument, see the Unix manual.";
1285
Guido van Rossum30a685f1991-06-27 15:51:29 +00001286
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001287/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001288
Guido van Rossum73624e91994-10-10 17:59:00 +00001289static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001290PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001291{
Guido van Rossum73624e91994-10-10 17:59:00 +00001292 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001293 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001294 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001295 int addrlen, len, n, flags;
1296 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001297 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001298 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001299 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1300 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001301 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001302 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001303 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001304 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001305 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001306 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001307 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001308 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001309 return PySocket_Err();
1310 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001311}
1312
Guido van Rossum82a5c661998-07-07 20:45:43 +00001313static char sendto_doc[] =
1314"sendto(data[, flags], address)\n\
1315\n\
1316Like send(data, flags) but allows specifying the destination address.\n\
1317For IP sockets, the address is a pair (hostaddr, port).";
1318
Guido van Rossum30a685f1991-06-27 15:51:29 +00001319
1320/* s.shutdown(how) method */
1321
Guido van Rossum73624e91994-10-10 17:59:00 +00001322static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001323PySocketSock_shutdown(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001324{
1325 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001326 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001327 if (!PyArg_ParseTuple(args, "i:shutdown", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001328 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001329 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001330 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001331 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001332 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001333 return PySocket_Err();
1334 Py_INCREF(Py_None);
1335 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001336}
1337
Guido van Rossum82a5c661998-07-07 20:45:43 +00001338static char shutdown_doc[] =
1339"shutdown(flag)\n\
1340\n\
1341Shut down the reading side of the socket (flag == 0), the writing side\n\
1342of the socket (flag == 1), or both ends (flag == 2).";
1343
Guido van Rossum30a685f1991-06-27 15:51:29 +00001344
1345/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001346
Guido van Rossum73624e91994-10-10 17:59:00 +00001347static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001348 {"accept", (PyCFunction)PySocketSock_accept, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001349 accept_doc},
Fred Drake728819a2000-07-01 03:40:12 +00001350 {"bind", (PyCFunction)PySocketSock_bind, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001351 bind_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001352 {"close", (PyCFunction)PySocketSock_close, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001353 close_doc},
Fred Drake728819a2000-07-01 03:40:12 +00001354 {"connect", (PyCFunction)PySocketSock_connect, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001355 connect_doc},
Fred Drake728819a2000-07-01 03:40:12 +00001356 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001357 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001358#ifndef NO_DUP
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001359 {"dup", (PyCFunction)PySocketSock_dup, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001360 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001361#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001362 {"fileno", (PyCFunction)PySocketSock_fileno, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001363 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001364#ifdef HAVE_GETPEERNAME
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001365 {"getpeername", (PyCFunction)PySocketSock_getpeername, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001366 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001367#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001368 {"getsockname", (PyCFunction)PySocketSock_getsockname, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001369 getsockname_doc},
1370 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1,
1371 getsockopt_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001372 {"listen", (PyCFunction)PySocketSock_listen, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001373 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001374#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00001375 {"makefile", (PyCFunction)PySocketSock_makefile, 1,
1376 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001377#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001378 {"recv", (PyCFunction)PySocketSock_recv, 1,
1379 recv_doc},
1380 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1,
1381 recvfrom_doc},
1382 {"send", (PyCFunction)PySocketSock_send, 1,
1383 send_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001384 {"sendto", (PyCFunction)PySocketSock_sendto, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001385 sendto_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001386 {"setblocking", (PyCFunction)PySocketSock_setblocking, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001387 setblocking_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001388 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001389 setsockopt_doc},
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001390 {"shutdown", (PyCFunction)PySocketSock_shutdown, 1,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001391 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001392 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001393};
1394
Guido van Rossum30a685f1991-06-27 15:51:29 +00001395
Guido van Rossum73624e91994-10-10 17:59:00 +00001396/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001397 First close the file description. */
1398
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001399static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001400PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001401{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001402 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001403 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001404 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001405}
1406
Guido van Rossum30a685f1991-06-27 15:51:29 +00001407
1408/* Return a socket object's named attribute. */
1409
Guido van Rossum73624e91994-10-10 17:59:00 +00001410static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001411PySocketSock_getattr(PySocketSockObject *s, char *name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001412{
Guido van Rossum73624e91994-10-10 17:59:00 +00001413 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001414}
1415
Guido van Rossum30a685f1991-06-27 15:51:29 +00001416
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001417static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001418PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001419{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001420 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001421#if SIZEOF_SOCKET_T > SIZEOF_LONG
1422 if (s->sock_fd > LONG_MAX) {
1423 /* this can occur on Win64, and actually there is a special
1424 ugly printf formatter for decimal pointer length integer
1425 printing, only bother if necessary*/
1426 PyErr_SetString(PyExc_OverflowError,
1427 "no printf formatter to display the socket descriptor in decimal");
1428 return NULL;
1429 }
1430#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001431 sprintf(buf,
Fred Drakea04eaad2000-06-30 02:46:07 +00001432 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
1433 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001434 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001435}
1436
1437
Guido van Rossumb6775db1994-08-01 11:34:53 +00001438/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001439
Guido van Rossum73624e91994-10-10 17:59:00 +00001440static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001441 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001442 0,
1443 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001444 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001445 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001446 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001447 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001448 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001449 0, /*tp_setattr*/
1450 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001451 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001452 0, /*tp_as_number*/
1453 0, /*tp_as_sequence*/
1454 0, /*tp_as_mapping*/
1455};
1456
Guido van Rossum30a685f1991-06-27 15:51:29 +00001457
Guido van Rossum81194471991-07-27 21:42:02 +00001458/* Python interface to gethostname(). */
1459
1460/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001461static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001462PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001463{
1464 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001465 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001466 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001467 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001468 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001469 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001470 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001471 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001472 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001473 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001474 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001475}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001476
Guido van Rossum82a5c661998-07-07 20:45:43 +00001477static char gethostname_doc[] =
1478"gethostname() -> string\n\
1479\n\
1480Return the current host name.";
1481
Guido van Rossumff4949e1992-08-05 19:58:53 +00001482
Guido van Rossum30a685f1991-06-27 15:51:29 +00001483/* Python interface to gethostbyname(name). */
1484
1485/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001486static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001487PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001488{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001489 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001490 struct sockaddr_in addrbuf;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001491 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001492 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001493 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001494 return NULL;
1495 return makeipaddr(&addrbuf);
1496}
1497
Guido van Rossum82a5c661998-07-07 20:45:43 +00001498static char gethostbyname_doc[] =
1499"gethostbyname(host) -> address\n\
1500\n\
1501Return the IP address (a string of the form '255.255.255.255') for a host.";
1502
1503
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001504/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1505
1506static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001507gethost_common(struct hostent *h, struct sockaddr_in *addr)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001508{
1509 char **pch;
1510 PyObject *rtn_tuple = (PyObject *)NULL;
1511 PyObject *name_list = (PyObject *)NULL;
1512 PyObject *addr_list = (PyObject *)NULL;
1513 PyObject *tmp;
1514 if (h == NULL) {
1515#ifdef HAVE_HSTRERROR
1516 /* Let's get real error message to return */
1517 extern int h_errno;
1518 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1519#else
1520 PyErr_SetString(PySocket_Error, "host not found");
1521#endif
1522 return NULL;
1523 }
1524 if ((name_list = PyList_New(0)) == NULL)
1525 goto err;
1526 if ((addr_list = PyList_New(0)) == NULL)
1527 goto err;
1528 for (pch = h->h_aliases; *pch != NULL; pch++) {
1529 int status;
1530 tmp = PyString_FromString(*pch);
1531 if (tmp == NULL)
1532 goto err;
1533 status = PyList_Append(name_list, tmp);
1534 Py_DECREF(tmp);
1535 if (status)
1536 goto err;
1537 }
1538 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1539 int status;
1540 memcpy((char *) &addr->sin_addr, *pch, h->h_length);
1541 tmp = makeipaddr(addr);
1542 if (tmp == NULL)
1543 goto err;
1544 status = PyList_Append(addr_list, tmp);
1545 Py_DECREF(tmp);
1546 if (status)
1547 goto err;
1548 }
1549 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1550 err:
1551 Py_XDECREF(name_list);
1552 Py_XDECREF(addr_list);
1553 return rtn_tuple;
1554}
1555
1556
1557/* Python interface to gethostbyname_ex(name). */
1558
1559/*ARGSUSED*/
1560static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001561PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001562{
1563 char *name;
1564 struct hostent *h;
1565 struct sockaddr_in addr;
Guido van Rossum955becc1999-03-22 20:14:53 +00001566 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001567#ifdef HAVE_GETHOSTBYNAME_R
1568 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001569#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1570 struct hostent_data data;
1571#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001572 char buf[16384];
1573 int buf_len = (sizeof buf) - 1;
1574 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001575#endif
1576#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001577 int result;
1578#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001579#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001580 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001581 return NULL;
1582 if (setipaddr(name, &addr) < 0)
1583 return NULL;
1584 Py_BEGIN_ALLOW_THREADS
1585#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001586#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001587 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001588#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001589 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001590#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001591 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001592 result = gethostbyname_r(name, &hp_allocated, &data);
1593 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001594#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001595#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001596#ifdef USE_GETHOSTBYNAME_LOCK
1597 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001598#endif
1599 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001600#endif /* HAVE_GETHOSTBYNAME_R */
1601 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001602 ret = gethost_common(h, &addr);
1603#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001604 PyThread_release_lock(gethostbyname_lock);
1605#endif
1606 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001607}
1608
1609static char ghbn_ex_doc[] =
1610"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1611\n\
1612Return the true host name, a list of aliases, and a list of IP addresses,\n\
1613for a host. The host argument is a string giving a host name or IP number.";
1614
1615
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001616/* Python interface to gethostbyaddr(IP). */
1617
1618/*ARGSUSED*/
1619static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001620PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001621{
1622 struct sockaddr_in addr;
1623 char *ip_num;
1624 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001625 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001626#ifdef HAVE_GETHOSTBYNAME_R
1627 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001628#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1629 struct hostent_data data;
1630#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001631 char buf[16384];
1632 int buf_len = (sizeof buf) - 1;
1633 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001634#endif
1635#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001636 int result;
1637#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001638#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001639
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001640 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001641 return NULL;
1642 if (setipaddr(ip_num, &addr) < 0)
1643 return NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001644 Py_BEGIN_ALLOW_THREADS
1645#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001646#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001647 result = gethostbyaddr_r((char *)&addr.sin_addr,
1648 sizeof(addr.sin_addr),
1649 AF_INET, &hp_allocated, buf, buf_len,
1650 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001651#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001652 h = gethostbyaddr_r((char *)&addr.sin_addr,
1653 sizeof(addr.sin_addr),
1654 AF_INET,
1655 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001656#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001657 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001658 result = gethostbyaddr_r((char *)&addr.sin_addr,
1659 sizeof(addr.sin_addr),
1660 AF_INET, &hp_allocated, &data);
1661 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001662#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001663#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001664#ifdef USE_GETHOSTBYNAME_LOCK
1665 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001666#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001667 h = gethostbyaddr((char *)&addr.sin_addr,
1668 sizeof(addr.sin_addr),
1669 AF_INET);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001670#endif /* HAVE_GETHOSTBYNAME_R */
1671 Py_END_ALLOW_THREADS
Guido van Rossum3baaa131999-03-22 21:44:51 +00001672 ret = gethost_common(h, &addr);
1673#ifdef USE_GETHOSTBYNAME_LOCK
1674 PyThread_release_lock(gethostbyname_lock);
1675#endif
1676 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001677}
1678
Guido van Rossum82a5c661998-07-07 20:45:43 +00001679static char gethostbyaddr_doc[] =
1680"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
1681\n\
1682Return the true host name, a list of aliases, and a list of IP addresses,\n\
1683for a host. The host argument is a string giving a host name or IP number.";
1684
Guido van Rossum30a685f1991-06-27 15:51:29 +00001685
1686/* Python interface to getservbyname(name).
1687 This only returns the port number, since the other info is already
1688 known or not useful (like the list of aliases). */
1689
1690/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001691static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001692PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001693{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001694 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001695 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001696 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001697 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001698 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001699 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001700 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001701 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001702 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001703 return NULL;
1704 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001705 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001706}
1707
Guido van Rossum82a5c661998-07-07 20:45:43 +00001708static char getservbyname_doc[] =
1709"getservbyname(servicename, protocolname) -> integer\n\
1710\n\
1711Return a port number from a service name and protocol name.\n\
1712The protocol name should be 'tcp' or 'udp'.";
1713
Guido van Rossum30a685f1991-06-27 15:51:29 +00001714
Guido van Rossum3901d851996-12-19 16:35:04 +00001715/* Python interface to getprotobyname(name).
1716 This only returns the protocol number, since the other info is
1717 already known or not useful (like the list of aliases). */
1718
1719/*ARGSUSED*/
1720static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001721PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00001722{
1723 char *name;
1724 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001725#ifdef __BEOS__
1726/* Not available in BeOS yet. - [cjh] */
1727 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
1728 return NULL;
1729#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001730 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00001731 return NULL;
1732 Py_BEGIN_ALLOW_THREADS
1733 sp = getprotobyname(name);
1734 Py_END_ALLOW_THREADS
1735 if (sp == NULL) {
1736 PyErr_SetString(PySocket_Error, "protocol not found");
1737 return NULL;
1738 }
1739 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00001740#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00001741}
1742
Guido van Rossum82a5c661998-07-07 20:45:43 +00001743static char getprotobyname_doc[] =
1744"getprotobyname(name) -> integer\n\
1745\n\
1746Return the protocol number for the named protocol. (Rarely used.)";
1747
Guido van Rossum3901d851996-12-19 16:35:04 +00001748
Guido van Rossum30a685f1991-06-27 15:51:29 +00001749/* Python interface to socket(family, type, proto).
1750 The third (protocol) argument is optional.
1751 Return a new socket object. */
1752
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001753/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001754static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001755PySocket_socket(PyObject *self, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001756{
Guido van Rossum73624e91994-10-10 17:59:00 +00001757 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001758 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001759 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001760 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001761 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001762 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001763 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001764 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001765#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001766 if (fd == INVALID_SOCKET)
1767#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001768 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001769#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001770 return PySocket_Err();
1771 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001772 /* If the object can't be created, don't forget to close the
1773 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001774 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001775 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001776 /* From now on, ignore SIGPIPE and let the error checking
1777 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001778#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001779 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001780#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001781 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001782}
1783
Guido van Rossum82a5c661998-07-07 20:45:43 +00001784static char socket_doc[] =
1785"socket(family, type[, proto]) -> socket object\n\
1786\n\
1787Open a socket of the given type. The family argument specifies the\n\
1788address family; it is normally AF_INET, sometimes AF_UNIX.\n\
1789The type argument specifies whether this is a stream (SOCK_STREAM)\n\
1790or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1791specifying the default protocol.";
1792
1793
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001794#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001795/* Create a socket object from a numeric file description.
1796 Useful e.g. if stdin is a socket.
1797 Additional arguments as for socket(). */
1798
1799/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001800static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001801PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001802{
Guido van Rossum73624e91994-10-10 17:59:00 +00001803 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00001804 SOCKET_T fd;
1805 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001806 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
1807 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001808 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001809 /* Dup the fd so it and the socket can be closed independently */
1810 fd = dup(fd);
1811 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001812 return PySocket_Err();
1813 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001814 /* From now on, ignore SIGPIPE and let the error checking
1815 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001816#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001817 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001818#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001819 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001820}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001821
1822static char fromfd_doc[] =
1823"fromfd(fd, family, type[, proto]) -> socket object\n\
1824\n\
1825Create a socket object from the given file descriptor.\n\
1826The remaining arguments are the same as for socket().";
1827
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001828#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001829
Guido van Rossum82a5c661998-07-07 20:45:43 +00001830
Guido van Rossum006bf911996-06-12 04:04:55 +00001831static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001832PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001833{
1834 int x1, x2;
1835
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001836 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001837 return NULL;
1838 }
1839 x2 = (int)ntohs((short)x1);
1840 return PyInt_FromLong(x2);
1841}
1842
Guido van Rossum82a5c661998-07-07 20:45:43 +00001843static char ntohs_doc[] =
1844"ntohs(integer) -> integer\n\
1845\n\
1846Convert a 16-bit integer from network to host byte order.";
1847
1848
Guido van Rossum006bf911996-06-12 04:04:55 +00001849static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001850PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001851{
1852 int x1, x2;
1853
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001854 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001855 return NULL;
1856 }
1857 x2 = ntohl(x1);
1858 return PyInt_FromLong(x2);
1859}
1860
Guido van Rossum82a5c661998-07-07 20:45:43 +00001861static char ntohl_doc[] =
1862"ntohl(integer) -> integer\n\
1863\n\
1864Convert a 32-bit integer from network to host byte order.";
1865
1866
Guido van Rossum006bf911996-06-12 04:04:55 +00001867static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001868PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001869{
1870 int x1, x2;
1871
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001872 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001873 return NULL;
1874 }
1875 x2 = (int)htons((short)x1);
1876 return PyInt_FromLong(x2);
1877}
1878
Guido van Rossum82a5c661998-07-07 20:45:43 +00001879static char htons_doc[] =
1880"htons(integer) -> integer\n\
1881\n\
1882Convert a 16-bit integer from host to network byte order.";
1883
1884
Guido van Rossum006bf911996-06-12 04:04:55 +00001885static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001886PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00001887{
1888 int x1, x2;
1889
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001890 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00001891 return NULL;
1892 }
1893 x2 = htonl(x1);
1894 return PyInt_FromLong(x2);
1895}
1896
Guido van Rossum82a5c661998-07-07 20:45:43 +00001897static char htonl_doc[] =
1898"htonl(integer) -> integer\n\
1899\n\
1900Convert a 32-bit integer from host to network byte order.";
1901
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001902/*
1903 * socket.inet_aton() and socket.inet_ntoa() functions
1904 *
1905 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
1906 *
1907 */
1908
1909static char inet_aton_doc[] =
1910"inet_aton(string) -> packed 32-bit IP representation\n\
1911\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001912Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001913binary format used in low-level network functions.";
1914
1915static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001916PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001917{
Guido van Rossuma2e48551999-09-09 15:42:59 +00001918#ifndef INADDR_NONE
1919#define INADDR_NONE (-1)
1920#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001921
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001922 /* Have to use inet_addr() instead */
1923 char *ip_addr;
1924 long packed_addr;
1925
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001926 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001927 return NULL;
1928 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00001929#ifdef USE_GUSI1
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001930 packed_addr = (long)inet_addr(ip_addr).s_addr;
1931#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001932 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00001933#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001934
1935 if (packed_addr == INADDR_NONE) { /* invalid address */
1936 PyErr_SetString(PySocket_Error,
1937 "illegal IP address string passed to inet_aton");
1938 return NULL;
1939 }
1940
1941 return PyString_FromStringAndSize((char *) &packed_addr,
1942 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001943}
1944
1945static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00001946"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001947\n\
1948Convert an IP address from 32-bit packed binary format to string format";
1949
1950static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001951PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001952{
1953 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00001954 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001955 struct in_addr packed_addr;
1956
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001957 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00001958 return NULL;
1959 }
1960
1961 if (addr_len != sizeof(packed_addr)) {
1962 PyErr_SetString(PySocket_Error,
1963 "packed IP wrong length for inet_ntoa");
1964 return NULL;
1965 }
1966
1967 memcpy(&packed_addr, packed_str, addr_len);
1968
1969 return PyString_FromString(inet_ntoa(packed_addr));
1970}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001971
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001972
1973#ifdef USE_SSL
1974
1975/* This is a C function to be called for new object initialization */
1976static SSLObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001977newSSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001978{
1979 SSLObject *self;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001980
Guido van Rossumb18618d2000-05-03 23:44:39 +00001981 self = PyObject_New(SSLObject, &SSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001982 if (self == NULL){
1983 PyErr_SetObject(SSLErrorObject,
1984 PyString_FromString("newSSLObject error"));
1985 return NULL;
1986 }
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001987 memset(self->server, '\0', sizeof(char) * 256);
1988 memset(self->issuer, '\0', sizeof(char) * 256);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001989
1990 self->x_attr = PyDict_New();
1991 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
1992 if (self->ctx == NULL) {
1993 PyErr_SetObject(SSLErrorObject,
1994 PyString_FromString("SSL_CTX_new error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00001995 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00001996 return NULL;
1997 }
1998
1999 if ( (key_file && !cert_file) || (!key_file && cert_file) )
2000 {
2001 PyErr_SetObject(SSLErrorObject,
2002 PyString_FromString(
2003 "Both the key & certificate files must be specified"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002004 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002005 return NULL;
2006 }
2007
2008 if (key_file && cert_file)
2009 {
2010 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
2011 SSL_FILETYPE_PEM) < 1)
2012 {
2013 PyErr_SetObject(SSLErrorObject,
2014 PyString_FromString(
2015 "SSL_CTX_use_PrivateKey_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002016 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002017 return NULL;
2018 }
2019
2020 if (SSL_CTX_use_certificate_chain_file(self->ctx,
2021 cert_file) < 1)
2022 {
2023 PyErr_SetObject(SSLErrorObject,
2024 PyString_FromString(
2025 "SSL_CTX_use_certificate_chain_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002026 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002027 return NULL;
2028 }
2029 }
2030
2031 SSL_CTX_set_verify(self->ctx,
2032 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2033 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2034 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2035 SSL_set_connect_state(self->ssl);
2036
2037 if ((SSL_connect(self->ssl)) == -1) {
2038 /* Actually negotiate SSL connection */
2039 PyErr_SetObject(SSLErrorObject,
2040 PyString_FromString("SSL_connect error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002041 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002042 return NULL;
2043 }
2044 self->ssl->debug = 1;
2045
2046 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2047 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
2048 self->server, 256);
2049 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2050 self->issuer, 256);
2051 }
2052 self->x_attr = NULL;
2053 self->Socket = Sock;
2054 Py_INCREF(self->Socket);
2055 return self;
2056}
2057
2058/* This is the Python function called for new object initialization */
2059static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002060PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002061{
2062 SSLObject *rv;
2063 PySocketSockObject *Sock;
2064 char *key_file;
2065 char *cert_file;
2066
Guido van Rossum43713e52000-02-29 13:59:29 +00002067 if (!PyArg_ParseTuple(args, "O!zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002068 &PySocketSock_Type, (PyObject*)&Sock,
2069 &key_file, &cert_file) )
2070 return NULL;
2071
2072 rv = newSSLObject(Sock, key_file, cert_file);
2073 if ( rv == NULL )
2074 return NULL;
2075 return (PyObject *)rv;
2076}
2077
2078static char ssl_doc[] =
2079"ssl(socket, keyfile, certfile) -> sslobject";
2080
2081static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002082SSL_server(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002083{
2084 return PyString_FromString(self->server);
2085}
2086
2087static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002088SSL_issuer(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002089{
2090 return PyString_FromString(self->issuer);
2091}
2092
2093
2094/* SSL object methods */
2095
2096static PyMethodDef SSLMethods[] = {
2097 { "write", (PyCFunction)SSL_SSLwrite, 1 },
2098 { "read", (PyCFunction)SSL_SSLread, 1 },
2099 { "server", (PyCFunction)SSL_server, 1 },
2100 { "issuer", (PyCFunction)SSL_issuer, 1 },
2101 { NULL, NULL}
2102};
2103
2104static void SSL_dealloc(SSLObject *self)
2105{
2106 if (self->server_cert) /* Possible not to have one? */
2107 X509_free (self->server_cert);
2108 SSL_CTX_free(self->ctx);
2109 SSL_free(self->ssl);
2110 Py_XDECREF(self->x_attr);
2111 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002112 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002113}
2114
2115static PyObject *SSL_getattr(SSLObject *self, char *name)
2116{
2117 return Py_FindMethod(SSLMethods, (PyObject *)self, name);
2118}
2119
2120staticforward PyTypeObject SSL_Type = {
2121 PyObject_HEAD_INIT(&PyType_Type)
2122 0, /*ob_size*/
2123 "SSL", /*tp_name*/
2124 sizeof(SSLObject), /*tp_basicsize*/
2125 0, /*tp_itemsize*/
2126 /* methods */
2127 (destructor)SSL_dealloc, /*tp_dealloc*/
2128 0, /*tp_print*/
2129 (getattrfunc)SSL_getattr, /*tp_getattr*/
2130 0, /*tp_setattr*/
2131 0, /*tp_compare*/
2132 0, /*tp_repr*/
2133 0, /*tp_as_number*/
2134 0, /*tp_as_sequence*/
2135 0, /*tp_as_mapping*/
2136 0, /*tp_hash*/
2137};
2138
2139
2140
2141static PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args)
2142{
2143 char *data;
Fred Drakea04eaad2000-06-30 02:46:07 +00002144 size_t len = 0;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002145
Guido van Rossum43713e52000-02-29 13:59:29 +00002146 if (!PyArg_ParseTuple(args, "s|i:write", &data, &len))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002147 return NULL;
2148
2149 if (!len)
2150 len = strlen(data);
2151
2152 len = SSL_write(self->ssl, data, len);
2153 return PyInt_FromLong((long)len);
2154}
2155
2156static PyObject *SSL_SSLread(SSLObject *self, PyObject *args)
2157{
2158 PyObject *buf;
2159 int count = 0;
2160 int len = 1024;
2161 int res;
2162
Guido van Rossum43713e52000-02-29 13:59:29 +00002163 PyArg_ParseTuple(args, "|i:read", &len);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002164
2165 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2166 return NULL; /* Error object should already be set */
2167
2168 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2169 res = SSL_get_error(self->ssl, count);
2170
2171 switch (res) {
2172 case 0: /* Good return value! */
2173 break;
2174 case 6:
2175 PyErr_SetString(SSLErrorObject, "EOF");
2176 Py_DECREF(buf);
2177 return NULL;
2178 break;
2179 case 5:
2180 default:
2181 return PyErr_SetFromErrno(SSLErrorObject);
2182 break;
2183 }
2184
2185 fflush(stderr);
2186
2187 if (count < 0) {
2188 Py_DECREF(buf);
2189 return PyErr_SetFromErrno(SSLErrorObject);
2190 }
2191
2192 if (count != len && _PyString_Resize(&buf, count) < 0)
2193 return NULL;
2194 return buf;
2195}
2196
2197#endif /* USE_SSL */
2198
2199
Guido van Rossum30a685f1991-06-27 15:51:29 +00002200/* List of functions exported by this module. */
2201
Guido van Rossum73624e91994-10-10 17:59:00 +00002202static PyMethodDef PySocket_methods[] = {
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002203 {"gethostbyname", PySocket_gethostbyname, 1, gethostbyname_doc},
2204 {"gethostbyname_ex", PySocket_gethostbyname_ex, 1, ghbn_ex_doc},
2205 {"gethostbyaddr", PySocket_gethostbyaddr, 1, gethostbyaddr_doc},
2206 {"gethostname", PySocket_gethostname, 1, gethostname_doc},
2207 {"getservbyname", PySocket_getservbyname, 1, getservbyname_doc},
2208 {"getprotobyname", PySocket_getprotobyname, 1,getprotobyname_doc},
Guido van Rossum82a5c661998-07-07 20:45:43 +00002209 {"socket", PySocket_socket, 1, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002210#ifndef NO_DUP
Guido van Rossum82a5c661998-07-07 20:45:43 +00002211 {"fromfd", PySocket_fromfd, 1, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002212#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002213 {"ntohs", PySocket_ntohs, 1, ntohs_doc},
2214 {"ntohl", PySocket_ntohl, 1, ntohl_doc},
2215 {"htons", PySocket_htons, 1, htons_doc},
2216 {"htonl", PySocket_htonl, 1, htonl_doc},
2217 {"inet_aton", PySocket_inet_aton, 1, inet_aton_doc},
2218 {"inet_ntoa", PySocket_inet_ntoa, 1, inet_ntoa_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002219#ifdef USE_SSL
2220 {"ssl", PySocket_ssl, 1, ssl_doc},
2221#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002222 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002223};
2224
Guido van Rossum30a685f1991-06-27 15:51:29 +00002225
2226/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002227 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002228 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002229 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002230static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002231insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002232{
Guido van Rossum73624e91994-10-10 17:59:00 +00002233 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002234 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002235 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002236
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002237 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002238}
2239
Guido van Rossum30a685f1991-06-27 15:51:29 +00002240
Guido van Rossum8d665e61996-06-26 18:22:49 +00002241#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002242
2243/* Additional initialization and cleanup for NT/Windows */
2244
2245static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002246NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002247{
2248 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002249}
2250
2251static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002252NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002253{
2254 WSADATA WSAData;
2255 int ret;
2256 char buf[100];
2257 ret = WSAStartup(0x0101, &WSAData);
2258 switch (ret) {
2259 case 0: /* no error */
2260 atexit(NTcleanup);
2261 return 1;
2262 case WSASYSNOTREADY:
2263 PyErr_SetString(PyExc_ImportError,
2264 "WSAStartup failed: network not ready");
2265 break;
2266 case WSAVERNOTSUPPORTED:
2267 case WSAEINVAL:
2268 PyErr_SetString(PyExc_ImportError,
2269 "WSAStartup failed: requested version not supported");
2270 break;
2271 default:
2272 sprintf(buf, "WSAStartup failed: error code %d", ret);
2273 PyErr_SetString(PyExc_ImportError, buf);
2274 break;
2275 }
2276 return 0;
2277}
2278
Guido van Rossum8d665e61996-06-26 18:22:49 +00002279#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002280
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002281#if defined(PYOS_OS2)
2282
2283/* Additional initialization and cleanup for OS/2 */
2284
2285static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002286OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002287{
2288 /* No cleanup is necessary for OS/2 Sockets */
2289}
2290
2291static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002292OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002293{
2294 char reason[64];
2295 int rc = sock_init();
2296
2297 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002298 atexit(OS2cleanup);
2299 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002300 }
2301
2302 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2303 PyErr_SetString(PyExc_ImportError, reason);
2304
Guido van Rossum32c575d1997-12-02 20:37:32 +00002305 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002306}
2307
2308#endif /* PYOS_OS2 */
2309
Guido van Rossum30a685f1991-06-27 15:51:29 +00002310/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002311 * This is called when the first 'import socket' is done,
2312 * via a table in config.c, if config.c is compiled with USE_SOCKET
2313 * defined.
2314 *
2315 * For MS_WINDOWS (which means any Windows variant), this module
2316 * is actually called "_socket", and there's a wrapper "socket.py"
2317 * which implements some missing functionality (such as makefile(),
2318 * dup() and fromfd()). The import of "_socket" may fail with an
2319 * ImportError exception if initialization of WINSOCK fails. When
2320 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2321 * scheduled to be made at exit time.
2322 *
2323 * For OS/2, this module is also called "_socket" and uses a wrapper
2324 * "socket.py" which implements that functionality that is missing
2325 * when PC operating systems don't put socket descriptors in the
2326 * operating system's filesystem layer.
2327 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002328
Guido van Rossum82a5c661998-07-07 20:45:43 +00002329static char module_doc[] =
2330"This module provides socket operations and some related functions.\n\
2331On Unix, it supports IP (Internet Protocol) and Unix domain sockets.\n\
2332On other systems, it only supports IP.\n\
2333\n\
2334Functions:\n\
2335\n\
2336socket() -- create a new socket object\n\
2337fromfd() -- create a socket object from an open file descriptor (*)\n\
2338gethostname() -- return the current hostname\n\
2339gethostbyname() -- map a hostname to its IP number\n\
2340gethostbyaddr() -- map an IP number or hostname to DNS info\n\
2341getservbyname() -- map a service name and a protocol name to a port number\n\
2342getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\
2343ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\
2344htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002345inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format\n\
2346inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)\n\
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002347ssl() -- secure socket layer support (only available if configured)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002348\n\
2349(*) not available on all platforms!)\n\
2350\n\
2351Special objects:\n\
2352\n\
2353SocketType -- type object for socket objects\n\
2354error -- exception raised for I/O errors\n\
2355\n\
2356Integer constants:\n\
2357\n\
2358AF_INET, AF_UNIX -- socket domains (first argument to socket() call)\n\
2359SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)\n\
2360\n\
2361Many other constants may be defined; these may be used in calls to\n\
2362the setsockopt() and getsockopt() methods.\n\
2363";
2364
2365static char sockettype_doc[] =
2366"A socket represents one endpoint of a network connection.\n\
2367\n\
2368Methods:\n\
2369\n\
2370accept() -- accept a connection, returning new socket and client address\n\
2371bind() -- bind the socket to a local address\n\
2372close() -- close the socket\n\
2373connect() -- connect the socket to a remote address\n\
2374connect_ex() -- connect, return an error code instead of an exception \n\
2375dup() -- return a new socket object identical to the current one (*)\n\
2376fileno() -- return underlying file descriptor\n\
2377getpeername() -- return remote address (*)\n\
2378getsockname() -- return local address\n\
2379getsockopt() -- get socket options\n\
2380listen() -- start listening for incoming connections\n\
2381makefile() -- return a file object corresponding tot the socket (*)\n\
2382recv() -- receive data\n\
2383recvfrom() -- receive data and sender's address\n\
2384send() -- send data\n\
2385sendto() -- send data to a given address\n\
2386setblocking() -- set or clear the blocking I/O flag\n\
2387setsockopt() -- set socket options\n\
2388shutdown() -- shut down traffic in one or both directions\n\
2389\n\
2390(*) not available on all platforms!)";
2391
Guido van Rossum3886bb61998-12-04 18:50:17 +00002392DL_EXPORT(void)
Guido van Rossumbcc20741998-08-04 22:53:56 +00002393#if defined(MS_WINDOWS) || defined(PYOS_OS2) || defined(__BEOS__)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002394init_socket(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002395#else
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002396initsocket(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002397#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002398{
Guido van Rossum73624e91994-10-10 17:59:00 +00002399 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00002400#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002401 if (!NTinit())
2402 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002403 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002404#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002405#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002406 if (!OS2init())
2407 return;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002408 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002409#else
Guido van Rossumbcc20741998-08-04 22:53:56 +00002410#if defined(__BEOS__)
2411 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
2412#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00002413 m = Py_InitModule3("socket", PySocket_methods, module_doc);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002414#endif /* __BEOS__ */
Guido van Rossum32c575d1997-12-02 20:37:32 +00002415#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00002416#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002417 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002418 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2419 if (PySocket_Error == NULL)
2420 return;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002421#ifdef USE_SSL
2422 SSL_load_error_strings();
2423 SSLeay_add_ssl_algorithms();
2424 SSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2425 if (SSLErrorObject == NULL)
2426 return;
2427 PyDict_SetItemString(d, "sslerror", SSLErrorObject);
2428 Py_INCREF(&SSL_Type);
2429 if (PyDict_SetItemString(d, "SSLType",
2430 (PyObject *)&SSL_Type) != 0)
2431 return;
2432#endif /* USE_SSL */
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002433 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002434 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002435 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002436 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002437 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002438 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002439 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002440
2441 /* Address families (we only support AF_INET and AF_UNIX) */
2442#ifdef AF_UNSPEC
2443 insint(d, "AF_UNSPEC", AF_UNSPEC);
2444#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002445 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002446#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002447 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002448#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002449#ifdef AF_AX25
2450 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2451#endif
2452#ifdef AF_IPX
2453 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2454#endif
2455#ifdef AF_APPLETALK
2456 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2457#endif
2458#ifdef AF_NETROM
2459 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2460#endif
2461#ifdef AF_BRIDGE
2462 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2463#endif
2464#ifdef AF_AAL5
2465 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2466#endif
2467#ifdef AF_X25
2468 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2469#endif
2470#ifdef AF_INET6
2471 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2472#endif
2473#ifdef AF_ROSE
2474 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2475#endif
2476
2477 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002478 insint(d, "SOCK_STREAM", SOCK_STREAM);
2479 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002480#ifndef __BEOS__
2481/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002482 insint(d, "SOCK_RAW", SOCK_RAW);
2483 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2484 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002485#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002486
2487#ifdef SO_DEBUG
2488 insint(d, "SO_DEBUG", SO_DEBUG);
2489#endif
2490#ifdef SO_ACCEPTCONN
2491 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2492#endif
2493#ifdef SO_REUSEADDR
2494 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
2495#endif
2496#ifdef SO_KEEPALIVE
2497 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
2498#endif
2499#ifdef SO_DONTROUTE
2500 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
2501#endif
2502#ifdef SO_BROADCAST
2503 insint(d, "SO_BROADCAST", SO_BROADCAST);
2504#endif
2505#ifdef SO_USELOOPBACK
2506 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
2507#endif
2508#ifdef SO_LINGER
2509 insint(d, "SO_LINGER", SO_LINGER);
2510#endif
2511#ifdef SO_OOBINLINE
2512 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
2513#endif
2514#ifdef SO_REUSEPORT
2515 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
2516#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002517#ifdef SO_SNDBUF
2518 insint(d, "SO_SNDBUF", SO_SNDBUF);
2519#endif
2520#ifdef SO_RCVBUF
2521 insint(d, "SO_RCVBUF", SO_RCVBUF);
2522#endif
2523#ifdef SO_SNDLOWAT
2524 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
2525#endif
2526#ifdef SO_RCVLOWAT
2527 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
2528#endif
2529#ifdef SO_SNDTIMEO
2530 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
2531#endif
2532#ifdef SO_RCVTIMEO
2533 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
2534#endif
2535#ifdef SO_ERROR
2536 insint(d, "SO_ERROR", SO_ERROR);
2537#endif
2538#ifdef SO_TYPE
2539 insint(d, "SO_TYPE", SO_TYPE);
2540#endif
2541
2542 /* Maximum number of connections for "listen" */
2543#ifdef SOMAXCONN
2544 insint(d, "SOMAXCONN", SOMAXCONN);
2545#else
2546 insint(d, "SOMAXCONN", 5); /* Common value */
2547#endif
2548
2549 /* Flags for send, recv */
2550#ifdef MSG_OOB
2551 insint(d, "MSG_OOB", MSG_OOB);
2552#endif
2553#ifdef MSG_PEEK
2554 insint(d, "MSG_PEEK", MSG_PEEK);
2555#endif
2556#ifdef MSG_DONTROUTE
2557 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
2558#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002559#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00002560 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002561#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002562#ifdef MSG_EOR
2563 insint(d, "MSG_EOR", MSG_EOR);
2564#endif
2565#ifdef MSG_TRUNC
2566 insint(d, "MSG_TRUNC", MSG_TRUNC);
2567#endif
2568#ifdef MSG_CTRUNC
2569 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
2570#endif
2571#ifdef MSG_WAITALL
2572 insint(d, "MSG_WAITALL", MSG_WAITALL);
2573#endif
2574#ifdef MSG_BTAG
2575 insint(d, "MSG_BTAG", MSG_BTAG);
2576#endif
2577#ifdef MSG_ETAG
2578 insint(d, "MSG_ETAG", MSG_ETAG);
2579#endif
2580
2581 /* Protocol level and numbers, usable for [gs]etsockopt */
2582#ifdef SOL_SOCKET
2583 insint(d, "SOL_SOCKET", SOL_SOCKET);
2584#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002585#ifdef SOL_IP
2586 insint(d, "SOL_IP", SOL_IP);
2587#else
2588 insint(d, "SOL_IP", 0);
2589#endif
2590#ifdef SOL_IPX
2591 insint(d, "SOL_IPX", SOL_IPX);
2592#endif
2593#ifdef SOL_AX25
2594 insint(d, "SOL_AX25", SOL_AX25);
2595#endif
2596#ifdef SOL_ATALK
2597 insint(d, "SOL_ATALK", SOL_ATALK);
2598#endif
2599#ifdef SOL_NETROM
2600 insint(d, "SOL_NETROM", SOL_NETROM);
2601#endif
2602#ifdef SOL_ROSE
2603 insint(d, "SOL_ROSE", SOL_ROSE);
2604#endif
2605#ifdef SOL_TCP
2606 insint(d, "SOL_TCP", SOL_TCP);
2607#else
2608 insint(d, "SOL_TCP", 6);
2609#endif
2610#ifdef SOL_UDP
2611 insint(d, "SOL_UDP", SOL_UDP);
2612#else
2613 insint(d, "SOL_UDP", 17);
2614#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002615#ifdef IPPROTO_IP
2616 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002617#else
2618 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002619#endif
2620#ifdef IPPROTO_ICMP
2621 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002622#else
2623 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002624#endif
2625#ifdef IPPROTO_IGMP
2626 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
2627#endif
2628#ifdef IPPROTO_GGP
2629 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
2630#endif
2631#ifdef IPPROTO_TCP
2632 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002633#else
2634 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002635#endif
2636#ifdef IPPROTO_EGP
2637 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
2638#endif
2639#ifdef IPPROTO_PUP
2640 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
2641#endif
2642#ifdef IPPROTO_UDP
2643 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002644#else
2645 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002646#endif
2647#ifdef IPPROTO_IDP
2648 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
2649#endif
2650#ifdef IPPROTO_HELLO
2651 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
2652#endif
2653#ifdef IPPROTO_ND
2654 insint(d, "IPPROTO_ND", IPPROTO_ND);
2655#endif
2656#ifdef IPPROTO_TP
2657 insint(d, "IPPROTO_TP", IPPROTO_TP);
2658#endif
2659#ifdef IPPROTO_XTP
2660 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
2661#endif
2662#ifdef IPPROTO_EON
2663 insint(d, "IPPROTO_EON", IPPROTO_EON);
2664#endif
2665#ifdef IPPROTO_BIP
2666 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
2667#endif
2668/**/
2669#ifdef IPPROTO_RAW
2670 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00002671#else
2672 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002673#endif
2674#ifdef IPPROTO_MAX
2675 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
2676#endif
2677
2678 /* Some port configuration */
2679#ifdef IPPORT_RESERVED
2680 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
2681#else
2682 insint(d, "IPPORT_RESERVED", 1024);
2683#endif
2684#ifdef IPPORT_USERRESERVED
2685 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
2686#else
2687 insint(d, "IPPORT_USERRESERVED", 5000);
2688#endif
2689
Guido van Rossum5f05eb41995-02-17 15:11:07 +00002690 /* Some reserved IP v.4 addresses */
2691#ifdef INADDR_ANY
2692 insint(d, "INADDR_ANY", INADDR_ANY);
2693#else
2694 insint(d, "INADDR_ANY", 0x00000000);
2695#endif
2696#ifdef INADDR_BROADCAST
2697 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
2698#else
2699 insint(d, "INADDR_BROADCAST", 0xffffffff);
2700#endif
2701#ifdef INADDR_LOOPBACK
2702 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
2703#else
2704 insint(d, "INADDR_LOOPBACK", 0x7F000001);
2705#endif
2706#ifdef INADDR_UNSPEC_GROUP
2707 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
2708#else
2709 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
2710#endif
2711#ifdef INADDR_ALLHOSTS_GROUP
2712 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
2713#else
2714 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
2715#endif
2716#ifdef INADDR_MAX_LOCAL_GROUP
2717 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
2718#else
2719 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
2720#endif
2721#ifdef INADDR_NONE
2722 insint(d, "INADDR_NONE", INADDR_NONE);
2723#else
2724 insint(d, "INADDR_NONE", 0xffffffff);
2725#endif
2726
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002727 /* IP [gs]etsockopt options */
2728#ifdef IP_OPTIONS
2729 insint(d, "IP_OPTIONS", IP_OPTIONS);
2730#endif
2731#ifdef IP_HDRINCL
2732 insint(d, "IP_HDRINCL", IP_HDRINCL);
2733#endif
2734#ifdef IP_TOS
2735 insint(d, "IP_TOS", IP_TOS);
2736#endif
2737#ifdef IP_TTL
2738 insint(d, "IP_TTL", IP_TTL);
2739#endif
2740#ifdef IP_RECVOPTS
2741 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
2742#endif
2743#ifdef IP_RECVRETOPTS
2744 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
2745#endif
2746#ifdef IP_RECVDSTADDR
2747 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
2748#endif
2749#ifdef IP_RETOPTS
2750 insint(d, "IP_RETOPTS", IP_RETOPTS);
2751#endif
2752#ifdef IP_MULTICAST_IF
2753 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
2754#endif
2755#ifdef IP_MULTICAST_TTL
2756 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
2757#endif
2758#ifdef IP_MULTICAST_LOOP
2759 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
2760#endif
2761#ifdef IP_ADD_MEMBERSHIP
2762 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
2763#endif
2764#ifdef IP_DROP_MEMBERSHIP
2765 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
2766#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002767#ifdef IP_DEFAULT_MULTICAST_TTL
2768 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
2769#endif
2770#ifdef IP_DEFAULT_MULTICAST_LOOP
2771 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
2772#endif
2773#ifdef IP_MAX_MEMBERSHIPS
2774 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
2775#endif
2776
2777 /* TCP options */
2778#ifdef TCP_NODELAY
2779 insint(d, "TCP_NODELAY", TCP_NODELAY);
2780#endif
2781#ifdef TCP_MAXSEG
2782 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
2783#endif
2784
2785 /* IPX options */
2786#ifdef IPX_TYPE
2787 insint(d, "IPX_TYPE", IPX_TYPE);
2788#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002789
2790 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002791#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00002792 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002793#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002794}