blob: 1c19c28b3d526943f4ea1279acfcb62c22dc2475 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003/* SSL support based on patches by Brian E Gallew and Laszlo Kovacs */
4
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005/*
6This module provides an interface to Berkeley socket IPC.
7
8Limitations:
9
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000010- only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Jeremy Hylton22308652001-02-02 03:23:09 +000011 portable manner, though AF_PACKET is supported under Linux.
Guido van Rossum81194471991-07-27 21:42:02 +000012- no read/write operations (use send/recv or makefile instead)
Guido van Rossumbe32c891996-06-20 16:25:29 +000013- additional restrictions apply on Windows
Guido van Rossum6574b3e1991-06-25 21:36:08 +000014
Guido van Rossum27e177d1995-03-16 15:43:47 +000015Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000016
Guido van Rossum27e177d1995-03-16 15:43:47 +000017- socket.error: exception raised for socket specific errors
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000018- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
19 a subclass of socket.error
20- socket.herror: exception raised for gethostby* errors,
21 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000022- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000023- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000024- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000025- socket.getprotobyname(protocolname) --> protocol number
Guido van Rossum27e177d1995-03-16 15:43:47 +000026- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000027- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum006bf911996-06-12 04:04:55 +000028- socket.ntohs(16 bit value) --> new int object
29- socket.ntohl(32 bit value) --> new int object
30- socket.htons(16 bit value) --> new int object
31- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000032- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
33 --> List of (family, socktype, proto, canonname, sockaddr)
34- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000035- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +000036- socket.inet_aton(IP address) -> 32-bit packed IP representation
37- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum09c8b6c1999-12-07 21:37:17 +000038- socket.ssl(socket, keyfile, certfile) -> new ssl object
Guido van Rossum6574b3e1991-06-25 21:36:08 +000039- an Internet socket address is a pair (hostname, port)
40 where hostname can be anything recognized by gethostbyname()
41 (including the dd.dd.dd.dd notation) and port is in host byte order
42- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000043- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000044- an AF_PACKET socket address is a tuple containing a string
45 specifying the ethernet interface and an integer specifying
46 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000047 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
48 specify packet-type and ha-type/addr -- these are ignored by
Jeremy Hylton22308652001-02-02 03:23:09 +000049 networking code, but accepted since they are returned by the
50 getsockname() method.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000051
Guido van Rossum30a685f1991-06-27 15:51:29 +000052Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000053
Guido van Rossum81194471991-07-27 21:42:02 +000054- s.accept() --> new socket object, sockaddr
Fred Drake728819a2000-07-01 03:40:12 +000055- s.bind(sockaddr) --> None
Guido van Rossum27e177d1995-03-16 15:43:47 +000056- s.close() --> None
Fred Drake728819a2000-07-01 03:40:12 +000057- s.connect(sockaddr) --> None
58- s.connect_ex(sockaddr) --> 0 or errno (handy for e.g. async connect)
Guido van Rossum27e177d1995-03-16 15:43:47 +000059- s.fileno() --> file descriptor
Guido van Rossumbe32c891996-06-20 16:25:29 +000060- s.dup() --> same as socket.fromfd(os.dup(s.fileno(), ...)
Guido van Rossumc89705d1992-11-26 08:54:07 +000061- s.getpeername() --> sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000062- s.getsockname() --> sockaddr
63- s.getsockopt(level, optname[, buflen]) --> int or string
64- s.listen(backlog) --> None
Guido van Rossum6b144911995-03-14 15:05:13 +000065- s.makefile([mode[, bufsize]]) --> file object
Guido van Rossum27e177d1995-03-16 15:43:47 +000066- s.recv(buflen [,flags]) --> string
67- s.recvfrom(buflen [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000068- s.send(string [,flags]) --> nbytes
69- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum27e177d1995-03-16 15:43:47 +000070- s.setblocking(0 | 1) --> None
71- s.setsockopt(level, optname, value) --> None
72- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000073- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000074
Guido van Rossum6574b3e1991-06-25 21:36:08 +000075*/
76
Guido van Rossum73624e91994-10-10 17:59:00 +000077#include "Python.h"
Guido van Rossum3baaa131999-03-22 21:44:51 +000078
Guido van Rossum9376b741999-09-15 22:01:40 +000079/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
80 script doesn't get this right, so we hardcode some platform checks below.
81 On the other hand, not all Linux versions agree, so there the settings
82 computed by the configure script are needed! */
83
84#ifndef linux
Guido van Rossume7de2061999-03-24 17:24:33 +000085#undef HAVE_GETHOSTBYNAME_R_3_ARG
86#undef HAVE_GETHOSTBYNAME_R_5_ARG
87#undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +000088#endif
Guido van Rossume7de2061999-03-24 17:24:33 +000089
Guido van Rossum7a122991999-04-13 04:07:32 +000090#ifndef WITH_THREAD
91#undef HAVE_GETHOSTBYNAME_R
92#endif
93
Guido van Rossume7de2061999-03-24 17:24:33 +000094#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +000095#if defined(_AIX) || defined(__osf__)
Guido van Rossume7de2061999-03-24 17:24:33 +000096#define HAVE_GETHOSTBYNAME_R_3_ARG
97#elif defined(__sun__) || defined(__sgi)
98#define HAVE_GETHOSTBYNAME_R_5_ARG
99#elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000100/* Rely on the configure script */
Guido van Rossume7de2061999-03-24 17:24:33 +0000101#else
102#undef HAVE_GETHOSTBYNAME_R
103#endif
104#endif
105
Guido van Rossum3baaa131999-03-22 21:44:51 +0000106#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && !defined(MS_WINDOWS)
107#define USE_GETHOSTBYNAME_LOCK
108#endif
109
110#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum49b56061998-10-01 20:42:43 +0000111#include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000112#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000113
Guido van Rossuma376cc51996-12-05 23:43:35 +0000114#ifdef HAVE_UNISTD_H
115#include <unistd.h>
116#endif
117
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000118#if defined(PYCC_VACPP)
119#include <types.h>
120#include <io.h>
121#include <sys/ioctl.h>
122#include <utils.h>
123#include <ctype.h>
124#endif
125
126#if defined(PYOS_OS2)
127#define INCL_DOS
128#define INCL_DOSERRORS
129#define INCL_NOPMAPI
130#include <os2.h>
131#endif
132
Guido van Rossum48a680c2001-03-02 06:34:14 +0000133#ifdef RISCOS
134#define NO_DUP
135#undef off_t
136#undef uid_t
137#undef gid_t
138#undef errno
139#include <signal.h>
140#include "socklib.h"
141#include "inetlib.h"
142#include "netdb.h"
143#include "unixlib.h"
144#include "netinet/in.h"
145#include "sys/ioctl.h"
146#else /*RISCOS*/
147
Guido van Rossumb6775db1994-08-01 11:34:53 +0000148#include <sys/types.h>
Guido van Rossumed233a51992-06-23 09:07:03 +0000149
Guido van Rossum81194471991-07-27 21:42:02 +0000150#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000151#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000152#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000153#include <sys/socket.h>
154#include <netinet/in.h>
Fred Drake51d90362000-10-06 15:37:06 +0000155#if !(defined(__BEOS__) || defined(__CYGWIN__))
Andrew M. Kuchling52a644c2000-03-31 17:24:30 +0000156#include <netinet/tcp.h>
Fred Drake11b09362000-05-16 13:30:12 +0000157#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000158
Guido van Rossum9376b741999-09-15 22:01:40 +0000159/* Headers needed for inet_ntoa() and inet_addr() */
160#ifdef __BEOS__
161#include <net/netdb.h>
162#else
Guido van Rossumff3ab422000-04-24 15:16:03 +0000163#ifndef USE_GUSI1
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000164#include <arpa/inet.h>
Guido van Rossum9376b741999-09-15 22:01:40 +0000165#endif
Guido van Rossum1b6e4631999-11-04 18:22:29 +0000166#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000167
Guido van Rossume4485b01994-09-07 14:32:49 +0000168#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000169#else
170#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000171#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000172#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000173
174#endif /*RISCOS*/
175
Guido van Rossumb6775db1994-08-01 11:34:53 +0000176#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000177#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000178#else
179#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000180#endif
181
Jeremy Hylton22308652001-02-02 03:23:09 +0000182#if defined(linux) && defined(AF_PACKET)
183#include <sys/ioctl.h>
184#include <net/if.h>
185#include <netpacket/packet.h>
186#endif
187
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000188#ifdef HAVE_STDDEF_H
189#include <stddef.h>
190#endif
191
192#ifndef offsetof
193#define offsetof(type, member) ((size_t)(&((type *)0)->member))
194#endif
195
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000196#ifndef O_NDELAY
197#define O_NDELAY O_NONBLOCK /* For QNX only? */
198#endif
199
Guido van Rossumff3ab422000-04-24 15:16:03 +0000200#ifdef USE_GUSI1
Jack Jansen508537b1996-02-14 15:57:45 +0000201/* fdopen() isn't declared in stdio.h (sigh) */
202#include <GUSI.h>
203#endif
204
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000205#include "addrinfo.h"
206
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000207#ifdef USE_SSL
Andrew M. Kuchling697a0b02001-01-18 17:41:41 +0000208#include "openssl/rsa.h"
209#include "openssl/crypto.h"
210#include "openssl/x509.h"
211#include "openssl/pem.h"
212#include "openssl/ssl.h"
213#include "openssl/err.h"
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000214#endif /* USE_SSL */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000215
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000216#ifndef HAVE_INET_PTON
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000217int inet_pton (int af, const char *src, void *dst);
218const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000219#endif
220
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000221/* I know this is a bad practice, but it is the easiest... */
222#ifndef HAVE_GETADDRINFO
223#include "getaddrinfo.c"
224#endif
225#ifndef HAVE_GETNAMEINFO
226#include "getnameinfo.c"
227#endif
228
Guido van Rossumbcc20741998-08-04 22:53:56 +0000229#if defined(MS_WINDOWS) || defined(__BEOS__)
230/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000231/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000232#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000233#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000234#endif
235
Fred Drakea04eaad2000-06-30 02:46:07 +0000236/* abstract the socket file descriptor type */
237#ifdef MS_WINDOWS
238typedef SOCKET SOCKET_T;
239# ifdef MS_WIN64
240# define SIZEOF_SOCKET_T 8
241# else
242# define SIZEOF_SOCKET_T 4
243# endif
244#else
245typedef int SOCKET_T;
246# define SIZEOF_SOCKET_T SIZEOF_INT
247#endif
248
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000249#ifdef MS_WIN32
250# define EAFNOSUPPORT WSAEAFNOSUPPORT
251# define snprintf _snprintf
252#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000253
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000254#if defined(PYOS_OS2)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000255#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000256#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000257#endif
258
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000259#ifndef SOCKETCLOSE
260#define SOCKETCLOSE close
261#endif
262
Guido van Rossum30a685f1991-06-27 15:51:29 +0000263/* Global variable holding the exception type for errors detected
264 by this module (but not argument type or memory errors, etc.). */
265
Guido van Rossum73624e91994-10-10 17:59:00 +0000266static PyObject *PySocket_Error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000267static PyObject *PyH_Error;
268static PyObject *PyGAI_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000269
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000270#ifdef USE_SSL
271static PyObject *SSLErrorObject;
272#endif /* USE_SSL */
273
Guido van Rossum30a685f1991-06-27 15:51:29 +0000274
Guido van Rossum48a680c2001-03-02 06:34:14 +0000275#ifdef RISCOS
276/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
277static int taskwindow;
278#endif
279
280
Guido van Rossum30a685f1991-06-27 15:51:29 +0000281/* Convenience function to raise an error according to errno
282 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000283
Guido van Rossum73624e91994-10-10 17:59:00 +0000284static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000285PySocket_Err(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000286{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000287#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000288 int err_no = WSAGetLastError();
289 if (err_no) {
290 static struct { int no; const char *msg; } *msgp, msgs[] = {
291 { WSAEINTR, "Interrupted system call" },
292 { WSAEBADF, "Bad file descriptor" },
293 { WSAEACCES, "Permission denied" },
294 { WSAEFAULT, "Bad address" },
295 { WSAEINVAL, "Invalid argument" },
296 { WSAEMFILE, "Too many open files" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000297 { WSAEWOULDBLOCK,
Mark Hammond46a733d2000-07-24 01:45:11 +0000298 "The socket operation could not complete "
299 "without blocking" },
300 { WSAEINPROGRESS, "Operation now in progress" },
301 { WSAEALREADY, "Operation already in progress" },
302 { WSAENOTSOCK, "Socket operation on non-socket" },
303 { WSAEDESTADDRREQ, "Destination address required" },
304 { WSAEMSGSIZE, "Message too long" },
305 { WSAEPROTOTYPE, "Protocol wrong type for socket" },
306 { WSAENOPROTOOPT, "Protocol not available" },
307 { WSAEPROTONOSUPPORT, "Protocol not supported" },
308 { WSAESOCKTNOSUPPORT, "Socket type not supported" },
309 { WSAEOPNOTSUPP, "Operation not supported" },
310 { WSAEPFNOSUPPORT, "Protocol family not supported" },
311 { WSAEAFNOSUPPORT, "Address family not supported" },
312 { WSAEADDRINUSE, "Address already in use" },
313 { WSAEADDRNOTAVAIL,
314 "Can't assign requested address" },
315 { WSAENETDOWN, "Network is down" },
316 { WSAENETUNREACH, "Network is unreachable" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000317 { WSAENETRESET,
Mark Hammond46a733d2000-07-24 01:45:11 +0000318 "Network dropped connection on reset" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000319 { WSAECONNABORTED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000320 "Software caused connection abort" },
321 { WSAECONNRESET, "Connection reset by peer" },
322 { WSAENOBUFS, "No buffer space available" },
323 { WSAEISCONN, "Socket is already connected" },
324 { WSAENOTCONN, "Socket is not connected" },
325 { WSAESHUTDOWN, "Can't send after socket shutdown" },
326 { WSAETOOMANYREFS,
327 "Too many references: can't splice" },
328 { WSAETIMEDOUT, "Operation timed out" },
329 { WSAECONNREFUSED, "Connection refused" },
330 { WSAELOOP, "Too many levels of symbolic links" },
331 { WSAENAMETOOLONG, "File name too long" },
332 { WSAEHOSTDOWN, "Host is down" },
333 { WSAEHOSTUNREACH, "No route to host" },
334 { WSAENOTEMPTY, "Directory not empty" },
335 { WSAEPROCLIM, "Too many processes" },
336 { WSAEUSERS, "Too many users" },
337 { WSAEDQUOT, "Disc quota exceeded" },
338 { WSAESTALE, "Stale NFS file handle" },
339 { WSAEREMOTE, "Too many levels of remote in path" },
340 { WSASYSNOTREADY,
341 "Network subsystem is unvailable" },
342 { WSAVERNOTSUPPORTED,
343 "WinSock version is not supported" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000344 { WSANOTINITIALISED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000345 "Successful WSAStartup() not yet performed" },
346 { WSAEDISCON, "Graceful shutdown in progress" },
347 /* Resolver errors */
348 { WSAHOST_NOT_FOUND, "No such host is known" },
349 { WSATRY_AGAIN, "Host not found, or server failed" },
350 { WSANO_RECOVERY,
351 "Unexpected server error encountered" },
352 { WSANO_DATA, "Valid name without requested data" },
353 { WSANO_ADDRESS, "No address, look for MX record" },
354 { 0, NULL }
355 };
Guido van Rossum73624e91994-10-10 17:59:00 +0000356 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000357 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000358
Mark Hammond46a733d2000-07-24 01:45:11 +0000359 for (msgp = msgs; msgp->msg; msgp++) {
360 if (err_no == msgp->no) {
361 msg = msgp->msg;
362 break;
363 }
364 }
365
366 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000367 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000368 PyErr_SetObject(PySocket_Error, v);
369 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000370 }
371 return NULL;
372 }
373 else
374#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000375
376#if defined(PYOS_OS2)
377 if (sock_errno() != NO_ERROR) {
378 APIRET rc;
379 ULONG msglen;
380 char outbuf[100];
381 int myerrorcode = sock_errno();
382
383 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
384 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
385 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
386 if (rc == NO_ERROR) {
387 PyObject *v;
388
389 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
390 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
391 char *lastc = &outbuf[ strlen(outbuf)-1 ];
392 while (lastc > outbuf && isspace(*lastc))
393 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
394 }
395 v = Py_BuildValue("(is)", myerrorcode, outbuf);
396 if (v != NULL) {
397 PyErr_SetObject(PySocket_Error, v);
398 Py_DECREF(v);
399 }
400 return NULL;
401 }
402 }
403#endif
404
Guido van Rossum73624e91994-10-10 17:59:00 +0000405 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000406}
407
Guido van Rossum30a685f1991-06-27 15:51:29 +0000408
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000409static PyObject *
410PyH_Err(int h_error)
411{
412 PyObject *v;
413
414#ifdef HAVE_HSTRERROR
415 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
416#else
417 v = Py_BuildValue("(is)", h_error, "host not found");
418#endif
419 if (v != NULL) {
420 PyErr_SetObject(PyGAI_Error, v);
421 Py_DECREF(v);
422 }
423
424 return NULL;
425}
426
427
428static PyObject *
429PyGAI_Err(int error)
430{
431 PyObject *v;
432
433 if (error == EAI_SYSTEM)
434 return PySocket_Err();
435
436 v = Py_BuildValue("(is)", error, gai_strerror(error));
437 if (v != NULL) {
438 PyErr_SetObject(PyGAI_Error, v);
439 Py_DECREF(v);
440 }
441
442 return NULL;
443}
444
445
Guido van Rossum30a685f1991-06-27 15:51:29 +0000446/* The object holding a socket. It holds some extra information,
447 like the address family, which is used to decode socket address
448 arguments properly. */
449
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000450typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000451 PyObject_HEAD
Fred Drakea04eaad2000-06-30 02:46:07 +0000452 SOCKET_T sock_fd; /* Socket file descriptor */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000453 int sock_family; /* Address family, e.g., AF_INET */
454 int sock_type; /* Socket type, e.g., SOCK_STREAM */
455 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000456 union sock_addr {
457 struct sockaddr_in in;
458#ifdef AF_UNIX
459 struct sockaddr_un un;
460#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000461#ifdef INET6
462 struct sockaddr_in6 in6;
463 struct sockaddr_storage storage;
464#endif
Jeremy Hylton22308652001-02-02 03:23:09 +0000465#if defined(linux) && defined(AF_PACKET)
466 struct sockaddr_ll ll;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000467#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000468 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000469} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000470
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000471#ifdef USE_SSL
Guido van Rossum30a685f1991-06-27 15:51:29 +0000472
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000473typedef struct {
474 PyObject_HEAD
475 PySocketSockObject *Socket; /* Socket on which we're layered */
476 PyObject *x_attr; /* Attributes dictionary */
477 SSL_CTX* ctx;
478 SSL* ssl;
479 X509* server_cert;
480 BIO* sbio;
481 char server[256];
482 char issuer[256];
483
484} SSLObject;
485
486staticforward PyTypeObject SSL_Type;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000487staticforward PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args);
488staticforward PyObject *SSL_SSLread(SSLObject *self, PyObject *args);
489
490#define SSLObject_Check(v) ((v)->ob_type == &SSL_Type)
491
492#endif /* USE_SSL */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000493
Guido van Rossum30a685f1991-06-27 15:51:29 +0000494/* A forward reference to the Socktype type object.
495 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000496 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000497 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000498
Guido van Rossum73624e91994-10-10 17:59:00 +0000499staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000500
Guido van Rossum30a685f1991-06-27 15:51:29 +0000501
502/* Create a new socket object.
503 This just creates the object and initializes it.
504 If the creation fails, return NULL and set an exception (implicit
505 in NEWOBJ()). */
506
Guido van Rossum73624e91994-10-10 17:59:00 +0000507static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000508PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000509{
Guido van Rossum48a680c2001-03-02 06:34:14 +0000510#ifdef RISCOS
511 int block = 1;
512#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000513 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000514 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000515 s = PyObject_New(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000516 if (s != NULL) {
517 s->sock_fd = fd;
518 s->sock_family = family;
519 s->sock_type = type;
520 s->sock_proto = proto;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000521#ifdef RISCOS
522 if(taskwindow) {
523 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
524 }
525#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000526 }
527 return s;
528}
529
Guido van Rossum30a685f1991-06-27 15:51:29 +0000530
Guido van Rossum48a680c2001-03-02 06:34:14 +0000531/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000532 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000533#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000534PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000535#endif
536
537
Guido van Rossum30a685f1991-06-27 15:51:29 +0000538/* Convert a string specifying a host name or one of a few symbolic
539 names to a numeric IP address. This usually calls gethostbyname()
540 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000541 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000542 an error occurred; then an exception is raised. */
543
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000544static int
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000545setipaddr(char* name, struct sockaddr * addr_ret, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000546{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000547 struct addrinfo hints, *res;
548 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000549
Guido van Rossuma376cc51996-12-05 23:43:35 +0000550 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000551 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000552 int siz;
553 memset(&hints, 0, sizeof(hints));
554 hints.ai_family = af;
555 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
556 hints.ai_flags = AI_PASSIVE;
557 error = getaddrinfo(NULL, "0", &hints, &res);
558 if (error) {
559 PyGAI_Err(error);
560 return -1;
561 }
562 switch (res->ai_family) {
563 case AF_INET:
564 siz = 4;
565 break;
566#ifdef INET6
567 case AF_INET6:
568 siz = 16;
569 break;
570#endif
571 default:
572 freeaddrinfo(res);
573 PyErr_SetString(PySocket_Error,
574 "unsupported address family");
575 return -1;
576 }
577 if (res->ai_next) {
578 PyErr_SetString(PySocket_Error,
579 "wildcard resolved to multiple address");
580 return -1;
581 }
582 memcpy(addr_ret, res->ai_addr, res->ai_addrlen);
583 freeaddrinfo(res);
584 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000585 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000586 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000587 struct sockaddr_in *sin;
588 if (af != PF_INET && af != PF_UNSPEC) {
589 PyErr_SetString(PySocket_Error,
590 "address family mismatched");
591 return -1;
592 }
593 sin = (struct sockaddr_in *)addr_ret;
594 memset((void *) sin, '\0', sizeof(*sin));
595 sin->sin_family = AF_INET;
596#ifdef HAVE_SOCKADDR_SA_LEN
597 sin->sin_len = sizeof(*sin);
598#endif
599 sin->sin_addr.s_addr = INADDR_BROADCAST;
600 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000601 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000602 memset(&hints, 0, sizeof(hints));
603 hints.ai_family = af;
604 error = getaddrinfo(name, NULL, &hints, &res);
605 if (error) {
606 PyGAI_Err(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000607 return -1;
608 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000609 memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
610 freeaddrinfo(res);
611 switch (addr_ret->sa_family) {
612 case AF_INET:
613 return 4;
614#ifdef INET6
615 case AF_INET6:
616 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000617#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000618 default:
619 PyErr_SetString(PySocket_Error, "unknown address family");
620 return -1;
621 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000622}
623
Guido van Rossum30a685f1991-06-27 15:51:29 +0000624
Guido van Rossum30a685f1991-06-27 15:51:29 +0000625/* Create a string object representing an IP address.
626 This is always a string of the form 'dd.dd.dd.dd' (with variable
627 size numbers). */
628
Guido van Rossum73624e91994-10-10 17:59:00 +0000629static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000630makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000631{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000632 char buf[NI_MAXHOST];
633 int error;
634
635 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
636 NI_NUMERICHOST);
637 if (error) {
638 PyGAI_Err(error);
639 return NULL;
640 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000641 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000642}
643
644
645/* Create an object representing the given socket address,
646 suitable for passing it back to bind(), connect() etc.
647 The family field of the sockaddr structure is inspected
648 to determine what kind of address it really is. */
649
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000650/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000651static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000652makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000653{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000654 if (addrlen == 0) {
655 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000656 Py_INCREF(Py_None);
657 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000658 }
659
Guido van Rossumbcc20741998-08-04 22:53:56 +0000660#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000661 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000662 addr->sa_family = AF_INET;
663#endif
664
Guido van Rossum30a685f1991-06-27 15:51:29 +0000665 switch (addr->sa_family) {
666
667 case AF_INET:
668 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000669 struct sockaddr_in *a;
670 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000671 PyObject *ret = NULL;
672 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000673 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000674 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
675 Py_DECREF(addrobj);
676 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000677 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000678 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000679
Guido van Rossumb6775db1994-08-01 11:34:53 +0000680#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000681 case AF_UNIX:
682 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000683 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000684 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000685 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000686#endif /* AF_UNIX */
687
688#ifdef INET6
689 case AF_INET6:
690 {
691 struct sockaddr_in6 *a;
692 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
693 PyObject *ret = NULL;
694 if (addrobj) {
695 a = (struct sockaddr_in6 *)addr;
696 ret = Py_BuildValue("Oiii", addrobj, ntohs(a->sin6_port),
697 a->sin6_flowinfo, a->sin6_scope_id);
698 Py_DECREF(addrobj);
699 }
700 return ret;
701 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000702#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000703
Jeremy Hylton22308652001-02-02 03:23:09 +0000704#if defined(linux) && defined(AF_PACKET)
705 case AF_PACKET:
706 {
707 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
708 char *ifname = "";
709 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000710 /* need to look up interface name give index */
711 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000712 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000713 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000714 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000715 }
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000716 return Py_BuildValue("shbhs#", ifname, ntohs(a->sll_protocol),
Guido van Rossum48a680c2001-03-02 06:34:14 +0000717 a->sll_pkttype, a->sll_hatype,
718 a->sll_addr, a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000719 }
720#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000721
Guido van Rossum30a685f1991-06-27 15:51:29 +0000722 /* More cases here... */
723
724 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000725 /* If we don't know the address family, don't raise an
726 exception -- return it as a tuple. */
727 return Py_BuildValue("is#",
728 addr->sa_family,
729 addr->sa_data,
730 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000731
Guido van Rossum30a685f1991-06-27 15:51:29 +0000732 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000733}
734
Guido van Rossum30a685f1991-06-27 15:51:29 +0000735
736/* Parse a socket address argument according to the socket object's
737 address family. Return 1 if the address was in the proper format,
738 0 of not. The address is returned through addr_ret, its length
739 through len_ret. */
740
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000741static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000742getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000743 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000744{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000745 switch (s->sock_family) {
746
Guido van Rossumb6775db1994-08-01 11:34:53 +0000747#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000748 case AF_UNIX:
749 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000750 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000751 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000752 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000753 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000754 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000755 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000756 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000757 PyErr_SetString(PySocket_Error,
758 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000759 return 0;
760 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000761 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000762 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000763 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000764 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000765 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000766 return 1;
767 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000768#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000769
Guido van Rossum30a685f1991-06-27 15:51:29 +0000770 case AF_INET:
771 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000772 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000773 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000774 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000775 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000776 if (!PyTuple_Check(args)) {
777 PyErr_Format(PyExc_TypeError,
778 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
779 args->ob_type->tp_name);
780 return 0;
781 }
782 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000783 return 0;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000784 if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000785 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000786 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000787 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000788 *addr_ret = (struct sockaddr *) addr;
789 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000790 return 1;
791 }
792
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000793#ifdef INET6
794 case AF_INET6:
795 {
796 struct sockaddr_in6* addr;
797 char *host;
798 int port, flowinfo, scope_id;
799 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
800 flowinfo = scope_id = 0;
801 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
802 &scope_id)) {
803 return 0;
804 }
805 if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
806 return 0;
807 addr->sin6_family = s->sock_family;
808 addr->sin6_port = htons((short)port);
809 addr->sin6_flowinfo = flowinfo;
810 addr->sin6_scope_id = scope_id;
811 *addr_ret = (struct sockaddr *) addr;
812 *len_ret = sizeof *addr;
813 return 1;
814 }
815#endif
816
Jeremy Hylton22308652001-02-02 03:23:09 +0000817#if defined(linux) && defined(AF_PACKET)
818 case AF_PACKET:
819 {
820 struct sockaddr_ll* addr;
821 struct ifreq ifr;
822 char *interfaceName;
823 int protoNumber;
824 int hatype = 0;
825 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000826 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000827
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000828 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
829 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000830 return 0;
831 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
832 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000833 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
834 PyErr_SetFromErrno(PySocket_Error);
Jeremy Hylton22308652001-02-02 03:23:09 +0000835 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000836 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000837 addr = &(s->sock_addr.ll);
838 addr->sll_family = AF_PACKET;
839 addr->sll_protocol = htons((short)protoNumber);
840 addr->sll_ifindex = ifr.ifr_ifindex;
841 addr->sll_pkttype = pkttype;
842 addr->sll_hatype = hatype;
843 *addr_ret = (struct sockaddr *) addr;
844 *len_ret = sizeof *addr;
845 return 1;
846 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000847#endif
848
Guido van Rossum30a685f1991-06-27 15:51:29 +0000849 /* More cases here... */
850
851 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000852 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000853 return 0;
854
855 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000856}
857
Guido van Rossum30a685f1991-06-27 15:51:29 +0000858
Guido van Rossum48a680c2001-03-02 06:34:14 +0000859/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000860 Return 1 if the family is known, 0 otherwise. The length is returned
861 through len_ret. */
862
863static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000864getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000865{
866 switch (s->sock_family) {
867
Guido van Rossumb6775db1994-08-01 11:34:53 +0000868#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000869 case AF_UNIX:
870 {
871 *len_ret = sizeof (struct sockaddr_un);
872 return 1;
873 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000874#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000875
876 case AF_INET:
877 {
878 *len_ret = sizeof (struct sockaddr_in);
879 return 1;
880 }
881
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000882#ifdef INET6
883 case AF_INET6:
884 {
885 *len_ret = sizeof (struct sockaddr_in6);
886 return 1;
887 }
888#endif
889
Jeremy Hylton22308652001-02-02 03:23:09 +0000890#if defined(linux) && defined(AF_PACKET)
891 case AF_PACKET:
892 {
893 *len_ret = sizeof (struct sockaddr_ll);
894 return 1;
895 }
896#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000897
Guido van Rossum710e1df1992-06-12 10:39:36 +0000898 /* More cases here... */
899
900 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000901 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000902 return 0;
903
904 }
905}
906
907
Guido van Rossum30a685f1991-06-27 15:51:29 +0000908/* s.accept() method */
909
Guido van Rossum73624e91994-10-10 17:59:00 +0000910static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000911PySocketSock_accept(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000912{
913 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000914 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000915 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000916 PyObject *sock = NULL;
917 PyObject *addr = NULL;
918 PyObject *res = NULL;
919
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000920 if (!PyArg_ParseTuple(args, ":accept"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000921 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000922 if (!getsockaddrlen(s, &addrlen))
923 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000924 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000925 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000926 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000927 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000928#ifdef MS_WINDOWS
929 if (newfd == INVALID_SOCKET)
930#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000931 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000932#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000933 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000934
Guido van Rossum30a685f1991-06-27 15:51:29 +0000935 /* Create the new object with unspecified family,
936 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000937 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000938 s->sock_family,
939 s->sock_type,
940 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000941 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000942 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000943 goto finally;
944 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000945 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000946 addrlen);
947 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +0000948 goto finally;
949
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000950 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000951
952 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000953 Py_XDECREF(sock);
954 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000955 return res;
956}
957
Guido van Rossum82a5c661998-07-07 20:45:43 +0000958static char accept_doc[] =
959"accept() -> (socket object, address info)\n\
960\n\
961Wait for an incoming connection. Return a new socket representing the\n\
962connection, and the address of the client. For IP sockets, the address\n\
963info is a pair (hostaddr, port).";
964
Guido van Rossum30a685f1991-06-27 15:51:29 +0000965
Guido van Rossume4485b01994-09-07 14:32:49 +0000966/* s.setblocking(1 | 0) method */
967
Guido van Rossum73624e91994-10-10 17:59:00 +0000968static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000969PySocketSock_setblocking(PySocketSockObject *s, PyObject *args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000970{
971 int block;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000972#ifndef RISCOS
Guido van Rossum644a12b1997-04-09 19:24:53 +0000973#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000974 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000975#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000976#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000977 if (!PyArg_ParseTuple(args, "i:setblocking", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000978 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000979 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000980#ifdef __BEOS__
981 block = !block;
982 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
983 (void *)(&block), sizeof( int ) );
984#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000985#ifndef RISCOS
Guido van Rossum6f489d91996-06-28 20:15:15 +0000986#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000987#ifdef PYOS_OS2
988 block = !block;
989 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
990#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000991 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
992 if (block)
993 delay_flag &= (~O_NDELAY);
994 else
995 delay_flag |= O_NDELAY;
996 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000997#endif /* !PYOS_OS2 */
998#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000999 block = !block;
1000 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001001#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +00001002#endif /* __BEOS__ */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001003#endif /* RISCOS */
Guido van Rossum73624e91994-10-10 17:59:00 +00001004 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +00001005
Guido van Rossum73624e91994-10-10 17:59:00 +00001006 Py_INCREF(Py_None);
1007 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001008}
Guido van Rossume4485b01994-09-07 14:32:49 +00001009
Guido van Rossum82a5c661998-07-07 20:45:43 +00001010static char setblocking_doc[] =
1011"setblocking(flag)\n\
1012\n\
1013Set the socket to blocking (flag is true) or non-blocking (false).\n\
1014This uses the FIONBIO ioctl with the O_NDELAY flag.";
1015
Guido van Rossume4485b01994-09-07 14:32:49 +00001016
Guido van Rossum48a680c2001-03-02 06:34:14 +00001017#ifdef RISCOS
1018/* s.sleeptaskw(1 | 0) method */
1019
1020static PyObject *
1021PySocketSock_sleeptaskw(PySocketSockObject *s,PyObject *args)
1022{
1023 int block;
1024 int delay_flag;
1025 if (!PyArg_GetInt(args, &block))
1026 return NULL;
1027 Py_BEGIN_ALLOW_THREADS
1028 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1029 Py_END_ALLOW_THREADS
1030
1031 Py_INCREF(Py_None);
1032 return Py_None;
1033}
1034static char sleeptaskw_doc[] =
1035"sleeptaskw(flag)\n\
1036\n\
1037Allow sleeps in taskwindows.";
1038#endif
1039
1040
Guido van Rossumaee08791992-09-08 09:05:33 +00001041/* s.setsockopt() method.
1042 With an integer third argument, sets an integer option.
1043 With a string third argument, sets an option from a buffer;
1044 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001045
Guido van Rossum73624e91994-10-10 17:59:00 +00001046static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001047PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001048{
1049 int level;
1050 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001051 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001052 char *buf;
1053 int buflen;
1054 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001055
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001056 if (PyArg_ParseTuple(args, "iii:setsockopt",
1057 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001058 buf = (char *) &flag;
1059 buflen = sizeof flag;
1060 }
1061 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001062 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001063 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1064 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001065 return NULL;
1066 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001067 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001068 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001069 return PySocket_Err();
1070 Py_INCREF(Py_None);
1071 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001072}
1073
Guido van Rossum82a5c661998-07-07 20:45:43 +00001074static char setsockopt_doc[] =
1075"setsockopt(level, option, value)\n\
1076\n\
1077Set a socket option. See the Unix manual for level and option.\n\
1078The value argument can either be an integer or a string.";
1079
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001080
Guido van Rossumaee08791992-09-08 09:05:33 +00001081/* s.getsockopt() method.
1082 With two arguments, retrieves an integer option.
1083 With a third integer argument, retrieves a string buffer of that size;
1084 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001085
Guido van Rossum73624e91994-10-10 17:59:00 +00001086static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001087PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001088{
1089 int level;
1090 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001091 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001092 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001093 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001094
Guido van Rossumbcc20741998-08-04 22:53:56 +00001095#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001096 /* We have incomplete socket support. */
1097 PyErr_SetString(PySocket_Error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001098 return NULL;
1099#else
1100
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001101 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1102 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001103 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001104
Guido van Rossumbe32c891996-06-20 16:25:29 +00001105 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001106 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001107 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001108 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001109 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001110 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001111 return PySocket_Err();
1112 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001113 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001114 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001115 PyErr_SetString(PySocket_Error,
1116 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001117 return NULL;
1118 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001119 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001120 if (buf == NULL)
1121 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001122 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001123 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001124 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001125 Py_DECREF(buf);
1126 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +00001127 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001128 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001129 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001130#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001131}
1132
Guido van Rossum82a5c661998-07-07 20:45:43 +00001133static char getsockopt_doc[] =
1134"getsockopt(level, option[, buffersize]) -> value\n\
1135\n\
1136Get a socket option. See the Unix manual for level and option.\n\
1137If a nonzero buffersize argument is given, the return value is a\n\
1138string of that length; otherwise it is an integer.";
1139
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001140
Fred Drake728819a2000-07-01 03:40:12 +00001141/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001142
Guido van Rossum73624e91994-10-10 17:59:00 +00001143static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001144PySocketSock_bind(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001145{
1146 struct sockaddr *addr;
1147 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001148 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001149 PyObject *addro;
1150 if (!PyArg_ParseTuple(args, "O:bind", &addro))
1151 return NULL;
1152 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001153 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001154 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001155 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001156 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001157 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001158 return PySocket_Err();
1159 Py_INCREF(Py_None);
1160 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001161}
1162
Guido van Rossum82a5c661998-07-07 20:45:43 +00001163static char bind_doc[] =
1164"bind(address)\n\
1165\n\
1166Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001167pair (host, port); the host must refer to the local host. For raw packet\n\
1168sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001169
Guido van Rossum30a685f1991-06-27 15:51:29 +00001170
1171/* s.close() method.
1172 Set the file descriptor to -1 so operations tried subsequently
1173 will surely fail. */
1174
Guido van Rossum73624e91994-10-10 17:59:00 +00001175static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001176PySocketSock_close(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001177{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001178 SOCKET_T fd;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001179 if (!PyArg_ParseTuple(args, ":close"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001180 return NULL;
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001181 if ((fd = s->sock_fd) != -1) {
1182 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001183 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001184 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001185 Py_END_ALLOW_THREADS
1186 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001187 Py_INCREF(Py_None);
1188 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001189}
1190
Guido van Rossum82a5c661998-07-07 20:45:43 +00001191static char close_doc[] =
1192"close()\n\
1193\n\
1194Close the socket. It cannot be used after this call.";
1195
Guido van Rossum30a685f1991-06-27 15:51:29 +00001196
Fred Drake728819a2000-07-01 03:40:12 +00001197/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001198
Guido van Rossum73624e91994-10-10 17:59:00 +00001199static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001200PySocketSock_connect(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001201{
1202 struct sockaddr *addr;
1203 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001204 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001205 PyObject *addro;
1206 if (!PyArg_ParseTuple(args, "O:connect", &addro))
1207 return NULL;
1208 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001209 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001210 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001211 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001212 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001213 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001214 return PySocket_Err();
1215 Py_INCREF(Py_None);
1216 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001217}
1218
Guido van Rossum82a5c661998-07-07 20:45:43 +00001219static char connect_doc[] =
1220"connect(address)\n\
1221\n\
1222Connect the socket to a remote address. For IP sockets, the address\n\
1223is a pair (host, port).";
1224
Guido van Rossum30a685f1991-06-27 15:51:29 +00001225
Fred Drake728819a2000-07-01 03:40:12 +00001226/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001227
1228static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001229PySocketSock_connect_ex(PySocketSockObject *s, PyObject *args)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001230{
1231 struct sockaddr *addr;
1232 int addrlen;
1233 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001234 PyObject *addro;
1235 if (!PyArg_ParseTuple(args, "O:connect_ex", &addro))
1236 return NULL;
1237 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001238 return NULL;
1239 Py_BEGIN_ALLOW_THREADS
1240 res = connect(s->sock_fd, addr, addrlen);
1241 Py_END_ALLOW_THREADS
1242 if (res != 0)
1243 res = errno;
1244 return PyInt_FromLong((long) res);
1245}
1246
Guido van Rossum82a5c661998-07-07 20:45:43 +00001247static char connect_ex_doc[] =
1248"connect_ex(address)\n\
1249\n\
1250This is like connect(address), but returns an error code (the errno value)\n\
1251instead of raising an exception when an error occurs.";
1252
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001253
Guido van Rossumed233a51992-06-23 09:07:03 +00001254/* s.fileno() method */
1255
Guido van Rossum73624e91994-10-10 17:59:00 +00001256static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001257PySocketSock_fileno(PySocketSockObject *s, PyObject *args)
Guido van Rossumed233a51992-06-23 09:07:03 +00001258{
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001259 if (!PyArg_ParseTuple(args, ":fileno"))
Guido van Rossumed233a51992-06-23 09:07:03 +00001260 return NULL;
Fred Drakea04eaad2000-06-30 02:46:07 +00001261#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001262 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001263#else
1264 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1265#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001266}
1267
Guido van Rossum82a5c661998-07-07 20:45:43 +00001268static char fileno_doc[] =
1269"fileno() -> integer\n\
1270\n\
1271Return the integer file descriptor of the socket.";
1272
Guido van Rossumed233a51992-06-23 09:07:03 +00001273
Guido van Rossumbe32c891996-06-20 16:25:29 +00001274#ifndef NO_DUP
1275/* s.dup() method */
1276
1277static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001278PySocketSock_dup(PySocketSockObject *s, PyObject *args)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001279{
Fred Drakea04eaad2000-06-30 02:46:07 +00001280 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001281 PyObject *sock;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001282 if (!PyArg_ParseTuple(args, ":dup"))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001283 return NULL;
1284 newfd = dup(s->sock_fd);
1285 if (newfd < 0)
1286 return PySocket_Err();
1287 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001288 s->sock_family,
1289 s->sock_type,
1290 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001291 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001292 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001293 return sock;
1294}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001295
1296static char dup_doc[] =
1297"dup() -> socket object\n\
1298\n\
1299Return a new socket object connected to the same system resource.";
1300
Guido van Rossumbe32c891996-06-20 16:25:29 +00001301#endif
1302
1303
Guido van Rossumc89705d1992-11-26 08:54:07 +00001304/* s.getsockname() method */
1305
Guido van Rossum73624e91994-10-10 17:59:00 +00001306static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001307PySocketSock_getsockname(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001308{
1309 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001310 int res;
1311 socklen_t addrlen;
1312
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001313 if (!PyArg_ParseTuple(args, ":getsockname"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001314 return NULL;
1315 if (!getsockaddrlen(s, &addrlen))
1316 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001317 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001318 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001319 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001320 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001321 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001322 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001323 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001324}
1325
Guido van Rossum82a5c661998-07-07 20:45:43 +00001326static char getsockname_doc[] =
1327"getsockname() -> address info\n\
1328\n\
1329Return the address of the local endpoint. For IP sockets, the address\n\
1330info is a pair (hostaddr, port).";
1331
Guido van Rossumc89705d1992-11-26 08:54:07 +00001332
Guido van Rossumb6775db1994-08-01 11:34:53 +00001333#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001334/* s.getpeername() method */
1335
Guido van Rossum73624e91994-10-10 17:59:00 +00001336static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001337PySocketSock_getpeername(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001338{
1339 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001340 int res;
1341 socklen_t addrlen;
1342
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001343 if (!PyArg_ParseTuple(args, ":getpeername"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001344 return NULL;
1345 if (!getsockaddrlen(s, &addrlen))
1346 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001347 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001348 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001349 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001350 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001351 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001352 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001353 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001354}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001355
1356static char getpeername_doc[] =
1357"getpeername() -> address info\n\
1358\n\
1359Return the address of the remote endpoint. For IP sockets, the address\n\
1360info is a pair (hostaddr, port).";
1361
Guido van Rossumb6775db1994-08-01 11:34:53 +00001362#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001363
1364
Guido van Rossum30a685f1991-06-27 15:51:29 +00001365/* s.listen(n) method */
1366
Guido van Rossum73624e91994-10-10 17:59:00 +00001367static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001368PySocketSock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001369{
1370 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001371 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001372 if (!PyArg_ParseTuple(args, "i:listen", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001373 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001374 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001375 if (backlog < 1)
1376 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001377 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001378 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001379 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001380 return PySocket_Err();
1381 Py_INCREF(Py_None);
1382 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001383}
1384
Guido van Rossum82a5c661998-07-07 20:45:43 +00001385static char listen_doc[] =
1386"listen(backlog)\n\
1387\n\
1388Enable a server to accept connections. The backlog argument must be at\n\
1389least 1; it specifies the number of unaccepted connection that the system\n\
1390will allow before refusing new connections.";
1391
1392
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001393#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001394/* s.makefile(mode) method.
1395 Create a new open file object referring to a dupped version of
1396 the socket's file descriptor. (The dup() call is necessary so
1397 that the open file and socket objects may be closed independent
1398 of each other.)
1399 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1400
Guido van Rossum73624e91994-10-10 17:59:00 +00001401static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001402PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001403{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001404 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001405 char *mode = "r";
1406 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001407#ifdef MS_WIN32
1408 intptr_t fd;
1409#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001410 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001411#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001412 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001413 PyObject *f;
1414
Guido van Rossum43713e52000-02-29 13:59:29 +00001415 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001416 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001417#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001418 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1419 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001420#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001421 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001422#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001423 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001424 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001425 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001426 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001427 }
1428 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1429 if (f != NULL)
1430 PyFile_SetBufSize(f, bufsize);
1431 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001432}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001433
1434static char makefile_doc[] =
1435"makefile([mode[, buffersize]]) -> file object\n\
1436\n\
1437Return a regular file object corresponding to the socket.\n\
1438The mode and buffersize arguments are as for the built-in open() function.";
1439
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001440#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001441
Guido van Rossum48a680c2001-03-02 06:34:14 +00001442
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001443/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001444
Guido van Rossum73624e91994-10-10 17:59:00 +00001445static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001446PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001447{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001448 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001449 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001450 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001451 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001452 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001453 if (buf == NULL)
1454 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001455 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001456 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001457 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001458 if (n < 0) {
1459 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001460 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001461 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001462 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001463 return NULL;
1464 return buf;
1465}
1466
Guido van Rossum82a5c661998-07-07 20:45:43 +00001467static char recv_doc[] =
1468"recv(buffersize[, flags]) -> data\n\
1469\n\
1470Receive up to buffersize bytes from the socket. For the optional flags\n\
1471argument, see the Unix manual. When no data is available, block until\n\
1472at least one byte is available or until the remote end is closed. When\n\
1473the remote end is closed and all data is read, return the empty string.";
1474
Guido van Rossum30a685f1991-06-27 15:51:29 +00001475
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001476/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001477
Guido van Rossum73624e91994-10-10 17:59:00 +00001478static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001479PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001480{
1481 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001482 PyObject *buf = NULL;
1483 PyObject *addr = NULL;
1484 PyObject *ret = NULL;
1485
Guido van Rossumff3ab422000-04-24 15:16:03 +00001486 int len, n, flags = 0;
1487 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001488 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001489 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001490 if (!getsockaddrlen(s, &addrlen))
1491 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001492 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001493 if (buf == NULL)
1494 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001495 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001496 memset(addrbuf, 0, addrlen);
1497 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001498#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001499#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001500 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001501#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001502 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001503#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001504#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001505 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001506#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001507 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001508 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001509 if (n < 0) {
1510 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001511 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001512 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001513 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001514 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001515
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001516 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001517 goto finally;
1518
Guido van Rossum73624e91994-10-10 17:59:00 +00001519 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001520 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001521 Py_XDECREF(addr);
1522 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001523 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001524}
1525
Guido van Rossum82a5c661998-07-07 20:45:43 +00001526static char recvfrom_doc[] =
1527"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1528\n\
1529Like recv(buffersize, flags) but also return the sender's address info.";
1530
Guido van Rossum30a685f1991-06-27 15:51:29 +00001531
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001532/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001533
Guido van Rossum73624e91994-10-10 17:59:00 +00001534static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001535PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001536{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001537 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001538 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001539 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001540 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001541 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001542 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001543 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001544 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001545 return PySocket_Err();
1546 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001547}
1548
Guido van Rossum82a5c661998-07-07 20:45:43 +00001549static char send_doc[] =
1550"send(data[, flags])\n\
1551\n\
1552Send a data string to the socket. For the optional flags\n\
1553argument, see the Unix manual.";
1554
Guido van Rossum30a685f1991-06-27 15:51:29 +00001555
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001556/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001557
Guido van Rossum73624e91994-10-10 17:59:00 +00001558static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001559PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001560{
Guido van Rossum73624e91994-10-10 17:59:00 +00001561 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001562 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001563 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001564 int addrlen, len, n, flags;
1565 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001566 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001567 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001568 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1569 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001570 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001571 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001572 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001573 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001574 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001575 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001576 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001577 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001578 return PySocket_Err();
1579 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001580}
1581
Guido van Rossum82a5c661998-07-07 20:45:43 +00001582static char sendto_doc[] =
1583"sendto(data[, flags], address)\n\
1584\n\
1585Like send(data, flags) but allows specifying the destination address.\n\
1586For IP sockets, the address is a pair (hostaddr, port).";
1587
Guido van Rossum30a685f1991-06-27 15:51:29 +00001588
1589/* s.shutdown(how) method */
1590
Guido van Rossum73624e91994-10-10 17:59:00 +00001591static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001592PySocketSock_shutdown(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001593{
1594 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001595 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001596 if (!PyArg_ParseTuple(args, "i:shutdown", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001597 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001598 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001599 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001600 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001601 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001602 return PySocket_Err();
1603 Py_INCREF(Py_None);
1604 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001605}
1606
Guido van Rossum82a5c661998-07-07 20:45:43 +00001607static char shutdown_doc[] =
1608"shutdown(flag)\n\
1609\n\
1610Shut down the reading side of the socket (flag == 0), the writing side\n\
1611of the socket (flag == 1), or both ends (flag == 2).";
1612
Guido van Rossum30a685f1991-06-27 15:51:29 +00001613
1614/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001615
Guido van Rossum73624e91994-10-10 17:59:00 +00001616static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001617 {"accept", (PyCFunction)PySocketSock_accept, METH_VARARGS,
1618 accept_doc},
1619 {"bind", (PyCFunction)PySocketSock_bind, METH_VARARGS,
1620 bind_doc},
1621 {"close", (PyCFunction)PySocketSock_close, METH_VARARGS,
1622 close_doc},
1623 {"connect", (PyCFunction)PySocketSock_connect, METH_VARARGS,
1624 connect_doc},
1625 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_VARARGS,
1626 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001627#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001628 {"dup", (PyCFunction)PySocketSock_dup, METH_VARARGS,
1629 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001630#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001631 {"fileno", (PyCFunction)PySocketSock_fileno, METH_VARARGS,
1632 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001633#ifdef HAVE_GETPEERNAME
Guido van Rossum48a680c2001-03-02 06:34:14 +00001634 {"getpeername", (PyCFunction)PySocketSock_getpeername, METH_VARARGS,
1635 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001636#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001637 {"getsockname", (PyCFunction)PySocketSock_getsockname, METH_VARARGS,
1638 getsockname_doc},
1639 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1640 getsockopt_doc},
1641 {"listen", (PyCFunction)PySocketSock_listen, METH_VARARGS,
1642 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001643#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001644 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1645 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001646#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001647 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1648 recv_doc},
1649 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1650 recvfrom_doc},
1651 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1652 send_doc},
1653 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1654 sendto_doc},
1655 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_VARARGS,
1656 setblocking_doc},
1657 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1658 setsockopt_doc},
1659 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_VARARGS,
1660 shutdown_doc},
1661#ifdef RISCOS
1662 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1663 sleeptaskw_doc},
1664#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001665 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001666};
1667
Guido van Rossum30a685f1991-06-27 15:51:29 +00001668
Guido van Rossum73624e91994-10-10 17:59:00 +00001669/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001670 First close the file description. */
1671
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001672static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001673PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001674{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001675 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001676 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001677 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001678}
1679
Guido van Rossum30a685f1991-06-27 15:51:29 +00001680
1681/* Return a socket object's named attribute. */
1682
Guido van Rossum73624e91994-10-10 17:59:00 +00001683static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001684PySocketSock_getattr(PySocketSockObject *s, char *name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001685{
Guido van Rossum73624e91994-10-10 17:59:00 +00001686 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001687}
1688
Guido van Rossum30a685f1991-06-27 15:51:29 +00001689
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001690static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001691PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001692{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001693 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001694#if SIZEOF_SOCKET_T > SIZEOF_LONG
1695 if (s->sock_fd > LONG_MAX) {
1696 /* this can occur on Win64, and actually there is a special
1697 ugly printf formatter for decimal pointer length integer
1698 printing, only bother if necessary*/
1699 PyErr_SetString(PyExc_OverflowError,
1700 "no printf formatter to display the socket descriptor in decimal");
1701 return NULL;
1702 }
1703#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001704 sprintf(buf,
1705 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
Fred Drakea04eaad2000-06-30 02:46:07 +00001706 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001707 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001708}
1709
1710
Guido van Rossumb6775db1994-08-01 11:34:53 +00001711/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001712
Guido van Rossum73624e91994-10-10 17:59:00 +00001713static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001714 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001715 0,
1716 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001717 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001718 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001719 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001720 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001721 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001722 0, /*tp_setattr*/
1723 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001724 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001725 0, /*tp_as_number*/
1726 0, /*tp_as_sequence*/
1727 0, /*tp_as_mapping*/
1728};
1729
Guido van Rossum30a685f1991-06-27 15:51:29 +00001730
Guido van Rossum81194471991-07-27 21:42:02 +00001731/* Python interface to gethostname(). */
1732
1733/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001734static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001735PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001736{
1737 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001738 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001739 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001740 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001741 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001742 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001743 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001744 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001745 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001746 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001747 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001748}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001749
Guido van Rossum82a5c661998-07-07 20:45:43 +00001750static char gethostname_doc[] =
1751"gethostname() -> string\n\
1752\n\
1753Return the current host name.";
1754
Guido van Rossumff4949e1992-08-05 19:58:53 +00001755
Guido van Rossum30a685f1991-06-27 15:51:29 +00001756/* Python interface to gethostbyname(name). */
1757
1758/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001759static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001760PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001761{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001762 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001763 struct sockaddr_storage addrbuf;
1764
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001765 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001766 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001767 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001768 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001769 return makeipaddr((struct sockaddr *)&addrbuf,
1770 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001771}
1772
Guido van Rossum82a5c661998-07-07 20:45:43 +00001773static char gethostbyname_doc[] =
1774"gethostbyname(host) -> address\n\
1775\n\
1776Return the IP address (a string of the form '255.255.255.255') for a host.";
1777
1778
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001779/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1780
1781static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001782gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001783{
1784 char **pch;
1785 PyObject *rtn_tuple = (PyObject *)NULL;
1786 PyObject *name_list = (PyObject *)NULL;
1787 PyObject *addr_list = (PyObject *)NULL;
1788 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001789
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001790 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001791 /* Let's get real error message to return */
Martin v. Löwisfe36fc92001-07-23 07:27:16 +00001792#ifndef h_errno
Guido van Rossum48a680c2001-03-02 06:34:14 +00001793 extern int h_errno;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001794#endif
1795 PyH_Err(h_errno);
1796 return NULL;
1797 }
1798 if (h->h_addrtype != af) {
1799#ifdef HAVE_STRERROR
1800 /* Let's get real error message to return */
1801 PyErr_SetString(PySocket_Error, (char *)strerror(EAFNOSUPPORT));
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001802#else
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001803 PyErr_SetString(PySocket_Error,
1804 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001805#endif
1806 return NULL;
1807 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001808 switch (af) {
1809 case AF_INET:
1810 if (alen < sizeof(struct sockaddr_in))
1811 return NULL;
1812 break;
1813#ifdef INET6
1814 case AF_INET6:
1815 if (alen < sizeof(struct sockaddr_in6))
1816 return NULL;
1817 break;
1818#endif
1819 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001820 if ((name_list = PyList_New(0)) == NULL)
1821 goto err;
1822 if ((addr_list = PyList_New(0)) == NULL)
1823 goto err;
1824 for (pch = h->h_aliases; *pch != NULL; pch++) {
1825 int status;
1826 tmp = PyString_FromString(*pch);
1827 if (tmp == NULL)
1828 goto err;
1829 status = PyList_Append(name_list, tmp);
1830 Py_DECREF(tmp);
1831 if (status)
1832 goto err;
1833 }
1834 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1835 int status;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001836 switch (af) {
1837 case AF_INET:
1838 {
1839 struct sockaddr_in sin;
1840 memset(&sin, 0, sizeof(sin));
1841 sin.sin_family = af;
1842#ifdef HAVE_SOCKADDR_SA_LEN
1843 sin.sin_len = sizeof(sin);
1844#endif
1845 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
1846 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
1847 if (pch == h->h_addr_list && alen >= sizeof(sin))
1848 memcpy((char *) addr, &sin, sizeof(sin));
1849 break;
1850 }
1851#ifdef INET6
1852 case AF_INET6:
1853 {
1854 struct sockaddr_in6 sin6;
1855 memset(&sin6, 0, sizeof(sin6));
1856 sin6.sin6_family = af;
1857#ifdef HAVE_SOCKADDR_SA_LEN
1858 sin6.sin6_len = sizeof(sin6);
1859#endif
1860 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
1861 tmp = makeipaddr((struct sockaddr *)&sin6,
1862 sizeof(sin6));
1863 if (pch == h->h_addr_list && alen >= sizeof(sin6))
1864 memcpy((char *) addr, &sin6, sizeof(sin6));
1865 break;
1866 }
1867#endif
1868 default: /* can't happen */
1869 PyErr_SetString(PySocket_Error,
1870 "unsupported address family");
1871 return NULL;
1872 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001873 if (tmp == NULL)
1874 goto err;
1875 status = PyList_Append(addr_list, tmp);
1876 Py_DECREF(tmp);
1877 if (status)
1878 goto err;
1879 }
1880 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1881 err:
1882 Py_XDECREF(name_list);
1883 Py_XDECREF(addr_list);
1884 return rtn_tuple;
1885}
1886
1887
1888/* Python interface to gethostbyname_ex(name). */
1889
1890/*ARGSUSED*/
1891static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001892PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001893{
1894 char *name;
1895 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001896 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00001897 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00001898 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001899#ifdef HAVE_GETHOSTBYNAME_R
1900 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001901#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1902 struct hostent_data data;
1903#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001904 char buf[16384];
1905 int buf_len = (sizeof buf) - 1;
1906 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001907#endif
1908#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001909 int result;
1910#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001911#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001912
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001913 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001914 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001915 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001916 return NULL;
1917 Py_BEGIN_ALLOW_THREADS
1918#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001919#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001920 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001921#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001922 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001923#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001924 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001925 result = gethostbyname_r(name, &hp_allocated, &data);
1926 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001927#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001928#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001929#ifdef USE_GETHOSTBYNAME_LOCK
1930 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001931#endif
1932 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001933#endif /* HAVE_GETHOSTBYNAME_R */
1934 Py_END_ALLOW_THREADS
Martin v. Löwis9db2f572001-07-23 01:30:10 +00001935 /* Some C libraries would require addr.__ss_family instead of addr.ss_family.
1936 Therefore, we cast the sockaddr_storage into sockaddr to access sa_family. */
1937 sa = (struct sockaddr*)&addr;
1938 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00001939#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001940 PyThread_release_lock(gethostbyname_lock);
1941#endif
1942 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001943}
1944
1945static char ghbn_ex_doc[] =
1946"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1947\n\
1948Return the true host name, a list of aliases, and a list of IP addresses,\n\
1949for a host. The host argument is a string giving a host name or IP number.";
1950
1951
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001952/* Python interface to gethostbyaddr(IP). */
1953
1954/*ARGSUSED*/
1955static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001956PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001957{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001958#ifdef INET6
1959 struct sockaddr_storage addr;
1960#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00001961 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001962#endif
1963 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001964 char *ip_num;
1965 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001966 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001967#ifdef HAVE_GETHOSTBYNAME_R
1968 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001969#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1970 struct hostent_data data;
1971#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001972 char buf[16384];
1973 int buf_len = (sizeof buf) - 1;
1974 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001975#endif
1976#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001977 int result;
1978#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001979#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001980 char *ap;
1981 int al;
1982 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001983
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001984 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001985 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001986 af = PF_UNSPEC;
1987 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001988 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001989 af = sa->sa_family;
1990 ap = NULL;
1991 al = 0;
1992 switch (af) {
1993 case AF_INET:
1994 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
1995 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
1996 break;
1997#ifdef INET6
1998 case AF_INET6:
1999 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2000 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2001 break;
2002#endif
2003 default:
2004 PyErr_SetString(PySocket_Error, "unsupported address family");
2005 return NULL;
2006 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002007 Py_BEGIN_ALLOW_THREADS
2008#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002009#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002010 result = gethostbyaddr_r(ap, al, af,
2011 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002012 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002013#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002014 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002015 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002016#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002017 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002018 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002019 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002020#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002021#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002022#ifdef USE_GETHOSTBYNAME_LOCK
2023 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002024#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002025 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002026#endif /* HAVE_GETHOSTBYNAME_R */
2027 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002028 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002029#ifdef USE_GETHOSTBYNAME_LOCK
2030 PyThread_release_lock(gethostbyname_lock);
2031#endif
2032 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002033}
2034
Guido van Rossum82a5c661998-07-07 20:45:43 +00002035static char gethostbyaddr_doc[] =
2036"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2037\n\
2038Return the true host name, a list of aliases, and a list of IP addresses,\n\
2039for a host. The host argument is a string giving a host name or IP number.";
2040
Guido van Rossum30a685f1991-06-27 15:51:29 +00002041
2042/* Python interface to getservbyname(name).
2043 This only returns the port number, since the other info is already
2044 known or not useful (like the list of aliases). */
2045
2046/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002047static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002048PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002049{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002050 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002051 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002052 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002053 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002054 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002055 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002056 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002057 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002058 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002059 return NULL;
2060 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002061 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002062}
2063
Guido van Rossum82a5c661998-07-07 20:45:43 +00002064static char getservbyname_doc[] =
2065"getservbyname(servicename, protocolname) -> integer\n\
2066\n\
2067Return a port number from a service name and protocol name.\n\
2068The protocol name should be 'tcp' or 'udp'.";
2069
Guido van Rossum30a685f1991-06-27 15:51:29 +00002070
Guido van Rossum3901d851996-12-19 16:35:04 +00002071/* Python interface to getprotobyname(name).
2072 This only returns the protocol number, since the other info is
2073 already known or not useful (like the list of aliases). */
2074
2075/*ARGSUSED*/
2076static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002077PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002078{
2079 char *name;
2080 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002081#ifdef __BEOS__
2082/* Not available in BeOS yet. - [cjh] */
2083 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
2084 return NULL;
2085#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002086 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002087 return NULL;
2088 Py_BEGIN_ALLOW_THREADS
2089 sp = getprotobyname(name);
2090 Py_END_ALLOW_THREADS
2091 if (sp == NULL) {
2092 PyErr_SetString(PySocket_Error, "protocol not found");
2093 return NULL;
2094 }
2095 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002096#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002097}
2098
Guido van Rossum82a5c661998-07-07 20:45:43 +00002099static char getprotobyname_doc[] =
2100"getprotobyname(name) -> integer\n\
2101\n\
2102Return the protocol number for the named protocol. (Rarely used.)";
2103
Guido van Rossum3901d851996-12-19 16:35:04 +00002104
Guido van Rossum30a685f1991-06-27 15:51:29 +00002105/* Python interface to socket(family, type, proto).
2106 The third (protocol) argument is optional.
2107 Return a new socket object. */
2108
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002109/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002110static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002111PySocket_socket(PyObject *self, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002112{
Guido van Rossum73624e91994-10-10 17:59:00 +00002113 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002114 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002115 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00002116 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002117 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002118 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002119 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002120 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00002121#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00002122 if (fd == INVALID_SOCKET)
2123#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002124 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00002125#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002126 return PySocket_Err();
2127 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002128 /* If the object can't be created, don't forget to close the
2129 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002130 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002131 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00002132 /* From now on, ignore SIGPIPE and let the error checking
2133 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002134#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00002135 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002136#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002137 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002138}
2139
Guido van Rossum82a5c661998-07-07 20:45:43 +00002140static char socket_doc[] =
2141"socket(family, type[, proto]) -> socket object\n\
2142\n\
2143Open a socket of the given type. The family argument specifies the\n\
2144address family; it is normally AF_INET, sometimes AF_UNIX.\n\
2145The type argument specifies whether this is a stream (SOCK_STREAM)\n\
2146or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
2147specifying the default protocol.";
2148
2149
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002150#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002151/* Create a socket object from a numeric file description.
2152 Useful e.g. if stdin is a socket.
2153 Additional arguments as for socket(). */
2154
2155/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002156static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002157PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002158{
Guido van Rossum73624e91994-10-10 17:59:00 +00002159 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002160 SOCKET_T fd;
2161 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002162 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2163 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002164 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002165 /* Dup the fd so it and the socket can be closed independently */
2166 fd = dup(fd);
2167 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00002168 return PySocket_Err();
2169 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002170 /* From now on, ignore SIGPIPE and let the error checking
2171 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002172#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002173 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002174#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002175 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002176}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002177
2178static char fromfd_doc[] =
2179"fromfd(fd, family, type[, proto]) -> socket object\n\
2180\n\
2181Create a socket object from the given file descriptor.\n\
2182The remaining arguments are the same as for socket().";
2183
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002184#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002185
Guido van Rossum82a5c661998-07-07 20:45:43 +00002186
Guido van Rossum006bf911996-06-12 04:04:55 +00002187static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002188PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002189{
2190 int x1, x2;
2191
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002192 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002193 return NULL;
2194 }
2195 x2 = (int)ntohs((short)x1);
2196 return PyInt_FromLong(x2);
2197}
2198
Guido van Rossum82a5c661998-07-07 20:45:43 +00002199static char ntohs_doc[] =
2200"ntohs(integer) -> integer\n\
2201\n\
2202Convert a 16-bit integer from network to host byte order.";
2203
2204
Guido van Rossum006bf911996-06-12 04:04:55 +00002205static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002206PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002207{
2208 int x1, x2;
2209
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002210 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002211 return NULL;
2212 }
2213 x2 = ntohl(x1);
2214 return PyInt_FromLong(x2);
2215}
2216
Guido van Rossum82a5c661998-07-07 20:45:43 +00002217static char ntohl_doc[] =
2218"ntohl(integer) -> integer\n\
2219\n\
2220Convert a 32-bit integer from network to host byte order.";
2221
2222
Guido van Rossum006bf911996-06-12 04:04:55 +00002223static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002224PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002225{
2226 int x1, x2;
2227
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002228 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002229 return NULL;
2230 }
2231 x2 = (int)htons((short)x1);
2232 return PyInt_FromLong(x2);
2233}
2234
Guido van Rossum82a5c661998-07-07 20:45:43 +00002235static char htons_doc[] =
2236"htons(integer) -> integer\n\
2237\n\
2238Convert a 16-bit integer from host to network byte order.";
2239
2240
Guido van Rossum006bf911996-06-12 04:04:55 +00002241static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002242PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002243{
2244 int x1, x2;
2245
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002246 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002247 return NULL;
2248 }
2249 x2 = htonl(x1);
2250 return PyInt_FromLong(x2);
2251}
2252
Guido van Rossum82a5c661998-07-07 20:45:43 +00002253static char htonl_doc[] =
2254"htonl(integer) -> integer\n\
2255\n\
2256Convert a 32-bit integer from host to network byte order.";
2257
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002258/*
2259 * socket.inet_aton() and socket.inet_ntoa() functions
2260 *
2261 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2262 *
2263 */
2264
Guido van Rossum48a680c2001-03-02 06:34:14 +00002265static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002266"inet_aton(string) -> packed 32-bit IP representation\n\
2267\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002268Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002269binary format used in low-level network functions.";
2270
2271static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002272PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002273{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002274#ifndef INADDR_NONE
2275#define INADDR_NONE (-1)
2276#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002277
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002278 /* Have to use inet_addr() instead */
2279 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002280 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002281
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002282 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002283 return NULL;
2284 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00002285#ifdef USE_GUSI1
Fred Drakee5065292001-07-19 21:16:41 +00002286 packed_addr = inet_addr(ip_addr).s_addr;
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002287#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002288 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002289#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002290
2291 if (packed_addr == INADDR_NONE) { /* invalid address */
2292 PyErr_SetString(PySocket_Error,
2293 "illegal IP address string passed to inet_aton");
2294 return NULL;
2295 }
2296
2297 return PyString_FromStringAndSize((char *) &packed_addr,
2298 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002299}
2300
Guido van Rossum48a680c2001-03-02 06:34:14 +00002301static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002302"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002303\n\
2304Convert an IP address from 32-bit packed binary format to string format";
2305
2306static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002307PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002308{
2309 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002310 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002311 struct in_addr packed_addr;
2312
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002313 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002314 return NULL;
2315 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002316
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002317 if (addr_len != sizeof(packed_addr)) {
2318 PyErr_SetString(PySocket_Error,
2319 "packed IP wrong length for inet_ntoa");
2320 return NULL;
2321 }
2322
2323 memcpy(&packed_addr, packed_str, addr_len);
2324
2325 return PyString_FromString(inet_ntoa(packed_addr));
2326}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002327
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002328/* Python interface to getaddrinfo(host, port). */
2329
2330/*ARGSUSED*/
2331static PyObject *
2332PySocket_getaddrinfo(PyObject *self, PyObject *args)
2333{
2334 struct addrinfo hints, *res0, *res;
2335 PyObject *pobj = (PyObject *)NULL;
2336 char pbuf[10];
2337 char *hptr, *pptr;
2338 int family, socktype, protocol, flags;
2339 int error;
2340 PyObject *all = (PyObject *)NULL;
2341 PyObject *single = (PyObject *)NULL;
2342
2343 family = socktype = protocol = flags = 0;
2344 family = PF_UNSPEC;
2345 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2346 &hptr, &pobj, &family, &socktype,
2347 &protocol, &flags)) {
2348 return NULL;
2349 }
2350 if (PyInt_Check(pobj)) {
2351 snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
2352 pptr = pbuf;
2353 } else if (PyString_Check(pobj)) {
2354 pptr = PyString_AsString(pobj);
2355 } else if (pobj == Py_None) {
2356 pptr = (char *)NULL;
2357 } else {
2358 PyErr_SetString(PySocket_Error, "Int or String expected");
2359 return NULL;
2360 }
2361 memset(&hints, 0, sizeof(hints));
2362 hints.ai_family = family;
2363 hints.ai_socktype = socktype;
2364 hints.ai_protocol = protocol;
2365 hints.ai_flags = flags;
2366 error = getaddrinfo(hptr, pptr, &hints, &res0);
2367 if (error) {
2368 PyGAI_Err(error);
2369 return NULL;
2370 }
2371
2372 if ((all = PyList_New(0)) == NULL)
2373 goto err;
2374 for (res = res0; res; res = res->ai_next) {
2375 single = Py_BuildValue("iiisO", res->ai_family,
2376 res->ai_socktype, res->ai_protocol,
2377 res->ai_canonname ? res->ai_canonname : "",
2378 makesockaddr(-1, res->ai_addr, res->ai_addrlen));
2379 if (single == NULL)
2380 goto err;
2381
2382 if (PyList_Append(all, single))
2383 goto err;
2384 Py_XDECREF(single);
2385 }
2386 Py_XDECREF(pobj);
2387 return all;
2388 err:
2389 Py_XDECREF(single);
2390 Py_XDECREF(all);
2391 Py_XDECREF(pobj);
2392 return (PyObject *)NULL;
2393}
2394
2395static char getaddrinfo_doc[] =
2396"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2397 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2398\n\
2399Resolve host and port into addrinfo struct.";
2400
2401/* Python interface to getnameinfo(sa, flags). */
2402
2403/*ARGSUSED*/
2404static PyObject *
2405PySocket_getnameinfo(PyObject *self, PyObject *args)
2406{
2407 PyObject *sa = (PyObject *)NULL;
2408 int flags;
2409 char *hostp;
2410 int n, port, flowinfo, scope_id;
2411 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2412 struct addrinfo hints, *res = NULL;
2413 int error;
2414 PyObject *ret = (PyObject *)NULL;
2415
2416 flags = flowinfo = scope_id = 0;
2417 if (PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags) == 0)
2418 return NULL;
2419 n = PyArg_ParseTuple(sa, "si|ii", &hostp, &port, &flowinfo, scope_id);
2420 if (n == 0)
2421 goto fail;
2422 snprintf(pbuf, sizeof(pbuf), "%d", port);
2423 memset(&hints, 0, sizeof(hints));
2424 hints.ai_family = PF_UNSPEC;
2425 error = getaddrinfo(hostp, pbuf, &hints, &res);
2426 if (error) {
2427 PyGAI_Err(error);
2428 goto fail;
2429 }
2430 if (res->ai_next) {
2431 PyErr_SetString(PySocket_Error,
2432 "sockaddr resolved to multiple addresses");
2433 goto fail;
2434 }
2435 switch (res->ai_family) {
2436 case AF_INET:
2437 {
2438 char *t1;
2439 int t2;
2440 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
2441 PyErr_SetString(PySocket_Error,
2442 "IPv4 sockaddr must be 2 tuple");
2443 goto fail;
2444 }
2445 break;
2446 }
2447#ifdef INET6
2448 case AF_INET6:
2449 {
2450 struct sockaddr_in6 *sin6;
2451 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2452 sin6->sin6_flowinfo = flowinfo;
2453 sin6->sin6_scope_id = scope_id;
2454 break;
2455 }
2456#endif
2457 }
2458 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2459 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2460 if (error) {
2461 PyGAI_Err(error);
2462 goto fail;
2463 }
2464 ret = Py_BuildValue("ss", hbuf, pbuf);
2465
2466fail:
2467 if (res)
2468 freeaddrinfo(res);
2469 Py_XDECREF(sa);
2470 return ret;
2471}
2472
2473static char getnameinfo_doc[] =
2474"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2475\n\
2476Get host and port for a sockaddr.";
2477
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002478
2479#ifdef USE_SSL
2480
2481/* This is a C function to be called for new object initialization */
2482static SSLObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002483newSSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002484{
2485 SSLObject *self;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002486
Guido van Rossumb18618d2000-05-03 23:44:39 +00002487 self = PyObject_New(SSLObject, &SSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002488 if (self == NULL){
2489 PyErr_SetObject(SSLErrorObject,
2490 PyString_FromString("newSSLObject error"));
2491 return NULL;
2492 }
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002493 memset(self->server, '\0', sizeof(char) * 256);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002494 memset(self->issuer, '\0', sizeof(char) * 256);
2495
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002496 self->x_attr = PyDict_New();
2497 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
2498 if (self->ctx == NULL) {
2499 PyErr_SetObject(SSLErrorObject,
2500 PyString_FromString("SSL_CTX_new error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002501 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002502 return NULL;
2503 }
2504
2505 if ( (key_file && !cert_file) || (!key_file && cert_file) )
2506 {
2507 PyErr_SetObject(SSLErrorObject,
2508 PyString_FromString(
2509 "Both the key & certificate files must be specified"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002510 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002511 return NULL;
2512 }
2513
2514 if (key_file && cert_file)
2515 {
2516 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
2517 SSL_FILETYPE_PEM) < 1)
2518 {
2519 PyErr_SetObject(SSLErrorObject,
2520 PyString_FromString(
2521 "SSL_CTX_use_PrivateKey_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002522 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002523 return NULL;
2524 }
2525
2526 if (SSL_CTX_use_certificate_chain_file(self->ctx,
2527 cert_file) < 1)
2528 {
2529 PyErr_SetObject(SSLErrorObject,
2530 PyString_FromString(
2531 "SSL_CTX_use_certificate_chain_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002532 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002533 return NULL;
2534 }
2535 }
2536
2537 SSL_CTX_set_verify(self->ctx,
2538 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2539 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2540 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2541 SSL_set_connect_state(self->ssl);
2542
2543 if ((SSL_connect(self->ssl)) == -1) {
2544 /* Actually negotiate SSL connection */
2545 PyErr_SetObject(SSLErrorObject,
2546 PyString_FromString("SSL_connect error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002547 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002548 return NULL;
2549 }
2550 self->ssl->debug = 1;
2551
2552 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2553 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
2554 self->server, 256);
2555 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2556 self->issuer, 256);
2557 }
2558 self->x_attr = NULL;
2559 self->Socket = Sock;
2560 Py_INCREF(self->Socket);
2561 return self;
2562}
2563
2564/* This is the Python function called for new object initialization */
2565static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002566PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002567{
2568 SSLObject *rv;
2569 PySocketSockObject *Sock;
2570 char *key_file;
2571 char *cert_file;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002572
Guido van Rossum43713e52000-02-29 13:59:29 +00002573 if (!PyArg_ParseTuple(args, "O!zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002574 &PySocketSock_Type, (PyObject*)&Sock,
2575 &key_file, &cert_file) )
2576 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002577
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002578 rv = newSSLObject(Sock, key_file, cert_file);
2579 if ( rv == NULL )
2580 return NULL;
2581 return (PyObject *)rv;
2582}
2583
2584static char ssl_doc[] =
2585"ssl(socket, keyfile, certfile) -> sslobject";
2586
2587static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002588SSL_server(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002589{
2590 return PyString_FromString(self->server);
2591}
2592
2593static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002594SSL_issuer(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002595{
2596 return PyString_FromString(self->issuer);
2597}
2598
2599
2600/* SSL object methods */
2601
2602static PyMethodDef SSLMethods[] = {
2603 { "write", (PyCFunction)SSL_SSLwrite, 1 },
2604 { "read", (PyCFunction)SSL_SSLread, 1 },
2605 { "server", (PyCFunction)SSL_server, 1 },
2606 { "issuer", (PyCFunction)SSL_issuer, 1 },
2607 { NULL, NULL}
2608};
2609
2610static void SSL_dealloc(SSLObject *self)
2611{
2612 if (self->server_cert) /* Possible not to have one? */
2613 X509_free (self->server_cert);
2614 SSL_CTX_free(self->ctx);
2615 SSL_free(self->ssl);
2616 Py_XDECREF(self->x_attr);
2617 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002618 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002619}
2620
2621static PyObject *SSL_getattr(SSLObject *self, char *name)
2622{
2623 return Py_FindMethod(SSLMethods, (PyObject *)self, name);
2624}
2625
2626staticforward PyTypeObject SSL_Type = {
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002627 PyObject_HEAD_INIT(NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002628 0, /*ob_size*/
2629 "SSL", /*tp_name*/
2630 sizeof(SSLObject), /*tp_basicsize*/
2631 0, /*tp_itemsize*/
2632 /* methods */
2633 (destructor)SSL_dealloc, /*tp_dealloc*/
2634 0, /*tp_print*/
2635 (getattrfunc)SSL_getattr, /*tp_getattr*/
2636 0, /*tp_setattr*/
2637 0, /*tp_compare*/
2638 0, /*tp_repr*/
2639 0, /*tp_as_number*/
2640 0, /*tp_as_sequence*/
2641 0, /*tp_as_mapping*/
2642 0, /*tp_hash*/
2643};
2644
2645
2646
2647static PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args)
2648{
2649 char *data;
Andrew M. Kuchlingb38175e2001-02-07 20:41:17 +00002650 size_t len;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002651
Andrew M. Kuchlingb38175e2001-02-07 20:41:17 +00002652 if (!PyArg_ParseTuple(args, "s#:write", &data, &len))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002653 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002654
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002655 len = SSL_write(self->ssl, data, len);
2656 return PyInt_FromLong((long)len);
2657}
2658
2659static PyObject *SSL_SSLread(SSLObject *self, PyObject *args)
2660{
2661 PyObject *buf;
2662 int count = 0;
2663 int len = 1024;
2664 int res;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002665
Guido van Rossum43713e52000-02-29 13:59:29 +00002666 PyArg_ParseTuple(args, "|i:read", &len);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002667
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002668 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2669 return NULL; /* Error object should already be set */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002670
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002671 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2672 res = SSL_get_error(self->ssl, count);
2673
2674 switch (res) {
Jeremy Hylton42dd01a2001-02-01 23:35:20 +00002675 case SSL_ERROR_NONE:
2676 assert(count > 0);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002677 break;
Jeremy Hylton42dd01a2001-02-01 23:35:20 +00002678 case SSL_ERROR_ZERO_RETURN: /* normal EOF */
2679 assert(count == 0);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002680 break;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002681 default:
2682 return PyErr_SetFromErrno(SSLErrorObject);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002683 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002684
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002685 fflush(stderr);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002686
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002687 if (count < 0) {
2688 Py_DECREF(buf);
2689 return PyErr_SetFromErrno(SSLErrorObject);
2690 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002691
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002692 if (count != len && _PyString_Resize(&buf, count) < 0)
2693 return NULL;
2694 return buf;
2695}
2696
2697#endif /* USE_SSL */
2698
2699
Guido van Rossum30a685f1991-06-27 15:51:29 +00002700/* List of functions exported by this module. */
2701
Guido van Rossum73624e91994-10-10 17:59:00 +00002702static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002703 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002704 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002705 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002706 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002707 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002708 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002709 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002710 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002711 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002712 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002713 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002714 METH_VARARGS,getprotobyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002715 {"socket", PySocket_socket,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002716 METH_VARARGS, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002717#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002718 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002719 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002720#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002721 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002722 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002723 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002724 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002725 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002726 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002727 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002728 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002729 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002730 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002731 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002732 METH_VARARGS, inet_ntoa_doc},
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002733 {"getaddrinfo", PySocket_getaddrinfo,
2734 METH_VARARGS, getaddrinfo_doc},
2735 {"getnameinfo", PySocket_getnameinfo,
2736 METH_VARARGS, getnameinfo_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002737#ifdef USE_SSL
Guido van Rossum48a680c2001-03-02 06:34:14 +00002738 {"ssl", PySocket_ssl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002739 METH_VARARGS, ssl_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002740#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002741 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002742};
2743
Guido van Rossum30a685f1991-06-27 15:51:29 +00002744
2745/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002746 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002747 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002748 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002749static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002750insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002751{
Guido van Rossum73624e91994-10-10 17:59:00 +00002752 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002753 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002754 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002755
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002756 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002757}
2758
Guido van Rossum30a685f1991-06-27 15:51:29 +00002759
Guido van Rossum8d665e61996-06-26 18:22:49 +00002760#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002761
2762/* Additional initialization and cleanup for NT/Windows */
2763
2764static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002765NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002766{
2767 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002768}
2769
2770static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002771NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002772{
2773 WSADATA WSAData;
2774 int ret;
2775 char buf[100];
2776 ret = WSAStartup(0x0101, &WSAData);
2777 switch (ret) {
2778 case 0: /* no error */
2779 atexit(NTcleanup);
2780 return 1;
2781 case WSASYSNOTREADY:
2782 PyErr_SetString(PyExc_ImportError,
2783 "WSAStartup failed: network not ready");
2784 break;
2785 case WSAVERNOTSUPPORTED:
2786 case WSAEINVAL:
2787 PyErr_SetString(PyExc_ImportError,
2788 "WSAStartup failed: requested version not supported");
2789 break;
2790 default:
2791 sprintf(buf, "WSAStartup failed: error code %d", ret);
2792 PyErr_SetString(PyExc_ImportError, buf);
2793 break;
2794 }
2795 return 0;
2796}
2797
Guido van Rossum8d665e61996-06-26 18:22:49 +00002798#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002799
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002800#if defined(PYOS_OS2)
2801
2802/* Additional initialization and cleanup for OS/2 */
2803
2804static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002805OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002806{
2807 /* No cleanup is necessary for OS/2 Sockets */
2808}
2809
2810static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002811OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002812{
2813 char reason[64];
2814 int rc = sock_init();
2815
2816 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002817 atexit(OS2cleanup);
2818 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002819 }
2820
2821 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2822 PyErr_SetString(PyExc_ImportError, reason);
2823
Guido van Rossum32c575d1997-12-02 20:37:32 +00002824 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002825}
2826
2827#endif /* PYOS_OS2 */
2828
Guido van Rossum30a685f1991-06-27 15:51:29 +00002829/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002830 * This is called when the first 'import socket' is done,
2831 * via a table in config.c, if config.c is compiled with USE_SOCKET
2832 * defined.
2833 *
2834 * For MS_WINDOWS (which means any Windows variant), this module
2835 * is actually called "_socket", and there's a wrapper "socket.py"
2836 * which implements some missing functionality (such as makefile(),
2837 * dup() and fromfd()). The import of "_socket" may fail with an
2838 * ImportError exception if initialization of WINSOCK fails. When
2839 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2840 * scheduled to be made at exit time.
2841 *
2842 * For OS/2, this module is also called "_socket" and uses a wrapper
2843 * "socket.py" which implements that functionality that is missing
2844 * when PC operating systems don't put socket descriptors in the
2845 * operating system's filesystem layer.
2846 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002847
Guido van Rossum82a5c661998-07-07 20:45:43 +00002848static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00002849"Implementation module for socket operations. See the socket module\n\
2850for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00002851
2852static char sockettype_doc[] =
2853"A socket represents one endpoint of a network connection.\n\
2854\n\
2855Methods:\n\
2856\n\
2857accept() -- accept a connection, returning new socket and client address\n\
2858bind() -- bind the socket to a local address\n\
2859close() -- close the socket\n\
2860connect() -- connect the socket to a remote address\n\
2861connect_ex() -- connect, return an error code instead of an exception \n\
2862dup() -- return a new socket object identical to the current one (*)\n\
2863fileno() -- return underlying file descriptor\n\
2864getpeername() -- return remote address (*)\n\
2865getsockname() -- return local address\n\
2866getsockopt() -- get socket options\n\
2867listen() -- start listening for incoming connections\n\
2868makefile() -- return a file object corresponding tot the socket (*)\n\
2869recv() -- receive data\n\
2870recvfrom() -- receive data and sender's address\n\
2871send() -- send data\n\
2872sendto() -- send data to a given address\n\
2873setblocking() -- set or clear the blocking I/O flag\n\
2874setsockopt() -- set socket options\n\
2875shutdown() -- shut down traffic in one or both directions\n\
2876\n\
2877(*) not available on all platforms!)";
2878
Guido van Rossum3886bb61998-12-04 18:50:17 +00002879DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002880init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002881{
Guido van Rossum73624e91994-10-10 17:59:00 +00002882 PyObject *m, *d;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002883#ifdef RISCOS
2884 _kernel_swi_regs r;
2885 r.r[0]=0;
2886 _kernel_swi(0x43380, &r, &r);
2887 taskwindow = r.r[0];
2888#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00002889#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002890 if (!NTinit())
2891 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002892#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002893#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002894 if (!OS2init())
2895 return;
Fred Drakea136d492000-08-16 14:18:30 +00002896#endif /* __TOS_OS2__ */
2897#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002898#endif /* RISCOS */
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002899#ifdef USE_SSL
2900 SSL_Type.ob_type = &PyType_Type;
2901#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00002902 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00002903 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002904 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2905 if (PySocket_Error == NULL)
2906 return;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002907 PyH_Error = PyErr_NewException("socket.herror", PySocket_Error, NULL);
2908 if (PyH_Error == NULL)
2909 return;
2910 PyGAI_Error = PyErr_NewException("socket.gaierror", PySocket_Error,
2911 NULL);
2912 if (PyGAI_Error == NULL)
2913 return;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002914#ifdef USE_SSL
2915 SSL_load_error_strings();
2916 SSLeay_add_ssl_algorithms();
2917 SSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2918 if (SSLErrorObject == NULL)
2919 return;
2920 PyDict_SetItemString(d, "sslerror", SSLErrorObject);
2921 Py_INCREF(&SSL_Type);
2922 if (PyDict_SetItemString(d, "SSLType",
2923 (PyObject *)&SSL_Type) != 0)
2924 return;
2925#endif /* USE_SSL */
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002926 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002927 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002928 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002929 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002930 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002931 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002932 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002933
2934 /* Address families (we only support AF_INET and AF_UNIX) */
2935#ifdef AF_UNSPEC
2936 insint(d, "AF_UNSPEC", AF_UNSPEC);
2937#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002938 insint(d, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002939#ifdef AF_INET6
2940 insint(d, "AF_INET6", AF_INET6);
2941#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002942#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002943 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002944#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002945#ifdef AF_AX25
2946 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2947#endif
2948#ifdef AF_IPX
2949 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2950#endif
2951#ifdef AF_APPLETALK
2952 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2953#endif
2954#ifdef AF_NETROM
2955 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2956#endif
2957#ifdef AF_BRIDGE
2958 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2959#endif
2960#ifdef AF_AAL5
2961 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2962#endif
2963#ifdef AF_X25
2964 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2965#endif
2966#ifdef AF_INET6
2967 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2968#endif
2969#ifdef AF_ROSE
2970 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2971#endif
Jeremy Hylton22308652001-02-02 03:23:09 +00002972#if defined(linux) && defined(AF_PACKET)
2973 insint(d, "AF_PACKET", AF_PACKET);
2974 insint(d, "PF_PACKET", PF_PACKET);
2975 insint(d, "PACKET_HOST", PACKET_HOST);
2976 insint(d, "PACKET_BROADCAST", PACKET_BROADCAST);
2977 insint(d, "PACKET_MULTICAST", PACKET_MULTICAST);
2978 insint(d, "PACKET_OTHERHOST", PACKET_OTHERHOST);
2979 insint(d, "PACKET_OUTGOING", PACKET_OUTGOING);
2980 insint(d, "PACKET_LOOPBACK", PACKET_LOOPBACK);
2981 insint(d, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002982#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002983
2984 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002985 insint(d, "SOCK_STREAM", SOCK_STREAM);
2986 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002987#ifndef __BEOS__
2988/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002989 insint(d, "SOCK_RAW", SOCK_RAW);
2990 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2991 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002992#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002993
2994#ifdef SO_DEBUG
2995 insint(d, "SO_DEBUG", SO_DEBUG);
2996#endif
2997#ifdef SO_ACCEPTCONN
2998 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
2999#endif
3000#ifdef SO_REUSEADDR
3001 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
3002#endif
3003#ifdef SO_KEEPALIVE
3004 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
3005#endif
3006#ifdef SO_DONTROUTE
3007 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
3008#endif
3009#ifdef SO_BROADCAST
3010 insint(d, "SO_BROADCAST", SO_BROADCAST);
3011#endif
3012#ifdef SO_USELOOPBACK
3013 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
3014#endif
3015#ifdef SO_LINGER
3016 insint(d, "SO_LINGER", SO_LINGER);
3017#endif
3018#ifdef SO_OOBINLINE
3019 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
3020#endif
3021#ifdef SO_REUSEPORT
3022 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
3023#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003024#ifdef SO_SNDBUF
3025 insint(d, "SO_SNDBUF", SO_SNDBUF);
3026#endif
3027#ifdef SO_RCVBUF
3028 insint(d, "SO_RCVBUF", SO_RCVBUF);
3029#endif
3030#ifdef SO_SNDLOWAT
3031 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
3032#endif
3033#ifdef SO_RCVLOWAT
3034 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
3035#endif
3036#ifdef SO_SNDTIMEO
3037 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
3038#endif
3039#ifdef SO_RCVTIMEO
3040 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
3041#endif
3042#ifdef SO_ERROR
3043 insint(d, "SO_ERROR", SO_ERROR);
3044#endif
3045#ifdef SO_TYPE
3046 insint(d, "SO_TYPE", SO_TYPE);
3047#endif
3048
3049 /* Maximum number of connections for "listen" */
3050#ifdef SOMAXCONN
3051 insint(d, "SOMAXCONN", SOMAXCONN);
3052#else
3053 insint(d, "SOMAXCONN", 5); /* Common value */
3054#endif
3055
3056 /* Flags for send, recv */
3057#ifdef MSG_OOB
3058 insint(d, "MSG_OOB", MSG_OOB);
3059#endif
3060#ifdef MSG_PEEK
3061 insint(d, "MSG_PEEK", MSG_PEEK);
3062#endif
3063#ifdef MSG_DONTROUTE
3064 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
3065#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003066#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00003067 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003068#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003069#ifdef MSG_EOR
3070 insint(d, "MSG_EOR", MSG_EOR);
3071#endif
3072#ifdef MSG_TRUNC
3073 insint(d, "MSG_TRUNC", MSG_TRUNC);
3074#endif
3075#ifdef MSG_CTRUNC
3076 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
3077#endif
3078#ifdef MSG_WAITALL
3079 insint(d, "MSG_WAITALL", MSG_WAITALL);
3080#endif
3081#ifdef MSG_BTAG
3082 insint(d, "MSG_BTAG", MSG_BTAG);
3083#endif
3084#ifdef MSG_ETAG
3085 insint(d, "MSG_ETAG", MSG_ETAG);
3086#endif
3087
3088 /* Protocol level and numbers, usable for [gs]etsockopt */
3089#ifdef SOL_SOCKET
3090 insint(d, "SOL_SOCKET", SOL_SOCKET);
3091#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003092#ifdef SOL_IP
3093 insint(d, "SOL_IP", SOL_IP);
3094#else
3095 insint(d, "SOL_IP", 0);
3096#endif
3097#ifdef SOL_IPX
3098 insint(d, "SOL_IPX", SOL_IPX);
3099#endif
3100#ifdef SOL_AX25
3101 insint(d, "SOL_AX25", SOL_AX25);
3102#endif
3103#ifdef SOL_ATALK
3104 insint(d, "SOL_ATALK", SOL_ATALK);
3105#endif
3106#ifdef SOL_NETROM
3107 insint(d, "SOL_NETROM", SOL_NETROM);
3108#endif
3109#ifdef SOL_ROSE
3110 insint(d, "SOL_ROSE", SOL_ROSE);
3111#endif
3112#ifdef SOL_TCP
3113 insint(d, "SOL_TCP", SOL_TCP);
3114#else
3115 insint(d, "SOL_TCP", 6);
3116#endif
3117#ifdef SOL_UDP
3118 insint(d, "SOL_UDP", SOL_UDP);
3119#else
3120 insint(d, "SOL_UDP", 17);
3121#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003122#ifdef IPPROTO_IP
3123 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003124#else
3125 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003126#endif
3127#ifdef IPPROTO_ICMP
3128 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003129#else
3130 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003131#endif
3132#ifdef IPPROTO_IGMP
3133 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
3134#endif
3135#ifdef IPPROTO_GGP
3136 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
3137#endif
3138#ifdef IPPROTO_TCP
3139 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003140#else
3141 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003142#endif
3143#ifdef IPPROTO_EGP
3144 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
3145#endif
3146#ifdef IPPROTO_PUP
3147 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
3148#endif
3149#ifdef IPPROTO_UDP
3150 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003151#else
3152 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003153#endif
3154#ifdef IPPROTO_IDP
3155 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
3156#endif
3157#ifdef IPPROTO_HELLO
3158 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
3159#endif
3160#ifdef IPPROTO_ND
3161 insint(d, "IPPROTO_ND", IPPROTO_ND);
3162#endif
3163#ifdef IPPROTO_TP
3164 insint(d, "IPPROTO_TP", IPPROTO_TP);
3165#endif
3166#ifdef IPPROTO_XTP
3167 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
3168#endif
3169#ifdef IPPROTO_EON
3170 insint(d, "IPPROTO_EON", IPPROTO_EON);
3171#endif
3172#ifdef IPPROTO_BIP
3173 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
3174#endif
3175/**/
3176#ifdef IPPROTO_RAW
3177 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003178#else
3179 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003180#endif
3181#ifdef IPPROTO_MAX
3182 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
3183#endif
3184
3185 /* Some port configuration */
3186#ifdef IPPORT_RESERVED
3187 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
3188#else
3189 insint(d, "IPPORT_RESERVED", 1024);
3190#endif
3191#ifdef IPPORT_USERRESERVED
3192 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
3193#else
3194 insint(d, "IPPORT_USERRESERVED", 5000);
3195#endif
3196
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003197 /* Some reserved IP v.4 addresses */
3198#ifdef INADDR_ANY
3199 insint(d, "INADDR_ANY", INADDR_ANY);
3200#else
3201 insint(d, "INADDR_ANY", 0x00000000);
3202#endif
3203#ifdef INADDR_BROADCAST
3204 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
3205#else
3206 insint(d, "INADDR_BROADCAST", 0xffffffff);
3207#endif
3208#ifdef INADDR_LOOPBACK
3209 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
3210#else
3211 insint(d, "INADDR_LOOPBACK", 0x7F000001);
3212#endif
3213#ifdef INADDR_UNSPEC_GROUP
3214 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
3215#else
3216 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
3217#endif
3218#ifdef INADDR_ALLHOSTS_GROUP
3219 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
3220#else
3221 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
3222#endif
3223#ifdef INADDR_MAX_LOCAL_GROUP
3224 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
3225#else
3226 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
3227#endif
3228#ifdef INADDR_NONE
3229 insint(d, "INADDR_NONE", INADDR_NONE);
3230#else
3231 insint(d, "INADDR_NONE", 0xffffffff);
3232#endif
3233
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003234 /* IP [gs]etsockopt options */
3235#ifdef IP_OPTIONS
3236 insint(d, "IP_OPTIONS", IP_OPTIONS);
3237#endif
3238#ifdef IP_HDRINCL
3239 insint(d, "IP_HDRINCL", IP_HDRINCL);
3240#endif
3241#ifdef IP_TOS
3242 insint(d, "IP_TOS", IP_TOS);
3243#endif
3244#ifdef IP_TTL
3245 insint(d, "IP_TTL", IP_TTL);
3246#endif
3247#ifdef IP_RECVOPTS
3248 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
3249#endif
3250#ifdef IP_RECVRETOPTS
3251 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
3252#endif
3253#ifdef IP_RECVDSTADDR
3254 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
3255#endif
3256#ifdef IP_RETOPTS
3257 insint(d, "IP_RETOPTS", IP_RETOPTS);
3258#endif
3259#ifdef IP_MULTICAST_IF
3260 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
3261#endif
3262#ifdef IP_MULTICAST_TTL
3263 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
3264#endif
3265#ifdef IP_MULTICAST_LOOP
3266 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
3267#endif
3268#ifdef IP_ADD_MEMBERSHIP
3269 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
3270#endif
3271#ifdef IP_DROP_MEMBERSHIP
3272 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
3273#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003274#ifdef IP_DEFAULT_MULTICAST_TTL
3275 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
3276#endif
3277#ifdef IP_DEFAULT_MULTICAST_LOOP
3278 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
3279#endif
3280#ifdef IP_MAX_MEMBERSHIPS
3281 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
3282#endif
3283
3284 /* TCP options */
3285#ifdef TCP_NODELAY
3286 insint(d, "TCP_NODELAY", TCP_NODELAY);
3287#endif
3288#ifdef TCP_MAXSEG
3289 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
3290#endif
3291
3292 /* IPX options */
3293#ifdef IPX_TYPE
3294 insint(d, "IPX_TYPE", IPX_TYPE);
3295#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003296
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003297 /* get{addr,name}info parameters */
3298#ifdef EAI_ADDRFAMILY
3299 insint(d, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
3300#endif
3301#ifdef EAI_AGAIN
3302 insint(d, "EAI_AGAIN", EAI_AGAIN);
3303#endif
3304#ifdef EAI_BADFLAGS
3305 insint(d, "EAI_BADFLAGS", EAI_BADFLAGS);
3306#endif
3307#ifdef EAI_FAIL
3308 insint(d, "EAI_FAIL", EAI_FAIL);
3309#endif
3310#ifdef EAI_FAMILY
3311 insint(d, "EAI_FAMILY", EAI_FAMILY);
3312#endif
3313#ifdef EAI_MEMORY
3314 insint(d, "EAI_MEMORY", EAI_MEMORY);
3315#endif
3316#ifdef EAI_NODATA
3317 insint(d, "EAI_NODATA", EAI_NODATA);
3318#endif
3319#ifdef EAI_NONAME
3320 insint(d, "EAI_NONAME", EAI_NONAME);
3321#endif
3322#ifdef EAI_SERVICE
3323 insint(d, "EAI_SERVICE", EAI_SERVICE);
3324#endif
3325#ifdef EAI_SOCKTYPE
3326 insint(d, "EAI_SOCKTYPE", EAI_SOCKTYPE);
3327#endif
3328#ifdef EAI_SYSTEM
3329 insint(d, "EAI_SYSTEM", EAI_SYSTEM);
3330#endif
3331#ifdef EAI_BADHINTS
3332 insint(d, "EAI_BADHINTS", EAI_BADHINTS);
3333#endif
3334#ifdef EAI_PROTOCOL
3335 insint(d, "EAI_PROTOCOL", EAI_PROTOCOL);
3336#endif
3337#ifdef EAI_MAX
3338 insint(d, "EAI_MAX", EAI_MAX);
3339#endif
3340#ifdef AI_PASSIVE
3341 insint(d, "AI_PASSIVE", AI_PASSIVE);
3342#endif
3343#ifdef AI_CANONNAME
3344 insint(d, "AI_CANONNAME", AI_CANONNAME);
3345#endif
3346#ifdef AI_NUMERICHOST
3347 insint(d, "AI_NUMERICHOST", AI_NUMERICHOST);
3348#endif
3349#ifdef AI_MASK
3350 insint(d, "AI_MASK", AI_MASK);
3351#endif
3352#ifdef AI_ALL
3353 insint(d, "AI_ALL", AI_ALL);
3354#endif
3355#ifdef AI_V4MAPPED_CFG
3356 insint(d, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
3357#endif
3358#ifdef AI_ADDRCONFIG
3359 insint(d, "AI_ADDRCONFIG", AI_ADDRCONFIG);
3360#endif
3361#ifdef AI_V4MAPPED
3362 insint(d, "AI_V4MAPPED", AI_V4MAPPED);
3363#endif
3364#ifdef AI_DEFAULT
3365 insint(d, "AI_DEFAULT", AI_DEFAULT);
3366#endif
3367#ifdef NI_MAXHOST
3368 insint(d, "NI_MAXHOST", NI_MAXHOST);
3369#endif
3370#ifdef NI_MAXSERV
3371 insint(d, "NI_MAXSERV", NI_MAXSERV);
3372#endif
3373#ifdef NI_NOFQDN
3374 insint(d, "NI_NOFQDN", NI_NOFQDN);
3375#endif
3376#ifdef NI_NUMERICHOST
3377 insint(d, "NI_NUMERICHOST", NI_NUMERICHOST);
3378#endif
3379#ifdef NI_NAMEREQD
3380 insint(d, "NI_NAMEREQD", NI_NAMEREQD);
3381#endif
3382#ifdef NI_NUMERICSERV
3383 insint(d, "NI_NUMERICSERV", NI_NUMERICSERV);
3384#endif
3385#ifdef NI_DGRAM
3386 insint(d, "NI_DGRAM", NI_DGRAM);
3387#endif
3388
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003389 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003390#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003391 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003392#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003393}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003394
3395/* Simplistic emulation code for inet_pton that only works for IPv4 */
3396#ifndef HAVE_INET_PTON
Martin v. Löwisa2ca1ae2001-06-24 21:35:43 +00003397int
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003398inet_pton (int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003399{
3400 if(af == AF_INET){
3401 long packed_addr;
3402#ifdef USE_GUSI1
3403 packed_addr = (long)inet_addr(src).s_addr;
3404#else
3405 packed_addr = inet_addr(src);
3406#endif
3407 if (packed_addr == INADDR_NONE)
3408 return 0;
3409 memcpy(dst, &packed_addr, 4);
3410 return 1;
3411 }
3412 /* Should set errno to EAFNOSUPPORT */
3413 return -1;
3414}
3415
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003416const char *
3417inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003418{
3419 if (af == AF_INET) {
3420 struct in_addr packed_addr;
3421 if (size < 16)
3422 /* Should set errno to ENOSPC. */
3423 return NULL;
3424 memcpy(&packed_addr, src, sizeof(packed_addr));
3425 return strncpy(dst, inet_ntoa(packed_addr), size);
3426 }
3427 /* Should set errno to EAFNOSUPPORT */
3428 return NULL;
3429}
3430#endif