blob: 525a19e72770e78f2deef1cf10d930ca4ae825d8 [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
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000182#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000183#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öwisae26dc22001-08-03 10:02:29 +0000221#ifdef __APPLE__
222/* On OS X, getaddrinfo returns no error indication of lookup
223 failure, so we must use the emulation instead of the libinfo
224 implementation. Unfortunately, performing an autoconf test
225 for this bug would require DNS access for the machine performing
226 the configuration, which is not acceptable. Therefore, we
227 determine the bug just by checking for __APPLE__. If this bug
228 gets ever fixed, perhaps checking for sys/version.h would be
229 appropriate, which is 10/0 on the system with the bug. */
230#undef HAVE_GETADDRINFO
231/* avoid clashes with the C library definition of the symbol. */
232#define getaddrinfo fake_getaddrinfo
233#endif
234
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000235/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000236#if !defined(HAVE_GETADDRINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000237#include "getaddrinfo.c"
238#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000239#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000240#include "getnameinfo.c"
241#endif
242
Guido van Rossumbcc20741998-08-04 22:53:56 +0000243#if defined(MS_WINDOWS) || defined(__BEOS__)
244/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000245/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000246#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000247#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000248#endif
249
Fred Drakea04eaad2000-06-30 02:46:07 +0000250/* abstract the socket file descriptor type */
251#ifdef MS_WINDOWS
252typedef SOCKET SOCKET_T;
253# ifdef MS_WIN64
254# define SIZEOF_SOCKET_T 8
255# else
256# define SIZEOF_SOCKET_T 4
257# endif
258#else
259typedef int SOCKET_T;
260# define SIZEOF_SOCKET_T SIZEOF_INT
261#endif
262
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000263#ifdef MS_WIN32
264# define EAFNOSUPPORT WSAEAFNOSUPPORT
265# define snprintf _snprintf
266#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000267
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000268#if defined(PYOS_OS2)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000269#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000270#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000271#endif
272
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000273#ifndef SOCKETCLOSE
274#define SOCKETCLOSE close
275#endif
276
Guido van Rossum30a685f1991-06-27 15:51:29 +0000277/* Global variable holding the exception type for errors detected
278 by this module (but not argument type or memory errors, etc.). */
279
Guido van Rossum73624e91994-10-10 17:59:00 +0000280static PyObject *PySocket_Error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000281static PyObject *PyH_Error;
282static PyObject *PyGAI_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000283
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000284#ifdef USE_SSL
285static PyObject *SSLErrorObject;
286#endif /* USE_SSL */
287
Guido van Rossum30a685f1991-06-27 15:51:29 +0000288
Guido van Rossum48a680c2001-03-02 06:34:14 +0000289#ifdef RISCOS
290/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
291static int taskwindow;
292#endif
293
294
Guido van Rossum30a685f1991-06-27 15:51:29 +0000295/* Convenience function to raise an error according to errno
296 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000297
Guido van Rossum73624e91994-10-10 17:59:00 +0000298static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000299PySocket_Err(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000300{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000301#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000302 int err_no = WSAGetLastError();
303 if (err_no) {
304 static struct { int no; const char *msg; } *msgp, msgs[] = {
305 { WSAEINTR, "Interrupted system call" },
306 { WSAEBADF, "Bad file descriptor" },
307 { WSAEACCES, "Permission denied" },
308 { WSAEFAULT, "Bad address" },
309 { WSAEINVAL, "Invalid argument" },
310 { WSAEMFILE, "Too many open files" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000311 { WSAEWOULDBLOCK,
Mark Hammond46a733d2000-07-24 01:45:11 +0000312 "The socket operation could not complete "
313 "without blocking" },
314 { WSAEINPROGRESS, "Operation now in progress" },
315 { WSAEALREADY, "Operation already in progress" },
316 { WSAENOTSOCK, "Socket operation on non-socket" },
317 { WSAEDESTADDRREQ, "Destination address required" },
318 { WSAEMSGSIZE, "Message too long" },
319 { WSAEPROTOTYPE, "Protocol wrong type for socket" },
320 { WSAENOPROTOOPT, "Protocol not available" },
321 { WSAEPROTONOSUPPORT, "Protocol not supported" },
322 { WSAESOCKTNOSUPPORT, "Socket type not supported" },
323 { WSAEOPNOTSUPP, "Operation not supported" },
324 { WSAEPFNOSUPPORT, "Protocol family not supported" },
325 { WSAEAFNOSUPPORT, "Address family not supported" },
326 { WSAEADDRINUSE, "Address already in use" },
327 { WSAEADDRNOTAVAIL,
328 "Can't assign requested address" },
329 { WSAENETDOWN, "Network is down" },
330 { WSAENETUNREACH, "Network is unreachable" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000331 { WSAENETRESET,
Mark Hammond46a733d2000-07-24 01:45:11 +0000332 "Network dropped connection on reset" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000333 { WSAECONNABORTED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000334 "Software caused connection abort" },
335 { WSAECONNRESET, "Connection reset by peer" },
336 { WSAENOBUFS, "No buffer space available" },
337 { WSAEISCONN, "Socket is already connected" },
338 { WSAENOTCONN, "Socket is not connected" },
339 { WSAESHUTDOWN, "Can't send after socket shutdown" },
340 { WSAETOOMANYREFS,
341 "Too many references: can't splice" },
342 { WSAETIMEDOUT, "Operation timed out" },
343 { WSAECONNREFUSED, "Connection refused" },
344 { WSAELOOP, "Too many levels of symbolic links" },
345 { WSAENAMETOOLONG, "File name too long" },
346 { WSAEHOSTDOWN, "Host is down" },
347 { WSAEHOSTUNREACH, "No route to host" },
348 { WSAENOTEMPTY, "Directory not empty" },
349 { WSAEPROCLIM, "Too many processes" },
350 { WSAEUSERS, "Too many users" },
351 { WSAEDQUOT, "Disc quota exceeded" },
352 { WSAESTALE, "Stale NFS file handle" },
353 { WSAEREMOTE, "Too many levels of remote in path" },
354 { WSASYSNOTREADY,
355 "Network subsystem is unvailable" },
356 { WSAVERNOTSUPPORTED,
357 "WinSock version is not supported" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000358 { WSANOTINITIALISED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000359 "Successful WSAStartup() not yet performed" },
360 { WSAEDISCON, "Graceful shutdown in progress" },
361 /* Resolver errors */
362 { WSAHOST_NOT_FOUND, "No such host is known" },
363 { WSATRY_AGAIN, "Host not found, or server failed" },
364 { WSANO_RECOVERY,
365 "Unexpected server error encountered" },
366 { WSANO_DATA, "Valid name without requested data" },
367 { WSANO_ADDRESS, "No address, look for MX record" },
368 { 0, NULL }
369 };
Guido van Rossum73624e91994-10-10 17:59:00 +0000370 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000371 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000372
Mark Hammond46a733d2000-07-24 01:45:11 +0000373 for (msgp = msgs; msgp->msg; msgp++) {
374 if (err_no == msgp->no) {
375 msg = msgp->msg;
376 break;
377 }
378 }
379
380 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000381 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000382 PyErr_SetObject(PySocket_Error, v);
383 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000384 }
385 return NULL;
386 }
387 else
388#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000389
390#if defined(PYOS_OS2)
391 if (sock_errno() != NO_ERROR) {
392 APIRET rc;
393 ULONG msglen;
394 char outbuf[100];
395 int myerrorcode = sock_errno();
396
397 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
398 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
399 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
400 if (rc == NO_ERROR) {
401 PyObject *v;
402
403 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
404 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
405 char *lastc = &outbuf[ strlen(outbuf)-1 ];
406 while (lastc > outbuf && isspace(*lastc))
407 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
408 }
409 v = Py_BuildValue("(is)", myerrorcode, outbuf);
410 if (v != NULL) {
411 PyErr_SetObject(PySocket_Error, v);
412 Py_DECREF(v);
413 }
414 return NULL;
415 }
416 }
417#endif
418
Guido van Rossum73624e91994-10-10 17:59:00 +0000419 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000420}
421
Guido van Rossum30a685f1991-06-27 15:51:29 +0000422
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000423static PyObject *
424PyH_Err(int h_error)
425{
426 PyObject *v;
427
428#ifdef HAVE_HSTRERROR
429 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
430#else
431 v = Py_BuildValue("(is)", h_error, "host not found");
432#endif
433 if (v != NULL) {
Martin v. Löwis864e9ff2001-08-04 22:32:03 +0000434 PyErr_SetObject(PyH_Error, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000435 Py_DECREF(v);
436 }
437
438 return NULL;
439}
440
441
442static PyObject *
443PyGAI_Err(int error)
444{
445 PyObject *v;
446
447 if (error == EAI_SYSTEM)
448 return PySocket_Err();
449
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000450#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000451 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000452#else
453 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
454#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000455 if (v != NULL) {
456 PyErr_SetObject(PyGAI_Error, v);
457 Py_DECREF(v);
458 }
459
460 return NULL;
461}
462
463
Guido van Rossum30a685f1991-06-27 15:51:29 +0000464/* The object holding a socket. It holds some extra information,
465 like the address family, which is used to decode socket address
466 arguments properly. */
467
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000468typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000469 PyObject_HEAD
Fred Drakea04eaad2000-06-30 02:46:07 +0000470 SOCKET_T sock_fd; /* Socket file descriptor */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000471 int sock_family; /* Address family, e.g., AF_INET */
472 int sock_type; /* Socket type, e.g., SOCK_STREAM */
473 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000474 union sock_addr {
475 struct sockaddr_in in;
476#ifdef AF_UNIX
477 struct sockaddr_un un;
478#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000479#ifdef INET6
480 struct sockaddr_in6 in6;
481 struct sockaddr_storage storage;
482#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000483#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000484 struct sockaddr_ll ll;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000485#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000486 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000487} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000488
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000489#ifdef USE_SSL
Guido van Rossum30a685f1991-06-27 15:51:29 +0000490
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000491typedef struct {
492 PyObject_HEAD
493 PySocketSockObject *Socket; /* Socket on which we're layered */
494 PyObject *x_attr; /* Attributes dictionary */
495 SSL_CTX* ctx;
496 SSL* ssl;
497 X509* server_cert;
498 BIO* sbio;
499 char server[256];
500 char issuer[256];
501
502} SSLObject;
503
504staticforward PyTypeObject SSL_Type;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000505staticforward PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args);
506staticforward PyObject *SSL_SSLread(SSLObject *self, PyObject *args);
507
508#define SSLObject_Check(v) ((v)->ob_type == &SSL_Type)
509
510#endif /* USE_SSL */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000511
Guido van Rossum30a685f1991-06-27 15:51:29 +0000512/* A forward reference to the Socktype type object.
513 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000514 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000515 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000516
Guido van Rossum73624e91994-10-10 17:59:00 +0000517staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000518
Guido van Rossum30a685f1991-06-27 15:51:29 +0000519
520/* Create a new socket object.
521 This just creates the object and initializes it.
522 If the creation fails, return NULL and set an exception (implicit
523 in NEWOBJ()). */
524
Guido van Rossum73624e91994-10-10 17:59:00 +0000525static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000526PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000527{
Guido van Rossum48a680c2001-03-02 06:34:14 +0000528#ifdef RISCOS
529 int block = 1;
530#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000531 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000532 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000533 s = PyObject_New(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000534 if (s != NULL) {
535 s->sock_fd = fd;
536 s->sock_family = family;
537 s->sock_type = type;
538 s->sock_proto = proto;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000539#ifdef RISCOS
540 if(taskwindow) {
541 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
542 }
543#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000544 }
545 return s;
546}
547
Guido van Rossum30a685f1991-06-27 15:51:29 +0000548
Guido van Rossum48a680c2001-03-02 06:34:14 +0000549/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000550 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000551#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000552PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000553#endif
554
555
Guido van Rossum30a685f1991-06-27 15:51:29 +0000556/* Convert a string specifying a host name or one of a few symbolic
557 names to a numeric IP address. This usually calls gethostbyname()
558 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000559 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000560 an error occurred; then an exception is raised. */
561
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000562static int
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000563setipaddr(char* name, struct sockaddr * addr_ret, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000564{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000565 struct addrinfo hints, *res;
566 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000567
Guido van Rossuma376cc51996-12-05 23:43:35 +0000568 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000569 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000570 int siz;
571 memset(&hints, 0, sizeof(hints));
572 hints.ai_family = af;
573 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
574 hints.ai_flags = AI_PASSIVE;
575 error = getaddrinfo(NULL, "0", &hints, &res);
576 if (error) {
577 PyGAI_Err(error);
578 return -1;
579 }
580 switch (res->ai_family) {
581 case AF_INET:
582 siz = 4;
583 break;
584#ifdef INET6
585 case AF_INET6:
586 siz = 16;
587 break;
588#endif
589 default:
590 freeaddrinfo(res);
591 PyErr_SetString(PySocket_Error,
592 "unsupported address family");
593 return -1;
594 }
595 if (res->ai_next) {
596 PyErr_SetString(PySocket_Error,
597 "wildcard resolved to multiple address");
598 return -1;
599 }
600 memcpy(addr_ret, res->ai_addr, res->ai_addrlen);
601 freeaddrinfo(res);
602 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000603 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000604 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000605 struct sockaddr_in *sin;
606 if (af != PF_INET && af != PF_UNSPEC) {
607 PyErr_SetString(PySocket_Error,
608 "address family mismatched");
609 return -1;
610 }
611 sin = (struct sockaddr_in *)addr_ret;
612 memset((void *) sin, '\0', sizeof(*sin));
613 sin->sin_family = AF_INET;
614#ifdef HAVE_SOCKADDR_SA_LEN
615 sin->sin_len = sizeof(*sin);
616#endif
617 sin->sin_addr.s_addr = INADDR_BROADCAST;
618 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000619 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000620 memset(&hints, 0, sizeof(hints));
621 hints.ai_family = af;
622 error = getaddrinfo(name, NULL, &hints, &res);
623 if (error) {
624 PyGAI_Err(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000625 return -1;
626 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000627 memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
628 freeaddrinfo(res);
629 switch (addr_ret->sa_family) {
630 case AF_INET:
631 return 4;
632#ifdef INET6
633 case AF_INET6:
634 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000635#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000636 default:
637 PyErr_SetString(PySocket_Error, "unknown address family");
638 return -1;
639 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000640}
641
Guido van Rossum30a685f1991-06-27 15:51:29 +0000642
Guido van Rossum30a685f1991-06-27 15:51:29 +0000643/* Create a string object representing an IP address.
644 This is always a string of the form 'dd.dd.dd.dd' (with variable
645 size numbers). */
646
Guido van Rossum73624e91994-10-10 17:59:00 +0000647static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000648makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000649{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000650 char buf[NI_MAXHOST];
651 int error;
652
653 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
654 NI_NUMERICHOST);
655 if (error) {
656 PyGAI_Err(error);
657 return NULL;
658 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000659 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000660}
661
662
663/* Create an object representing the given socket address,
664 suitable for passing it back to bind(), connect() etc.
665 The family field of the sockaddr structure is inspected
666 to determine what kind of address it really is. */
667
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000668/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000669static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000670makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000671{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000672 if (addrlen == 0) {
673 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000674 Py_INCREF(Py_None);
675 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000676 }
677
Guido van Rossumbcc20741998-08-04 22:53:56 +0000678#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000679 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000680 addr->sa_family = AF_INET;
681#endif
682
Guido van Rossum30a685f1991-06-27 15:51:29 +0000683 switch (addr->sa_family) {
684
685 case AF_INET:
686 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000687 struct sockaddr_in *a;
688 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000689 PyObject *ret = NULL;
690 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000691 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000692 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
693 Py_DECREF(addrobj);
694 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000695 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000696 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000697
Guido van Rossumb6775db1994-08-01 11:34:53 +0000698#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000699 case AF_UNIX:
700 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000701 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000702 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000703 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000704#endif /* AF_UNIX */
705
706#ifdef INET6
707 case AF_INET6:
708 {
709 struct sockaddr_in6 *a;
710 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
711 PyObject *ret = NULL;
712 if (addrobj) {
713 a = (struct sockaddr_in6 *)addr;
714 ret = Py_BuildValue("Oiii", addrobj, ntohs(a->sin6_port),
715 a->sin6_flowinfo, a->sin6_scope_id);
716 Py_DECREF(addrobj);
717 }
718 return ret;
719 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000720#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000721
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000722#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000723 case AF_PACKET:
724 {
725 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
726 char *ifname = "";
727 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000728 /* need to look up interface name give index */
729 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000730 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000731 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000732 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000733 }
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000734 return Py_BuildValue("shbhs#", ifname, ntohs(a->sll_protocol),
Guido van Rossum48a680c2001-03-02 06:34:14 +0000735 a->sll_pkttype, a->sll_hatype,
736 a->sll_addr, a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000737 }
738#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000739
Guido van Rossum30a685f1991-06-27 15:51:29 +0000740 /* More cases here... */
741
742 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000743 /* If we don't know the address family, don't raise an
744 exception -- return it as a tuple. */
745 return Py_BuildValue("is#",
746 addr->sa_family,
747 addr->sa_data,
748 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000749
Guido van Rossum30a685f1991-06-27 15:51:29 +0000750 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000751}
752
Guido van Rossum30a685f1991-06-27 15:51:29 +0000753
754/* Parse a socket address argument according to the socket object's
755 address family. Return 1 if the address was in the proper format,
756 0 of not. The address is returned through addr_ret, its length
757 through len_ret. */
758
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000759static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000760getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000761 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000762{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000763 switch (s->sock_family) {
764
Guido van Rossumb6775db1994-08-01 11:34:53 +0000765#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000766 case AF_UNIX:
767 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000768 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000769 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000770 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000771 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000772 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000773 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000774 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000775 PyErr_SetString(PySocket_Error,
776 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000777 return 0;
778 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000779 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000780 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000781 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000782 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000783 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000784 return 1;
785 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000786#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000787
Guido van Rossum30a685f1991-06-27 15:51:29 +0000788 case AF_INET:
789 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000790 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000791 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000792 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000793 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000794 if (!PyTuple_Check(args)) {
795 PyErr_Format(PyExc_TypeError,
796 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
797 args->ob_type->tp_name);
798 return 0;
799 }
800 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000801 return 0;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000802 if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000803 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000804 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000805 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000806 *addr_ret = (struct sockaddr *) addr;
807 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000808 return 1;
809 }
810
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000811#ifdef INET6
812 case AF_INET6:
813 {
814 struct sockaddr_in6* addr;
815 char *host;
816 int port, flowinfo, scope_id;
817 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
818 flowinfo = scope_id = 0;
819 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
820 &scope_id)) {
821 return 0;
822 }
823 if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
824 return 0;
825 addr->sin6_family = s->sock_family;
826 addr->sin6_port = htons((short)port);
827 addr->sin6_flowinfo = flowinfo;
828 addr->sin6_scope_id = scope_id;
829 *addr_ret = (struct sockaddr *) addr;
830 *len_ret = sizeof *addr;
831 return 1;
832 }
833#endif
834
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000835#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000836 case AF_PACKET:
837 {
838 struct sockaddr_ll* addr;
839 struct ifreq ifr;
840 char *interfaceName;
841 int protoNumber;
842 int hatype = 0;
843 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000844 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000845
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000846 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
847 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000848 return 0;
849 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
850 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000851 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
852 PyErr_SetFromErrno(PySocket_Error);
Jeremy Hylton22308652001-02-02 03:23:09 +0000853 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000854 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000855 addr = &(s->sock_addr.ll);
856 addr->sll_family = AF_PACKET;
857 addr->sll_protocol = htons((short)protoNumber);
858 addr->sll_ifindex = ifr.ifr_ifindex;
859 addr->sll_pkttype = pkttype;
860 addr->sll_hatype = hatype;
861 *addr_ret = (struct sockaddr *) addr;
862 *len_ret = sizeof *addr;
863 return 1;
864 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000865#endif
866
Guido van Rossum30a685f1991-06-27 15:51:29 +0000867 /* More cases here... */
868
869 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000870 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000871 return 0;
872
873 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000874}
875
Guido van Rossum30a685f1991-06-27 15:51:29 +0000876
Guido van Rossum48a680c2001-03-02 06:34:14 +0000877/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000878 Return 1 if the family is known, 0 otherwise. The length is returned
879 through len_ret. */
880
881static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000882getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000883{
884 switch (s->sock_family) {
885
Guido van Rossumb6775db1994-08-01 11:34:53 +0000886#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000887 case AF_UNIX:
888 {
889 *len_ret = sizeof (struct sockaddr_un);
890 return 1;
891 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000892#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000893
894 case AF_INET:
895 {
896 *len_ret = sizeof (struct sockaddr_in);
897 return 1;
898 }
899
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000900#ifdef INET6
901 case AF_INET6:
902 {
903 *len_ret = sizeof (struct sockaddr_in6);
904 return 1;
905 }
906#endif
907
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000908#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000909 case AF_PACKET:
910 {
911 *len_ret = sizeof (struct sockaddr_ll);
912 return 1;
913 }
914#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000915
Guido van Rossum710e1df1992-06-12 10:39:36 +0000916 /* More cases here... */
917
918 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000919 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000920 return 0;
921
922 }
923}
924
925
Guido van Rossum30a685f1991-06-27 15:51:29 +0000926/* s.accept() method */
927
Guido van Rossum73624e91994-10-10 17:59:00 +0000928static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000929PySocketSock_accept(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000930{
931 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000932 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000933 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000934 PyObject *sock = NULL;
935 PyObject *addr = NULL;
936 PyObject *res = NULL;
937
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000938 if (!PyArg_ParseTuple(args, ":accept"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000939 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000940 if (!getsockaddrlen(s, &addrlen))
941 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000942 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000943 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000944 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000945 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000946#ifdef MS_WINDOWS
947 if (newfd == INVALID_SOCKET)
948#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000949 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000950#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000951 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000952
Guido van Rossum30a685f1991-06-27 15:51:29 +0000953 /* Create the new object with unspecified family,
954 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000955 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000956 s->sock_family,
957 s->sock_type,
958 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000959 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000960 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000961 goto finally;
962 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000963 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000964 addrlen);
965 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +0000966 goto finally;
967
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000968 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000969
970 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000971 Py_XDECREF(sock);
972 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000973 return res;
974}
975
Guido van Rossum82a5c661998-07-07 20:45:43 +0000976static char accept_doc[] =
977"accept() -> (socket object, address info)\n\
978\n\
979Wait for an incoming connection. Return a new socket representing the\n\
980connection, and the address of the client. For IP sockets, the address\n\
981info is a pair (hostaddr, port).";
982
Guido van Rossum30a685f1991-06-27 15:51:29 +0000983
Guido van Rossume4485b01994-09-07 14:32:49 +0000984/* s.setblocking(1 | 0) method */
985
Guido van Rossum73624e91994-10-10 17:59:00 +0000986static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000987PySocketSock_setblocking(PySocketSockObject *s, PyObject *args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000988{
989 int block;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000990#ifndef RISCOS
Guido van Rossum644a12b1997-04-09 19:24:53 +0000991#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000992 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000993#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000994#endif
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000995 if (!PyArg_ParseTuple(args, "i:setblocking", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000996 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000997 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000998#ifdef __BEOS__
999 block = !block;
1000 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
1001 (void *)(&block), sizeof( int ) );
1002#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00001003#ifndef RISCOS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001004#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001005#ifdef PYOS_OS2
1006 block = !block;
1007 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
1008#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +00001009 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
1010 if (block)
1011 delay_flag &= (~O_NDELAY);
1012 else
1013 delay_flag |= O_NDELAY;
1014 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001015#endif /* !PYOS_OS2 */
1016#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001017 block = !block;
1018 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001019#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +00001020#endif /* __BEOS__ */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001021#endif /* RISCOS */
Guido van Rossum73624e91994-10-10 17:59:00 +00001022 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +00001023
Guido van Rossum73624e91994-10-10 17:59:00 +00001024 Py_INCREF(Py_None);
1025 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001026}
Guido van Rossume4485b01994-09-07 14:32:49 +00001027
Guido van Rossum82a5c661998-07-07 20:45:43 +00001028static char setblocking_doc[] =
1029"setblocking(flag)\n\
1030\n\
1031Set the socket to blocking (flag is true) or non-blocking (false).\n\
1032This uses the FIONBIO ioctl with the O_NDELAY flag.";
1033
Guido van Rossume4485b01994-09-07 14:32:49 +00001034
Guido van Rossum48a680c2001-03-02 06:34:14 +00001035#ifdef RISCOS
1036/* s.sleeptaskw(1 | 0) method */
1037
1038static PyObject *
1039PySocketSock_sleeptaskw(PySocketSockObject *s,PyObject *args)
1040{
1041 int block;
1042 int delay_flag;
1043 if (!PyArg_GetInt(args, &block))
1044 return NULL;
1045 Py_BEGIN_ALLOW_THREADS
1046 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1047 Py_END_ALLOW_THREADS
1048
1049 Py_INCREF(Py_None);
1050 return Py_None;
1051}
1052static char sleeptaskw_doc[] =
1053"sleeptaskw(flag)\n\
1054\n\
1055Allow sleeps in taskwindows.";
1056#endif
1057
1058
Guido van Rossumaee08791992-09-08 09:05:33 +00001059/* s.setsockopt() method.
1060 With an integer third argument, sets an integer option.
1061 With a string third argument, sets an option from a buffer;
1062 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001063
Guido van Rossum73624e91994-10-10 17:59:00 +00001064static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001065PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001066{
1067 int level;
1068 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001069 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001070 char *buf;
1071 int buflen;
1072 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001073
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001074 if (PyArg_ParseTuple(args, "iii:setsockopt",
1075 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001076 buf = (char *) &flag;
1077 buflen = sizeof flag;
1078 }
1079 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001080 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001081 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1082 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001083 return NULL;
1084 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001085 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001086 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001087 return PySocket_Err();
1088 Py_INCREF(Py_None);
1089 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001090}
1091
Guido van Rossum82a5c661998-07-07 20:45:43 +00001092static char setsockopt_doc[] =
1093"setsockopt(level, option, value)\n\
1094\n\
1095Set a socket option. See the Unix manual for level and option.\n\
1096The value argument can either be an integer or a string.";
1097
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001098
Guido van Rossumaee08791992-09-08 09:05:33 +00001099/* s.getsockopt() method.
1100 With two arguments, retrieves an integer option.
1101 With a third integer argument, retrieves a string buffer of that size;
1102 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001103
Guido van Rossum73624e91994-10-10 17:59:00 +00001104static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001105PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001106{
1107 int level;
1108 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001109 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001110 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001111 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001112
Guido van Rossumbcc20741998-08-04 22:53:56 +00001113#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001114 /* We have incomplete socket support. */
1115 PyErr_SetString(PySocket_Error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001116 return NULL;
1117#else
1118
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001119 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1120 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001121 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001122
Guido van Rossumbe32c891996-06-20 16:25:29 +00001123 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001124 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001125 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001126 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001127 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001128 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001129 return PySocket_Err();
1130 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001131 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001132 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001133 PyErr_SetString(PySocket_Error,
1134 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001135 return NULL;
1136 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001137 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001138 if (buf == NULL)
1139 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001140 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001141 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001142 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001143 Py_DECREF(buf);
1144 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +00001145 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001146 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001147 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001148#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001149}
1150
Guido van Rossum82a5c661998-07-07 20:45:43 +00001151static char getsockopt_doc[] =
1152"getsockopt(level, option[, buffersize]) -> value\n\
1153\n\
1154Get a socket option. See the Unix manual for level and option.\n\
1155If a nonzero buffersize argument is given, the return value is a\n\
1156string of that length; otherwise it is an integer.";
1157
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001158
Fred Drake728819a2000-07-01 03:40:12 +00001159/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001160
Guido van Rossum73624e91994-10-10 17:59:00 +00001161static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001162PySocketSock_bind(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001163{
1164 struct sockaddr *addr;
1165 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001166 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001167 PyObject *addro;
1168 if (!PyArg_ParseTuple(args, "O:bind", &addro))
1169 return NULL;
1170 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001171 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001172 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001173 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001174 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001175 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001176 return PySocket_Err();
1177 Py_INCREF(Py_None);
1178 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001179}
1180
Guido van Rossum82a5c661998-07-07 20:45:43 +00001181static char bind_doc[] =
1182"bind(address)\n\
1183\n\
1184Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001185pair (host, port); the host must refer to the local host. For raw packet\n\
1186sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001187
Guido van Rossum30a685f1991-06-27 15:51:29 +00001188
1189/* s.close() method.
1190 Set the file descriptor to -1 so operations tried subsequently
1191 will surely fail. */
1192
Guido van Rossum73624e91994-10-10 17:59:00 +00001193static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001194PySocketSock_close(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001195{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001196 SOCKET_T fd;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001197 if (!PyArg_ParseTuple(args, ":close"))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001198 return NULL;
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001199 if ((fd = s->sock_fd) != -1) {
1200 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001201 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001202 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001203 Py_END_ALLOW_THREADS
1204 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001205 Py_INCREF(Py_None);
1206 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001207}
1208
Guido van Rossum82a5c661998-07-07 20:45:43 +00001209static char close_doc[] =
1210"close()\n\
1211\n\
1212Close the socket. It cannot be used after this call.";
1213
Guido van Rossum30a685f1991-06-27 15:51:29 +00001214
Fred Drake728819a2000-07-01 03:40:12 +00001215/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001216
Guido van Rossum73624e91994-10-10 17:59:00 +00001217static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001218PySocketSock_connect(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001219{
1220 struct sockaddr *addr;
1221 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001222 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001223 PyObject *addro;
1224 if (!PyArg_ParseTuple(args, "O:connect", &addro))
1225 return NULL;
1226 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001227 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001228 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001229 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001230 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001231 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001232 return PySocket_Err();
1233 Py_INCREF(Py_None);
1234 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001235}
1236
Guido van Rossum82a5c661998-07-07 20:45:43 +00001237static char connect_doc[] =
1238"connect(address)\n\
1239\n\
1240Connect the socket to a remote address. For IP sockets, the address\n\
1241is a pair (host, port).";
1242
Guido van Rossum30a685f1991-06-27 15:51:29 +00001243
Fred Drake728819a2000-07-01 03:40:12 +00001244/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001245
1246static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001247PySocketSock_connect_ex(PySocketSockObject *s, PyObject *args)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001248{
1249 struct sockaddr *addr;
1250 int addrlen;
1251 int res;
Fred Drake728819a2000-07-01 03:40:12 +00001252 PyObject *addro;
1253 if (!PyArg_ParseTuple(args, "O:connect_ex", &addro))
1254 return NULL;
1255 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001256 return NULL;
1257 Py_BEGIN_ALLOW_THREADS
1258 res = connect(s->sock_fd, addr, addrlen);
1259 Py_END_ALLOW_THREADS
1260 if (res != 0)
1261 res = errno;
1262 return PyInt_FromLong((long) res);
1263}
1264
Guido van Rossum82a5c661998-07-07 20:45:43 +00001265static char connect_ex_doc[] =
1266"connect_ex(address)\n\
1267\n\
1268This is like connect(address), but returns an error code (the errno value)\n\
1269instead of raising an exception when an error occurs.";
1270
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001271
Guido van Rossumed233a51992-06-23 09:07:03 +00001272/* s.fileno() method */
1273
Guido van Rossum73624e91994-10-10 17:59:00 +00001274static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001275PySocketSock_fileno(PySocketSockObject *s, PyObject *args)
Guido van Rossumed233a51992-06-23 09:07:03 +00001276{
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001277 if (!PyArg_ParseTuple(args, ":fileno"))
Guido van Rossumed233a51992-06-23 09:07:03 +00001278 return NULL;
Fred Drakea04eaad2000-06-30 02:46:07 +00001279#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001280 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001281#else
1282 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1283#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001284}
1285
Guido van Rossum82a5c661998-07-07 20:45:43 +00001286static char fileno_doc[] =
1287"fileno() -> integer\n\
1288\n\
1289Return the integer file descriptor of the socket.";
1290
Guido van Rossumed233a51992-06-23 09:07:03 +00001291
Guido van Rossumbe32c891996-06-20 16:25:29 +00001292#ifndef NO_DUP
1293/* s.dup() method */
1294
1295static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001296PySocketSock_dup(PySocketSockObject *s, PyObject *args)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001297{
Fred Drakea04eaad2000-06-30 02:46:07 +00001298 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001299 PyObject *sock;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001300 if (!PyArg_ParseTuple(args, ":dup"))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001301 return NULL;
1302 newfd = dup(s->sock_fd);
1303 if (newfd < 0)
1304 return PySocket_Err();
1305 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001306 s->sock_family,
1307 s->sock_type,
1308 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001309 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001310 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001311 return sock;
1312}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001313
1314static char dup_doc[] =
1315"dup() -> socket object\n\
1316\n\
1317Return a new socket object connected to the same system resource.";
1318
Guido van Rossumbe32c891996-06-20 16:25:29 +00001319#endif
1320
1321
Guido van Rossumc89705d1992-11-26 08:54:07 +00001322/* s.getsockname() method */
1323
Guido van Rossum73624e91994-10-10 17:59:00 +00001324static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001325PySocketSock_getsockname(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001326{
1327 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001328 int res;
1329 socklen_t addrlen;
1330
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001331 if (!PyArg_ParseTuple(args, ":getsockname"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001332 return NULL;
1333 if (!getsockaddrlen(s, &addrlen))
1334 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001335 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001336 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001337 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001338 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001339 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001340 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001341 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001342}
1343
Guido van Rossum82a5c661998-07-07 20:45:43 +00001344static char getsockname_doc[] =
1345"getsockname() -> address info\n\
1346\n\
1347Return the address of the local endpoint. For IP sockets, the address\n\
1348info is a pair (hostaddr, port).";
1349
Guido van Rossumc89705d1992-11-26 08:54:07 +00001350
Guido van Rossumb6775db1994-08-01 11:34:53 +00001351#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001352/* s.getpeername() method */
1353
Guido van Rossum73624e91994-10-10 17:59:00 +00001354static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001355PySocketSock_getpeername(PySocketSockObject *s, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001356{
1357 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001358 int res;
1359 socklen_t addrlen;
1360
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001361 if (!PyArg_ParseTuple(args, ":getpeername"))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001362 return NULL;
1363 if (!getsockaddrlen(s, &addrlen))
1364 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001365 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001366 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001367 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001368 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001369 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001370 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001371 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001372}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001373
1374static char getpeername_doc[] =
1375"getpeername() -> address info\n\
1376\n\
1377Return the address of the remote endpoint. For IP sockets, the address\n\
1378info is a pair (hostaddr, port).";
1379
Guido van Rossumb6775db1994-08-01 11:34:53 +00001380#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001381
1382
Guido van Rossum30a685f1991-06-27 15:51:29 +00001383/* s.listen(n) method */
1384
Guido van Rossum73624e91994-10-10 17:59:00 +00001385static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001386PySocketSock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001387{
1388 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001389 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001390 if (!PyArg_ParseTuple(args, "i:listen", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001391 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001392 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001393 if (backlog < 1)
1394 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001395 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001396 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001397 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001398 return PySocket_Err();
1399 Py_INCREF(Py_None);
1400 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001401}
1402
Guido van Rossum82a5c661998-07-07 20:45:43 +00001403static char listen_doc[] =
1404"listen(backlog)\n\
1405\n\
1406Enable a server to accept connections. The backlog argument must be at\n\
1407least 1; it specifies the number of unaccepted connection that the system\n\
1408will allow before refusing new connections.";
1409
1410
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001411#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001412/* s.makefile(mode) method.
1413 Create a new open file object referring to a dupped version of
1414 the socket's file descriptor. (The dup() call is necessary so
1415 that the open file and socket objects may be closed independent
1416 of each other.)
1417 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1418
Guido van Rossum73624e91994-10-10 17:59:00 +00001419static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001420PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001421{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001422 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001423 char *mode = "r";
1424 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001425#ifdef MS_WIN32
1426 intptr_t fd;
1427#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001428 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001429#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001430 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001431 PyObject *f;
1432
Guido van Rossum43713e52000-02-29 13:59:29 +00001433 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001434 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001435#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001436 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1437 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001438#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001439 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001440#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001441 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001442 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001443 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001444 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001445 }
1446 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1447 if (f != NULL)
1448 PyFile_SetBufSize(f, bufsize);
1449 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001450}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001451
1452static char makefile_doc[] =
1453"makefile([mode[, buffersize]]) -> file object\n\
1454\n\
1455Return a regular file object corresponding to the socket.\n\
1456The mode and buffersize arguments are as for the built-in open() function.";
1457
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001458#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001459
Guido van Rossum48a680c2001-03-02 06:34:14 +00001460
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001461/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001462
Guido van Rossum73624e91994-10-10 17:59:00 +00001463static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001464PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001465{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001466 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001467 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001468 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001469 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001470 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001471 if (buf == NULL)
1472 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001473 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +00001474 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001475 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001476 if (n < 0) {
1477 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001478 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001479 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001480 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001481 return NULL;
1482 return buf;
1483}
1484
Guido van Rossum82a5c661998-07-07 20:45:43 +00001485static char recv_doc[] =
1486"recv(buffersize[, flags]) -> data\n\
1487\n\
1488Receive up to buffersize bytes from the socket. For the optional flags\n\
1489argument, see the Unix manual. When no data is available, block until\n\
1490at least one byte is available or until the remote end is closed. When\n\
1491the remote end is closed and all data is read, return the empty string.";
1492
Guido van Rossum30a685f1991-06-27 15:51:29 +00001493
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001494/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001495
Guido van Rossum73624e91994-10-10 17:59:00 +00001496static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001497PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001498{
1499 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001500 PyObject *buf = NULL;
1501 PyObject *addr = NULL;
1502 PyObject *ret = NULL;
1503
Guido van Rossumff3ab422000-04-24 15:16:03 +00001504 int len, n, flags = 0;
1505 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001506 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001507 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001508 if (!getsockaddrlen(s, &addrlen))
1509 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001510 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001511 if (buf == NULL)
1512 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001513 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001514 memset(addrbuf, 0, addrlen);
1515 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001516#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001517#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001518 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001519#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001520 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001521#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001522#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001523 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001524#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001525 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001526 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001527 if (n < 0) {
1528 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001529 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001530 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001531 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001532 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001533
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001534 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001535 goto finally;
1536
Guido van Rossum73624e91994-10-10 17:59:00 +00001537 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001538 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001539 Py_XDECREF(addr);
1540 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001541 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001542}
1543
Guido van Rossum82a5c661998-07-07 20:45:43 +00001544static char recvfrom_doc[] =
1545"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1546\n\
1547Like recv(buffersize, flags) but also return the sender's address info.";
1548
Guido van Rossum30a685f1991-06-27 15:51:29 +00001549
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001550/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001551
Guido van Rossum73624e91994-10-10 17:59:00 +00001552static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001553PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001554{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001555 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001556 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001557 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001558 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001559 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001560 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001561 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001562 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001563 return PySocket_Err();
1564 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001565}
1566
Guido van Rossum82a5c661998-07-07 20:45:43 +00001567static char send_doc[] =
1568"send(data[, flags])\n\
1569\n\
1570Send a data string to the socket. For the optional flags\n\
1571argument, see the Unix manual.";
1572
Guido van Rossum30a685f1991-06-27 15:51:29 +00001573
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001574/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001575
Guido van Rossum73624e91994-10-10 17:59:00 +00001576static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001577PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001578{
Guido van Rossum73624e91994-10-10 17:59:00 +00001579 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001580 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001581 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001582 int addrlen, len, n, flags;
1583 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001584 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001585 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001586 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1587 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001588 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001589 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001590 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001591 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001592 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001593 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001594 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001595 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001596 return PySocket_Err();
1597 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001598}
1599
Guido van Rossum82a5c661998-07-07 20:45:43 +00001600static char sendto_doc[] =
1601"sendto(data[, flags], address)\n\
1602\n\
1603Like send(data, flags) but allows specifying the destination address.\n\
1604For IP sockets, the address is a pair (hostaddr, port).";
1605
Guido van Rossum30a685f1991-06-27 15:51:29 +00001606
1607/* s.shutdown(how) method */
1608
Guido van Rossum73624e91994-10-10 17:59:00 +00001609static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001610PySocketSock_shutdown(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001611{
1612 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001613 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001614 if (!PyArg_ParseTuple(args, "i:shutdown", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001615 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001616 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001617 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001618 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001619 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001620 return PySocket_Err();
1621 Py_INCREF(Py_None);
1622 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001623}
1624
Guido van Rossum82a5c661998-07-07 20:45:43 +00001625static char shutdown_doc[] =
1626"shutdown(flag)\n\
1627\n\
1628Shut down the reading side of the socket (flag == 0), the writing side\n\
1629of the socket (flag == 1), or both ends (flag == 2).";
1630
Guido van Rossum30a685f1991-06-27 15:51:29 +00001631
1632/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001633
Guido van Rossum73624e91994-10-10 17:59:00 +00001634static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001635 {"accept", (PyCFunction)PySocketSock_accept, METH_VARARGS,
1636 accept_doc},
1637 {"bind", (PyCFunction)PySocketSock_bind, METH_VARARGS,
1638 bind_doc},
1639 {"close", (PyCFunction)PySocketSock_close, METH_VARARGS,
1640 close_doc},
1641 {"connect", (PyCFunction)PySocketSock_connect, METH_VARARGS,
1642 connect_doc},
1643 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_VARARGS,
1644 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001645#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001646 {"dup", (PyCFunction)PySocketSock_dup, METH_VARARGS,
1647 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001648#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001649 {"fileno", (PyCFunction)PySocketSock_fileno, METH_VARARGS,
1650 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001651#ifdef HAVE_GETPEERNAME
Guido van Rossum48a680c2001-03-02 06:34:14 +00001652 {"getpeername", (PyCFunction)PySocketSock_getpeername, METH_VARARGS,
1653 getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001654#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001655 {"getsockname", (PyCFunction)PySocketSock_getsockname, METH_VARARGS,
1656 getsockname_doc},
1657 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1658 getsockopt_doc},
1659 {"listen", (PyCFunction)PySocketSock_listen, METH_VARARGS,
1660 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001661#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001662 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1663 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001664#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001665 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1666 recv_doc},
1667 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1668 recvfrom_doc},
1669 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1670 send_doc},
1671 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1672 sendto_doc},
1673 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_VARARGS,
1674 setblocking_doc},
1675 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1676 setsockopt_doc},
1677 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_VARARGS,
1678 shutdown_doc},
1679#ifdef RISCOS
1680 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1681 sleeptaskw_doc},
1682#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001683 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001684};
1685
Guido van Rossum30a685f1991-06-27 15:51:29 +00001686
Guido van Rossum73624e91994-10-10 17:59:00 +00001687/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001688 First close the file description. */
1689
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001690static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001691PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001692{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001693 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001694 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001695 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001696}
1697
Guido van Rossum30a685f1991-06-27 15:51:29 +00001698
1699/* Return a socket object's named attribute. */
1700
Guido van Rossum73624e91994-10-10 17:59:00 +00001701static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001702PySocketSock_getattr(PySocketSockObject *s, char *name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001703{
Guido van Rossum73624e91994-10-10 17:59:00 +00001704 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001705}
1706
Guido van Rossum30a685f1991-06-27 15:51:29 +00001707
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001708static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001709PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001710{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001711 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001712#if SIZEOF_SOCKET_T > SIZEOF_LONG
1713 if (s->sock_fd > LONG_MAX) {
1714 /* this can occur on Win64, and actually there is a special
1715 ugly printf formatter for decimal pointer length integer
1716 printing, only bother if necessary*/
1717 PyErr_SetString(PyExc_OverflowError,
1718 "no printf formatter to display the socket descriptor in decimal");
1719 return NULL;
1720 }
1721#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001722 sprintf(buf,
1723 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
Fred Drakea04eaad2000-06-30 02:46:07 +00001724 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001725 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001726}
1727
1728
Guido van Rossumb6775db1994-08-01 11:34:53 +00001729/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001730
Guido van Rossum73624e91994-10-10 17:59:00 +00001731static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001732 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001733 0,
1734 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001735 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001736 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001737 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001738 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001739 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001740 0, /*tp_setattr*/
1741 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001742 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001743 0, /*tp_as_number*/
1744 0, /*tp_as_sequence*/
1745 0, /*tp_as_mapping*/
1746};
1747
Guido van Rossum30a685f1991-06-27 15:51:29 +00001748
Guido van Rossum81194471991-07-27 21:42:02 +00001749/* Python interface to gethostname(). */
1750
1751/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001752static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001753PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001754{
1755 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001756 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001757 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001758 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001759 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001760 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001761 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001762 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001763 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001764 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001765 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001766}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001767
Guido van Rossum82a5c661998-07-07 20:45:43 +00001768static char gethostname_doc[] =
1769"gethostname() -> string\n\
1770\n\
1771Return the current host name.";
1772
Guido van Rossumff4949e1992-08-05 19:58:53 +00001773
Guido van Rossum30a685f1991-06-27 15:51:29 +00001774/* Python interface to gethostbyname(name). */
1775
1776/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001777static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001778PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001779{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001780 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001781 struct sockaddr_storage addrbuf;
1782
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001783 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001784 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001785 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001786 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001787 return makeipaddr((struct sockaddr *)&addrbuf,
1788 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001789}
1790
Guido van Rossum82a5c661998-07-07 20:45:43 +00001791static char gethostbyname_doc[] =
1792"gethostbyname(host) -> address\n\
1793\n\
1794Return the IP address (a string of the form '255.255.255.255') for a host.";
1795
1796
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001797/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1798
1799static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001800gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001801{
1802 char **pch;
1803 PyObject *rtn_tuple = (PyObject *)NULL;
1804 PyObject *name_list = (PyObject *)NULL;
1805 PyObject *addr_list = (PyObject *)NULL;
1806 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001807
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001808 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001809 /* Let's get real error message to return */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001810 PyH_Err(h_errno);
1811 return NULL;
1812 }
1813 if (h->h_addrtype != af) {
1814#ifdef HAVE_STRERROR
1815 /* Let's get real error message to return */
1816 PyErr_SetString(PySocket_Error, (char *)strerror(EAFNOSUPPORT));
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001817#else
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001818 PyErr_SetString(PySocket_Error,
1819 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001820#endif
1821 return NULL;
1822 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001823 switch (af) {
1824 case AF_INET:
1825 if (alen < sizeof(struct sockaddr_in))
1826 return NULL;
1827 break;
1828#ifdef INET6
1829 case AF_INET6:
1830 if (alen < sizeof(struct sockaddr_in6))
1831 return NULL;
1832 break;
1833#endif
1834 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001835 if ((name_list = PyList_New(0)) == NULL)
1836 goto err;
1837 if ((addr_list = PyList_New(0)) == NULL)
1838 goto err;
1839 for (pch = h->h_aliases; *pch != NULL; pch++) {
1840 int status;
1841 tmp = PyString_FromString(*pch);
1842 if (tmp == NULL)
1843 goto err;
1844 status = PyList_Append(name_list, tmp);
1845 Py_DECREF(tmp);
1846 if (status)
1847 goto err;
1848 }
1849 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1850 int status;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001851 switch (af) {
1852 case AF_INET:
1853 {
1854 struct sockaddr_in sin;
1855 memset(&sin, 0, sizeof(sin));
1856 sin.sin_family = af;
1857#ifdef HAVE_SOCKADDR_SA_LEN
1858 sin.sin_len = sizeof(sin);
1859#endif
1860 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
1861 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
1862 if (pch == h->h_addr_list && alen >= sizeof(sin))
1863 memcpy((char *) addr, &sin, sizeof(sin));
1864 break;
1865 }
1866#ifdef INET6
1867 case AF_INET6:
1868 {
1869 struct sockaddr_in6 sin6;
1870 memset(&sin6, 0, sizeof(sin6));
1871 sin6.sin6_family = af;
1872#ifdef HAVE_SOCKADDR_SA_LEN
1873 sin6.sin6_len = sizeof(sin6);
1874#endif
1875 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
1876 tmp = makeipaddr((struct sockaddr *)&sin6,
1877 sizeof(sin6));
1878 if (pch == h->h_addr_list && alen >= sizeof(sin6))
1879 memcpy((char *) addr, &sin6, sizeof(sin6));
1880 break;
1881 }
1882#endif
1883 default: /* can't happen */
1884 PyErr_SetString(PySocket_Error,
1885 "unsupported address family");
1886 return NULL;
1887 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001888 if (tmp == NULL)
1889 goto err;
1890 status = PyList_Append(addr_list, tmp);
1891 Py_DECREF(tmp);
1892 if (status)
1893 goto err;
1894 }
1895 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1896 err:
1897 Py_XDECREF(name_list);
1898 Py_XDECREF(addr_list);
1899 return rtn_tuple;
1900}
1901
1902
1903/* Python interface to gethostbyname_ex(name). */
1904
1905/*ARGSUSED*/
1906static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001907PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001908{
1909 char *name;
1910 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001911 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00001912 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00001913 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001914#ifdef HAVE_GETHOSTBYNAME_R
1915 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001916#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1917 struct hostent_data data;
1918#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001919 char buf[16384];
1920 int buf_len = (sizeof buf) - 1;
1921 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001922#endif
1923#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001924 int result;
1925#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001926#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001927
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001928 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001929 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001930 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001931 return NULL;
1932 Py_BEGIN_ALLOW_THREADS
1933#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001934#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001935 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001936#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001937 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001938#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001939 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001940 result = gethostbyname_r(name, &hp_allocated, &data);
1941 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001942#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001943#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001944#ifdef USE_GETHOSTBYNAME_LOCK
1945 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001946#endif
1947 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001948#endif /* HAVE_GETHOSTBYNAME_R */
1949 Py_END_ALLOW_THREADS
Martin v. Löwis9db2f572001-07-23 01:30:10 +00001950 /* Some C libraries would require addr.__ss_family instead of addr.ss_family.
1951 Therefore, we cast the sockaddr_storage into sockaddr to access sa_family. */
1952 sa = (struct sockaddr*)&addr;
1953 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00001954#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001955 PyThread_release_lock(gethostbyname_lock);
1956#endif
1957 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001958}
1959
1960static char ghbn_ex_doc[] =
1961"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1962\n\
1963Return the true host name, a list of aliases, and a list of IP addresses,\n\
1964for a host. The host argument is a string giving a host name or IP number.";
1965
1966
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001967/* Python interface to gethostbyaddr(IP). */
1968
1969/*ARGSUSED*/
1970static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001971PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001972{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001973#ifdef INET6
1974 struct sockaddr_storage addr;
1975#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00001976 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001977#endif
1978 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001979 char *ip_num;
1980 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001981 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001982#ifdef HAVE_GETHOSTBYNAME_R
1983 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001984#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1985 struct hostent_data data;
1986#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001987 char buf[16384];
1988 int buf_len = (sizeof buf) - 1;
1989 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001990#endif
1991#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001992 int result;
1993#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001994#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001995 char *ap;
1996 int al;
1997 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001998
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001999 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002000 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002001 af = PF_UNSPEC;
2002 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002003 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002004 af = sa->sa_family;
2005 ap = NULL;
2006 al = 0;
2007 switch (af) {
2008 case AF_INET:
2009 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2010 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2011 break;
2012#ifdef INET6
2013 case AF_INET6:
2014 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2015 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2016 break;
2017#endif
2018 default:
2019 PyErr_SetString(PySocket_Error, "unsupported address family");
2020 return NULL;
2021 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002022 Py_BEGIN_ALLOW_THREADS
2023#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002024#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002025 result = gethostbyaddr_r(ap, al, af,
2026 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002027 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002028#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002029 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002030 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002031#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002032 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002033 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002034 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002035#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002036#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002037#ifdef USE_GETHOSTBYNAME_LOCK
2038 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002039#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002040 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002041#endif /* HAVE_GETHOSTBYNAME_R */
2042 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002043 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002044#ifdef USE_GETHOSTBYNAME_LOCK
2045 PyThread_release_lock(gethostbyname_lock);
2046#endif
2047 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002048}
2049
Guido van Rossum82a5c661998-07-07 20:45:43 +00002050static char gethostbyaddr_doc[] =
2051"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2052\n\
2053Return the true host name, a list of aliases, and a list of IP addresses,\n\
2054for a host. The host argument is a string giving a host name or IP number.";
2055
Guido van Rossum30a685f1991-06-27 15:51:29 +00002056
2057/* Python interface to getservbyname(name).
2058 This only returns the port number, since the other info is already
2059 known or not useful (like the list of aliases). */
2060
2061/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002062static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002063PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002064{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002065 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002066 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002067 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002068 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002069 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002070 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002071 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002072 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002073 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002074 return NULL;
2075 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002076 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002077}
2078
Guido van Rossum82a5c661998-07-07 20:45:43 +00002079static char getservbyname_doc[] =
2080"getservbyname(servicename, protocolname) -> integer\n\
2081\n\
2082Return a port number from a service name and protocol name.\n\
2083The protocol name should be 'tcp' or 'udp'.";
2084
Guido van Rossum30a685f1991-06-27 15:51:29 +00002085
Guido van Rossum3901d851996-12-19 16:35:04 +00002086/* Python interface to getprotobyname(name).
2087 This only returns the protocol number, since the other info is
2088 already known or not useful (like the list of aliases). */
2089
2090/*ARGSUSED*/
2091static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002092PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002093{
2094 char *name;
2095 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002096#ifdef __BEOS__
2097/* Not available in BeOS yet. - [cjh] */
2098 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
2099 return NULL;
2100#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002101 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002102 return NULL;
2103 Py_BEGIN_ALLOW_THREADS
2104 sp = getprotobyname(name);
2105 Py_END_ALLOW_THREADS
2106 if (sp == NULL) {
2107 PyErr_SetString(PySocket_Error, "protocol not found");
2108 return NULL;
2109 }
2110 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002111#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002112}
2113
Guido van Rossum82a5c661998-07-07 20:45:43 +00002114static char getprotobyname_doc[] =
2115"getprotobyname(name) -> integer\n\
2116\n\
2117Return the protocol number for the named protocol. (Rarely used.)";
2118
Guido van Rossum3901d851996-12-19 16:35:04 +00002119
Guido van Rossum30a685f1991-06-27 15:51:29 +00002120/* Python interface to socket(family, type, proto).
2121 The third (protocol) argument is optional.
2122 Return a new socket object. */
2123
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002124/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002125static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002126PySocket_socket(PyObject *self, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002127{
Guido van Rossum73624e91994-10-10 17:59:00 +00002128 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002129 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002130 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00002131 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002132 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002133 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002134 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002135 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00002136#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00002137 if (fd == INVALID_SOCKET)
2138#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002139 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00002140#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002141 return PySocket_Err();
2142 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002143 /* If the object can't be created, don't forget to close the
2144 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002145 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002146 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00002147 /* From now on, ignore SIGPIPE and let the error checking
2148 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002149#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00002150 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002151#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002152 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002153}
2154
Guido van Rossum82a5c661998-07-07 20:45:43 +00002155static char socket_doc[] =
2156"socket(family, type[, proto]) -> socket object\n\
2157\n\
2158Open a socket of the given type. The family argument specifies the\n\
2159address family; it is normally AF_INET, sometimes AF_UNIX.\n\
2160The type argument specifies whether this is a stream (SOCK_STREAM)\n\
2161or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
2162specifying the default protocol.";
2163
2164
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002165#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002166/* Create a socket object from a numeric file description.
2167 Useful e.g. if stdin is a socket.
2168 Additional arguments as for socket(). */
2169
2170/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002171static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002172PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002173{
Guido van Rossum73624e91994-10-10 17:59:00 +00002174 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002175 SOCKET_T fd;
2176 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002177 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2178 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002179 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002180 /* Dup the fd so it and the socket can be closed independently */
2181 fd = dup(fd);
2182 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00002183 return PySocket_Err();
2184 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002185 /* From now on, ignore SIGPIPE and let the error checking
2186 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002187#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002188 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002189#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002190 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002191}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002192
2193static char fromfd_doc[] =
2194"fromfd(fd, family, type[, proto]) -> socket object\n\
2195\n\
2196Create a socket object from the given file descriptor.\n\
2197The remaining arguments are the same as for socket().";
2198
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002199#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002200
Guido van Rossum82a5c661998-07-07 20:45:43 +00002201
Guido van Rossum006bf911996-06-12 04:04:55 +00002202static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002203PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002204{
2205 int x1, x2;
2206
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002207 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002208 return NULL;
2209 }
2210 x2 = (int)ntohs((short)x1);
2211 return PyInt_FromLong(x2);
2212}
2213
Guido van Rossum82a5c661998-07-07 20:45:43 +00002214static char ntohs_doc[] =
2215"ntohs(integer) -> integer\n\
2216\n\
2217Convert a 16-bit integer from network to host byte order.";
2218
2219
Guido van Rossum006bf911996-06-12 04:04:55 +00002220static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002221PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002222{
2223 int x1, x2;
2224
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002225 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002226 return NULL;
2227 }
2228 x2 = ntohl(x1);
2229 return PyInt_FromLong(x2);
2230}
2231
Guido van Rossum82a5c661998-07-07 20:45:43 +00002232static char ntohl_doc[] =
2233"ntohl(integer) -> integer\n\
2234\n\
2235Convert a 32-bit integer from network to host byte order.";
2236
2237
Guido van Rossum006bf911996-06-12 04:04:55 +00002238static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002239PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002240{
2241 int x1, x2;
2242
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002243 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002244 return NULL;
2245 }
2246 x2 = (int)htons((short)x1);
2247 return PyInt_FromLong(x2);
2248}
2249
Guido van Rossum82a5c661998-07-07 20:45:43 +00002250static char htons_doc[] =
2251"htons(integer) -> integer\n\
2252\n\
2253Convert a 16-bit integer from host to network byte order.";
2254
2255
Guido van Rossum006bf911996-06-12 04:04:55 +00002256static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002257PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002258{
2259 int x1, x2;
2260
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002261 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002262 return NULL;
2263 }
2264 x2 = htonl(x1);
2265 return PyInt_FromLong(x2);
2266}
2267
Guido van Rossum82a5c661998-07-07 20:45:43 +00002268static char htonl_doc[] =
2269"htonl(integer) -> integer\n\
2270\n\
2271Convert a 32-bit integer from host to network byte order.";
2272
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002273/*
2274 * socket.inet_aton() and socket.inet_ntoa() functions
2275 *
2276 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2277 *
2278 */
2279
Guido van Rossum48a680c2001-03-02 06:34:14 +00002280static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002281"inet_aton(string) -> packed 32-bit IP representation\n\
2282\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002283Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002284binary format used in low-level network functions.";
2285
2286static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002287PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002288{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002289#ifndef INADDR_NONE
2290#define INADDR_NONE (-1)
2291#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002292
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002293 /* Have to use inet_addr() instead */
2294 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002295 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002296
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002297 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002298 return NULL;
2299 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00002300#ifdef USE_GUSI1
Fred Drakee5065292001-07-19 21:16:41 +00002301 packed_addr = inet_addr(ip_addr).s_addr;
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002302#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002303 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002304#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002305
2306 if (packed_addr == INADDR_NONE) { /* invalid address */
2307 PyErr_SetString(PySocket_Error,
2308 "illegal IP address string passed to inet_aton");
2309 return NULL;
2310 }
2311
2312 return PyString_FromStringAndSize((char *) &packed_addr,
2313 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002314}
2315
Guido van Rossum48a680c2001-03-02 06:34:14 +00002316static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002317"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002318\n\
2319Convert an IP address from 32-bit packed binary format to string format";
2320
2321static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002322PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002323{
2324 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002325 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002326 struct in_addr packed_addr;
2327
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002328 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002329 return NULL;
2330 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002331
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002332 if (addr_len != sizeof(packed_addr)) {
2333 PyErr_SetString(PySocket_Error,
2334 "packed IP wrong length for inet_ntoa");
2335 return NULL;
2336 }
2337
2338 memcpy(&packed_addr, packed_str, addr_len);
2339
2340 return PyString_FromString(inet_ntoa(packed_addr));
2341}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002342
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002343/* Python interface to getaddrinfo(host, port). */
2344
2345/*ARGSUSED*/
2346static PyObject *
2347PySocket_getaddrinfo(PyObject *self, PyObject *args)
2348{
2349 struct addrinfo hints, *res0, *res;
2350 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002351 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002352 char *hptr, *pptr;
2353 int family, socktype, protocol, flags;
2354 int error;
2355 PyObject *all = (PyObject *)NULL;
2356 PyObject *single = (PyObject *)NULL;
2357
2358 family = socktype = protocol = flags = 0;
2359 family = PF_UNSPEC;
2360 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2361 &hptr, &pobj, &family, &socktype,
2362 &protocol, &flags)) {
2363 return NULL;
2364 }
2365 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002366 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002367 pptr = pbuf;
2368 } else if (PyString_Check(pobj)) {
2369 pptr = PyString_AsString(pobj);
2370 } else if (pobj == Py_None) {
2371 pptr = (char *)NULL;
2372 } else {
2373 PyErr_SetString(PySocket_Error, "Int or String expected");
2374 return NULL;
2375 }
2376 memset(&hints, 0, sizeof(hints));
2377 hints.ai_family = family;
2378 hints.ai_socktype = socktype;
2379 hints.ai_protocol = protocol;
2380 hints.ai_flags = flags;
2381 error = getaddrinfo(hptr, pptr, &hints, &res0);
2382 if (error) {
2383 PyGAI_Err(error);
2384 return NULL;
2385 }
2386
2387 if ((all = PyList_New(0)) == NULL)
2388 goto err;
2389 for (res = res0; res; res = res->ai_next) {
2390 single = Py_BuildValue("iiisO", res->ai_family,
2391 res->ai_socktype, res->ai_protocol,
2392 res->ai_canonname ? res->ai_canonname : "",
2393 makesockaddr(-1, res->ai_addr, res->ai_addrlen));
2394 if (single == NULL)
2395 goto err;
2396
2397 if (PyList_Append(all, single))
2398 goto err;
2399 Py_XDECREF(single);
2400 }
2401 Py_XDECREF(pobj);
2402 return all;
2403 err:
2404 Py_XDECREF(single);
2405 Py_XDECREF(all);
2406 Py_XDECREF(pobj);
2407 return (PyObject *)NULL;
2408}
2409
2410static char getaddrinfo_doc[] =
2411"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2412 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2413\n\
2414Resolve host and port into addrinfo struct.";
2415
2416/* Python interface to getnameinfo(sa, flags). */
2417
2418/*ARGSUSED*/
2419static PyObject *
2420PySocket_getnameinfo(PyObject *self, PyObject *args)
2421{
2422 PyObject *sa = (PyObject *)NULL;
2423 int flags;
2424 char *hostp;
2425 int n, port, flowinfo, scope_id;
2426 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2427 struct addrinfo hints, *res = NULL;
2428 int error;
2429 PyObject *ret = (PyObject *)NULL;
2430
2431 flags = flowinfo = scope_id = 0;
2432 if (PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags) == 0)
2433 return NULL;
2434 n = PyArg_ParseTuple(sa, "si|ii", &hostp, &port, &flowinfo, scope_id);
2435 if (n == 0)
2436 goto fail;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002437 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002438 memset(&hints, 0, sizeof(hints));
2439 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002440 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002441 error = getaddrinfo(hostp, pbuf, &hints, &res);
2442 if (error) {
2443 PyGAI_Err(error);
2444 goto fail;
2445 }
2446 if (res->ai_next) {
2447 PyErr_SetString(PySocket_Error,
2448 "sockaddr resolved to multiple addresses");
2449 goto fail;
2450 }
2451 switch (res->ai_family) {
2452 case AF_INET:
2453 {
2454 char *t1;
2455 int t2;
2456 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
2457 PyErr_SetString(PySocket_Error,
2458 "IPv4 sockaddr must be 2 tuple");
2459 goto fail;
2460 }
2461 break;
2462 }
2463#ifdef INET6
2464 case AF_INET6:
2465 {
2466 struct sockaddr_in6 *sin6;
2467 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2468 sin6->sin6_flowinfo = flowinfo;
2469 sin6->sin6_scope_id = scope_id;
2470 break;
2471 }
2472#endif
2473 }
2474 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2475 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2476 if (error) {
2477 PyGAI_Err(error);
2478 goto fail;
2479 }
2480 ret = Py_BuildValue("ss", hbuf, pbuf);
2481
2482fail:
2483 if (res)
2484 freeaddrinfo(res);
2485 Py_XDECREF(sa);
2486 return ret;
2487}
2488
2489static char getnameinfo_doc[] =
2490"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2491\n\
2492Get host and port for a sockaddr.";
2493
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002494
2495#ifdef USE_SSL
2496
2497/* This is a C function to be called for new object initialization */
2498static SSLObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002499newSSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002500{
2501 SSLObject *self;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002502
Guido van Rossumb18618d2000-05-03 23:44:39 +00002503 self = PyObject_New(SSLObject, &SSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002504 if (self == NULL){
2505 PyErr_SetObject(SSLErrorObject,
2506 PyString_FromString("newSSLObject error"));
2507 return NULL;
2508 }
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002509 memset(self->server, '\0', sizeof(char) * 256);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002510 memset(self->issuer, '\0', sizeof(char) * 256);
2511
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002512 self->x_attr = PyDict_New();
2513 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
2514 if (self->ctx == NULL) {
2515 PyErr_SetObject(SSLErrorObject,
2516 PyString_FromString("SSL_CTX_new error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002517 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002518 return NULL;
2519 }
2520
2521 if ( (key_file && !cert_file) || (!key_file && cert_file) )
2522 {
2523 PyErr_SetObject(SSLErrorObject,
2524 PyString_FromString(
2525 "Both the key & certificate files must be specified"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002526 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002527 return NULL;
2528 }
2529
2530 if (key_file && cert_file)
2531 {
2532 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
2533 SSL_FILETYPE_PEM) < 1)
2534 {
2535 PyErr_SetObject(SSLErrorObject,
2536 PyString_FromString(
2537 "SSL_CTX_use_PrivateKey_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002538 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002539 return NULL;
2540 }
2541
2542 if (SSL_CTX_use_certificate_chain_file(self->ctx,
2543 cert_file) < 1)
2544 {
2545 PyErr_SetObject(SSLErrorObject,
2546 PyString_FromString(
2547 "SSL_CTX_use_certificate_chain_file error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002548 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002549 return NULL;
2550 }
2551 }
2552
2553 SSL_CTX_set_verify(self->ctx,
2554 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2555 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2556 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2557 SSL_set_connect_state(self->ssl);
2558
2559 if ((SSL_connect(self->ssl)) == -1) {
2560 /* Actually negotiate SSL connection */
2561 PyErr_SetObject(SSLErrorObject,
2562 PyString_FromString("SSL_connect error"));
Guido van Rossumb18618d2000-05-03 23:44:39 +00002563 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002564 return NULL;
2565 }
2566 self->ssl->debug = 1;
2567
2568 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2569 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
2570 self->server, 256);
2571 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2572 self->issuer, 256);
2573 }
2574 self->x_attr = NULL;
2575 self->Socket = Sock;
2576 Py_INCREF(self->Socket);
2577 return self;
2578}
2579
2580/* This is the Python function called for new object initialization */
2581static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002582PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002583{
2584 SSLObject *rv;
2585 PySocketSockObject *Sock;
2586 char *key_file;
2587 char *cert_file;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002588
Guido van Rossum43713e52000-02-29 13:59:29 +00002589 if (!PyArg_ParseTuple(args, "O!zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002590 &PySocketSock_Type, (PyObject*)&Sock,
2591 &key_file, &cert_file) )
2592 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002593
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002594 rv = newSSLObject(Sock, key_file, cert_file);
2595 if ( rv == NULL )
2596 return NULL;
2597 return (PyObject *)rv;
2598}
2599
2600static char ssl_doc[] =
2601"ssl(socket, keyfile, certfile) -> sslobject";
2602
2603static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002604SSL_server(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002605{
2606 return PyString_FromString(self->server);
2607}
2608
2609static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002610SSL_issuer(SSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002611{
2612 return PyString_FromString(self->issuer);
2613}
2614
2615
2616/* SSL object methods */
2617
2618static PyMethodDef SSLMethods[] = {
2619 { "write", (PyCFunction)SSL_SSLwrite, 1 },
2620 { "read", (PyCFunction)SSL_SSLread, 1 },
2621 { "server", (PyCFunction)SSL_server, 1 },
2622 { "issuer", (PyCFunction)SSL_issuer, 1 },
2623 { NULL, NULL}
2624};
2625
2626static void SSL_dealloc(SSLObject *self)
2627{
2628 if (self->server_cert) /* Possible not to have one? */
2629 X509_free (self->server_cert);
2630 SSL_CTX_free(self->ctx);
2631 SSL_free(self->ssl);
2632 Py_XDECREF(self->x_attr);
2633 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002634 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002635}
2636
2637static PyObject *SSL_getattr(SSLObject *self, char *name)
2638{
2639 return Py_FindMethod(SSLMethods, (PyObject *)self, name);
2640}
2641
2642staticforward PyTypeObject SSL_Type = {
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002643 PyObject_HEAD_INIT(NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002644 0, /*ob_size*/
2645 "SSL", /*tp_name*/
2646 sizeof(SSLObject), /*tp_basicsize*/
2647 0, /*tp_itemsize*/
2648 /* methods */
2649 (destructor)SSL_dealloc, /*tp_dealloc*/
2650 0, /*tp_print*/
2651 (getattrfunc)SSL_getattr, /*tp_getattr*/
2652 0, /*tp_setattr*/
2653 0, /*tp_compare*/
2654 0, /*tp_repr*/
2655 0, /*tp_as_number*/
2656 0, /*tp_as_sequence*/
2657 0, /*tp_as_mapping*/
2658 0, /*tp_hash*/
2659};
2660
2661
2662
2663static PyObject *SSL_SSLwrite(SSLObject *self, PyObject *args)
2664{
2665 char *data;
Andrew M. Kuchlingb38175e2001-02-07 20:41:17 +00002666 size_t len;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002667
Andrew M. Kuchlingb38175e2001-02-07 20:41:17 +00002668 if (!PyArg_ParseTuple(args, "s#:write", &data, &len))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002669 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002670
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002671 len = SSL_write(self->ssl, data, len);
2672 return PyInt_FromLong((long)len);
2673}
2674
2675static PyObject *SSL_SSLread(SSLObject *self, PyObject *args)
2676{
2677 PyObject *buf;
2678 int count = 0;
2679 int len = 1024;
2680 int res;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002681
Guido van Rossum43713e52000-02-29 13:59:29 +00002682 PyArg_ParseTuple(args, "|i:read", &len);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002683
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002684 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2685 return NULL; /* Error object should already be set */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002686
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002687 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2688 res = SSL_get_error(self->ssl, count);
2689
2690 switch (res) {
Jeremy Hylton42dd01a2001-02-01 23:35:20 +00002691 case SSL_ERROR_NONE:
2692 assert(count > 0);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002693 break;
Jeremy Hylton42dd01a2001-02-01 23:35:20 +00002694 case SSL_ERROR_ZERO_RETURN: /* normal EOF */
2695 assert(count == 0);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002696 break;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002697 default:
2698 return PyErr_SetFromErrno(SSLErrorObject);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002699 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002700
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002701 fflush(stderr);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002702
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002703 if (count < 0) {
2704 Py_DECREF(buf);
2705 return PyErr_SetFromErrno(SSLErrorObject);
2706 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002707
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002708 if (count != len && _PyString_Resize(&buf, count) < 0)
2709 return NULL;
2710 return buf;
2711}
2712
2713#endif /* USE_SSL */
2714
2715
Guido van Rossum30a685f1991-06-27 15:51:29 +00002716/* List of functions exported by this module. */
2717
Guido van Rossum73624e91994-10-10 17:59:00 +00002718static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002719 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002720 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002721 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002722 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002723 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002724 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002725 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002726 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002727 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002728 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002729 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002730 METH_VARARGS,getprotobyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002731 {"socket", PySocket_socket,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002732 METH_VARARGS, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002733#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002734 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002735 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002736#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002737 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002738 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002739 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002740 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002741 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002742 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002743 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002744 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002745 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002746 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002747 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002748 METH_VARARGS, inet_ntoa_doc},
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002749 {"getaddrinfo", PySocket_getaddrinfo,
2750 METH_VARARGS, getaddrinfo_doc},
2751 {"getnameinfo", PySocket_getnameinfo,
2752 METH_VARARGS, getnameinfo_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002753#ifdef USE_SSL
Guido van Rossum48a680c2001-03-02 06:34:14 +00002754 {"ssl", PySocket_ssl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002755 METH_VARARGS, ssl_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002756#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002757 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002758};
2759
Guido van Rossum30a685f1991-06-27 15:51:29 +00002760
2761/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002762 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002763 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002764 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002765static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002766insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002767{
Guido van Rossum73624e91994-10-10 17:59:00 +00002768 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002769 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002770 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002771
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002772 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002773}
2774
Guido van Rossum30a685f1991-06-27 15:51:29 +00002775
Guido van Rossum8d665e61996-06-26 18:22:49 +00002776#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002777
2778/* Additional initialization and cleanup for NT/Windows */
2779
2780static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002781NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002782{
2783 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002784}
2785
2786static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002787NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002788{
2789 WSADATA WSAData;
2790 int ret;
2791 char buf[100];
2792 ret = WSAStartup(0x0101, &WSAData);
2793 switch (ret) {
2794 case 0: /* no error */
2795 atexit(NTcleanup);
2796 return 1;
2797 case WSASYSNOTREADY:
2798 PyErr_SetString(PyExc_ImportError,
2799 "WSAStartup failed: network not ready");
2800 break;
2801 case WSAVERNOTSUPPORTED:
2802 case WSAEINVAL:
2803 PyErr_SetString(PyExc_ImportError,
2804 "WSAStartup failed: requested version not supported");
2805 break;
2806 default:
2807 sprintf(buf, "WSAStartup failed: error code %d", ret);
2808 PyErr_SetString(PyExc_ImportError, buf);
2809 break;
2810 }
2811 return 0;
2812}
2813
Guido van Rossum8d665e61996-06-26 18:22:49 +00002814#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002815
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002816#if defined(PYOS_OS2)
2817
2818/* Additional initialization and cleanup for OS/2 */
2819
2820static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002821OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002822{
2823 /* No cleanup is necessary for OS/2 Sockets */
2824}
2825
2826static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002827OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002828{
2829 char reason[64];
2830 int rc = sock_init();
2831
2832 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002833 atexit(OS2cleanup);
2834 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002835 }
2836
2837 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2838 PyErr_SetString(PyExc_ImportError, reason);
2839
Guido van Rossum32c575d1997-12-02 20:37:32 +00002840 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002841}
2842
2843#endif /* PYOS_OS2 */
2844
Guido van Rossum30a685f1991-06-27 15:51:29 +00002845/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002846 * This is called when the first 'import socket' is done,
2847 * via a table in config.c, if config.c is compiled with USE_SOCKET
2848 * defined.
2849 *
2850 * For MS_WINDOWS (which means any Windows variant), this module
2851 * is actually called "_socket", and there's a wrapper "socket.py"
2852 * which implements some missing functionality (such as makefile(),
2853 * dup() and fromfd()). The import of "_socket" may fail with an
2854 * ImportError exception if initialization of WINSOCK fails. When
2855 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2856 * scheduled to be made at exit time.
2857 *
2858 * For OS/2, this module is also called "_socket" and uses a wrapper
2859 * "socket.py" which implements that functionality that is missing
2860 * when PC operating systems don't put socket descriptors in the
2861 * operating system's filesystem layer.
2862 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002863
Guido van Rossum82a5c661998-07-07 20:45:43 +00002864static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00002865"Implementation module for socket operations. See the socket module\n\
2866for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00002867
2868static char sockettype_doc[] =
2869"A socket represents one endpoint of a network connection.\n\
2870\n\
2871Methods:\n\
2872\n\
2873accept() -- accept a connection, returning new socket and client address\n\
2874bind() -- bind the socket to a local address\n\
2875close() -- close the socket\n\
2876connect() -- connect the socket to a remote address\n\
2877connect_ex() -- connect, return an error code instead of an exception \n\
2878dup() -- return a new socket object identical to the current one (*)\n\
2879fileno() -- return underlying file descriptor\n\
2880getpeername() -- return remote address (*)\n\
2881getsockname() -- return local address\n\
2882getsockopt() -- get socket options\n\
2883listen() -- start listening for incoming connections\n\
2884makefile() -- return a file object corresponding tot the socket (*)\n\
2885recv() -- receive data\n\
2886recvfrom() -- receive data and sender's address\n\
2887send() -- send data\n\
2888sendto() -- send data to a given address\n\
2889setblocking() -- set or clear the blocking I/O flag\n\
2890setsockopt() -- set socket options\n\
2891shutdown() -- shut down traffic in one or both directions\n\
2892\n\
2893(*) not available on all platforms!)";
2894
Guido van Rossum3886bb61998-12-04 18:50:17 +00002895DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002896init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002897{
Guido van Rossum73624e91994-10-10 17:59:00 +00002898 PyObject *m, *d;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002899#ifdef RISCOS
2900 _kernel_swi_regs r;
2901 r.r[0]=0;
2902 _kernel_swi(0x43380, &r, &r);
2903 taskwindow = r.r[0];
2904#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00002905#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002906 if (!NTinit())
2907 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002908#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002909#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002910 if (!OS2init())
2911 return;
Fred Drakea136d492000-08-16 14:18:30 +00002912#endif /* __TOS_OS2__ */
2913#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002914#endif /* RISCOS */
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002915#ifdef USE_SSL
2916 SSL_Type.ob_type = &PyType_Type;
2917#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00002918 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00002919 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002920 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2921 if (PySocket_Error == NULL)
2922 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00002923 PyDict_SetItemString(d, "error", PySocket_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002924 PyH_Error = PyErr_NewException("socket.herror", PySocket_Error, NULL);
2925 if (PyH_Error == NULL)
2926 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00002927 PyDict_SetItemString(d, "herror", PyH_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002928 PyGAI_Error = PyErr_NewException("socket.gaierror", PySocket_Error,
2929 NULL);
2930 if (PyGAI_Error == NULL)
2931 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00002932 PyDict_SetItemString(d, "gaierror", PyGAI_Error);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002933#ifdef USE_SSL
2934 SSL_load_error_strings();
2935 SSLeay_add_ssl_algorithms();
2936 SSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2937 if (SSLErrorObject == NULL)
2938 return;
2939 PyDict_SetItemString(d, "sslerror", SSLErrorObject);
2940 Py_INCREF(&SSL_Type);
2941 if (PyDict_SetItemString(d, "SSLType",
2942 (PyObject *)&SSL_Type) != 0)
2943 return;
2944#endif /* USE_SSL */
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002945 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00002946 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002947 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00002948 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00002949 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002950 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002951
2952 /* Address families (we only support AF_INET and AF_UNIX) */
2953#ifdef AF_UNSPEC
2954 insint(d, "AF_UNSPEC", AF_UNSPEC);
2955#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002956 insint(d, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002957#ifdef AF_INET6
2958 insint(d, "AF_INET6", AF_INET6);
2959#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002960#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002961 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002962#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002963#ifdef AF_AX25
2964 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
2965#endif
2966#ifdef AF_IPX
2967 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
2968#endif
2969#ifdef AF_APPLETALK
2970 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
2971#endif
2972#ifdef AF_NETROM
2973 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
2974#endif
2975#ifdef AF_BRIDGE
2976 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
2977#endif
2978#ifdef AF_AAL5
2979 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
2980#endif
2981#ifdef AF_X25
2982 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
2983#endif
2984#ifdef AF_INET6
2985 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
2986#endif
2987#ifdef AF_ROSE
2988 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
2989#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002990#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00002991 insint(d, "AF_PACKET", AF_PACKET);
2992 insint(d, "PF_PACKET", PF_PACKET);
2993 insint(d, "PACKET_HOST", PACKET_HOST);
2994 insint(d, "PACKET_BROADCAST", PACKET_BROADCAST);
2995 insint(d, "PACKET_MULTICAST", PACKET_MULTICAST);
2996 insint(d, "PACKET_OTHERHOST", PACKET_OTHERHOST);
2997 insint(d, "PACKET_OUTGOING", PACKET_OUTGOING);
2998 insint(d, "PACKET_LOOPBACK", PACKET_LOOPBACK);
2999 insint(d, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003000#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003001
3002 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003003 insint(d, "SOCK_STREAM", SOCK_STREAM);
3004 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003005#ifndef __BEOS__
3006/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003007 insint(d, "SOCK_RAW", SOCK_RAW);
3008 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
3009 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003010#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003011
3012#ifdef SO_DEBUG
3013 insint(d, "SO_DEBUG", SO_DEBUG);
3014#endif
3015#ifdef SO_ACCEPTCONN
3016 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
3017#endif
3018#ifdef SO_REUSEADDR
3019 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
3020#endif
3021#ifdef SO_KEEPALIVE
3022 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
3023#endif
3024#ifdef SO_DONTROUTE
3025 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
3026#endif
3027#ifdef SO_BROADCAST
3028 insint(d, "SO_BROADCAST", SO_BROADCAST);
3029#endif
3030#ifdef SO_USELOOPBACK
3031 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
3032#endif
3033#ifdef SO_LINGER
3034 insint(d, "SO_LINGER", SO_LINGER);
3035#endif
3036#ifdef SO_OOBINLINE
3037 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
3038#endif
3039#ifdef SO_REUSEPORT
3040 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
3041#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003042#ifdef SO_SNDBUF
3043 insint(d, "SO_SNDBUF", SO_SNDBUF);
3044#endif
3045#ifdef SO_RCVBUF
3046 insint(d, "SO_RCVBUF", SO_RCVBUF);
3047#endif
3048#ifdef SO_SNDLOWAT
3049 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
3050#endif
3051#ifdef SO_RCVLOWAT
3052 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
3053#endif
3054#ifdef SO_SNDTIMEO
3055 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
3056#endif
3057#ifdef SO_RCVTIMEO
3058 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
3059#endif
3060#ifdef SO_ERROR
3061 insint(d, "SO_ERROR", SO_ERROR);
3062#endif
3063#ifdef SO_TYPE
3064 insint(d, "SO_TYPE", SO_TYPE);
3065#endif
3066
3067 /* Maximum number of connections for "listen" */
3068#ifdef SOMAXCONN
3069 insint(d, "SOMAXCONN", SOMAXCONN);
3070#else
3071 insint(d, "SOMAXCONN", 5); /* Common value */
3072#endif
3073
3074 /* Flags for send, recv */
3075#ifdef MSG_OOB
3076 insint(d, "MSG_OOB", MSG_OOB);
3077#endif
3078#ifdef MSG_PEEK
3079 insint(d, "MSG_PEEK", MSG_PEEK);
3080#endif
3081#ifdef MSG_DONTROUTE
3082 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
3083#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003084#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00003085 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003086#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003087#ifdef MSG_EOR
3088 insint(d, "MSG_EOR", MSG_EOR);
3089#endif
3090#ifdef MSG_TRUNC
3091 insint(d, "MSG_TRUNC", MSG_TRUNC);
3092#endif
3093#ifdef MSG_CTRUNC
3094 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
3095#endif
3096#ifdef MSG_WAITALL
3097 insint(d, "MSG_WAITALL", MSG_WAITALL);
3098#endif
3099#ifdef MSG_BTAG
3100 insint(d, "MSG_BTAG", MSG_BTAG);
3101#endif
3102#ifdef MSG_ETAG
3103 insint(d, "MSG_ETAG", MSG_ETAG);
3104#endif
3105
3106 /* Protocol level and numbers, usable for [gs]etsockopt */
3107#ifdef SOL_SOCKET
3108 insint(d, "SOL_SOCKET", SOL_SOCKET);
3109#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003110#ifdef SOL_IP
3111 insint(d, "SOL_IP", SOL_IP);
3112#else
3113 insint(d, "SOL_IP", 0);
3114#endif
3115#ifdef SOL_IPX
3116 insint(d, "SOL_IPX", SOL_IPX);
3117#endif
3118#ifdef SOL_AX25
3119 insint(d, "SOL_AX25", SOL_AX25);
3120#endif
3121#ifdef SOL_ATALK
3122 insint(d, "SOL_ATALK", SOL_ATALK);
3123#endif
3124#ifdef SOL_NETROM
3125 insint(d, "SOL_NETROM", SOL_NETROM);
3126#endif
3127#ifdef SOL_ROSE
3128 insint(d, "SOL_ROSE", SOL_ROSE);
3129#endif
3130#ifdef SOL_TCP
3131 insint(d, "SOL_TCP", SOL_TCP);
3132#else
3133 insint(d, "SOL_TCP", 6);
3134#endif
3135#ifdef SOL_UDP
3136 insint(d, "SOL_UDP", SOL_UDP);
3137#else
3138 insint(d, "SOL_UDP", 17);
3139#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003140#ifdef IPPROTO_IP
3141 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003142#else
3143 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003144#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003145#ifdef IPPROTO_HOPOPTS
3146 insint(d, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
3147#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003148#ifdef IPPROTO_ICMP
3149 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003150#else
3151 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003152#endif
3153#ifdef IPPROTO_IGMP
3154 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
3155#endif
3156#ifdef IPPROTO_GGP
3157 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
3158#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003159#ifdef IPPROTO_IPV4
3160 insint(d, "IPPROTO_IPV4", IPPROTO_IPV4);
3161#endif
3162#ifdef IPPROTO_IPIP
3163 insint(d, "IPPROTO_IPIP", IPPROTO_IPIP);
3164#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003165#ifdef IPPROTO_TCP
3166 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003167#else
3168 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003169#endif
3170#ifdef IPPROTO_EGP
3171 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
3172#endif
3173#ifdef IPPROTO_PUP
3174 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
3175#endif
3176#ifdef IPPROTO_UDP
3177 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003178#else
3179 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003180#endif
3181#ifdef IPPROTO_IDP
3182 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
3183#endif
3184#ifdef IPPROTO_HELLO
3185 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
3186#endif
3187#ifdef IPPROTO_ND
3188 insint(d, "IPPROTO_ND", IPPROTO_ND);
3189#endif
3190#ifdef IPPROTO_TP
3191 insint(d, "IPPROTO_TP", IPPROTO_TP);
3192#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003193#ifdef IPPROTO_IPV6
3194 insint(d, "IPPROTO_IPV6", IPPROTO_IPV6);
3195#endif
3196#ifdef IPPROTO_ROUTING
3197 insint(d, "IPPROTO_ROUTING", IPPROTO_ROUTING);
3198#endif
3199#ifdef IPPROTO_FRAGMENT
3200 insint(d, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
3201#endif
3202#ifdef IPPROTO_RSVP
3203 insint(d, "IPPROTO_RSVP", IPPROTO_RSVP);
3204#endif
3205#ifdef IPPROTO_GRE
3206 insint(d, "IPPROTO_GRE", IPPROTO_GRE);
3207#endif
3208#ifdef IPPROTO_ESP
3209 insint(d, "IPPROTO_ESP", IPPROTO_ESP);
3210#endif
3211#ifdef IPPROTO_AH
3212 insint(d, "IPPROTO_AH", IPPROTO_AH);
3213#endif
3214#ifdef IPPROTO_MOBILE
3215 insint(d, "IPPROTO_MOBILE", IPPROTO_MOBILE);
3216#endif
3217#ifdef IPPROTO_ICMPV6
3218 insint(d, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
3219#endif
3220#ifdef IPPROTO_NONE
3221 insint(d, "IPPROTO_NONE", IPPROTO_NONE);
3222#endif
3223#ifdef IPPROTO_DSTOPTS
3224 insint(d, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
3225#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003226#ifdef IPPROTO_XTP
3227 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
3228#endif
3229#ifdef IPPROTO_EON
3230 insint(d, "IPPROTO_EON", IPPROTO_EON);
3231#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003232#ifdef IPPROTO_PIM
3233 insint(d, "IPPROTO_PIM", IPPROTO_PIM);
3234#endif
3235#ifdef IPPROTO_IPCOMP
3236 insint(d, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
3237#endif
3238#ifdef IPPROTO_VRRP
3239 insint(d, "IPPROTO_VRRP", IPPROTO_VRRP);
3240#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003241#ifdef IPPROTO_BIP
3242 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
3243#endif
3244/**/
3245#ifdef IPPROTO_RAW
3246 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003247#else
3248 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003249#endif
3250#ifdef IPPROTO_MAX
3251 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
3252#endif
3253
3254 /* Some port configuration */
3255#ifdef IPPORT_RESERVED
3256 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
3257#else
3258 insint(d, "IPPORT_RESERVED", 1024);
3259#endif
3260#ifdef IPPORT_USERRESERVED
3261 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
3262#else
3263 insint(d, "IPPORT_USERRESERVED", 5000);
3264#endif
3265
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003266 /* Some reserved IP v.4 addresses */
3267#ifdef INADDR_ANY
3268 insint(d, "INADDR_ANY", INADDR_ANY);
3269#else
3270 insint(d, "INADDR_ANY", 0x00000000);
3271#endif
3272#ifdef INADDR_BROADCAST
3273 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
3274#else
3275 insint(d, "INADDR_BROADCAST", 0xffffffff);
3276#endif
3277#ifdef INADDR_LOOPBACK
3278 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
3279#else
3280 insint(d, "INADDR_LOOPBACK", 0x7F000001);
3281#endif
3282#ifdef INADDR_UNSPEC_GROUP
3283 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
3284#else
3285 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
3286#endif
3287#ifdef INADDR_ALLHOSTS_GROUP
3288 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
3289#else
3290 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
3291#endif
3292#ifdef INADDR_MAX_LOCAL_GROUP
3293 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
3294#else
3295 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
3296#endif
3297#ifdef INADDR_NONE
3298 insint(d, "INADDR_NONE", INADDR_NONE);
3299#else
3300 insint(d, "INADDR_NONE", 0xffffffff);
3301#endif
3302
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003303 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003304#ifdef IP_OPTIONS
3305 insint(d, "IP_OPTIONS", IP_OPTIONS);
3306#endif
3307#ifdef IP_HDRINCL
3308 insint(d, "IP_HDRINCL", IP_HDRINCL);
3309#endif
3310#ifdef IP_TOS
3311 insint(d, "IP_TOS", IP_TOS);
3312#endif
3313#ifdef IP_TTL
3314 insint(d, "IP_TTL", IP_TTL);
3315#endif
3316#ifdef IP_RECVOPTS
3317 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
3318#endif
3319#ifdef IP_RECVRETOPTS
3320 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
3321#endif
3322#ifdef IP_RECVDSTADDR
3323 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
3324#endif
3325#ifdef IP_RETOPTS
3326 insint(d, "IP_RETOPTS", IP_RETOPTS);
3327#endif
3328#ifdef IP_MULTICAST_IF
3329 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
3330#endif
3331#ifdef IP_MULTICAST_TTL
3332 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
3333#endif
3334#ifdef IP_MULTICAST_LOOP
3335 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
3336#endif
3337#ifdef IP_ADD_MEMBERSHIP
3338 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
3339#endif
3340#ifdef IP_DROP_MEMBERSHIP
3341 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
3342#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003343#ifdef IP_DEFAULT_MULTICAST_TTL
3344 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
3345#endif
3346#ifdef IP_DEFAULT_MULTICAST_LOOP
3347 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
3348#endif
3349#ifdef IP_MAX_MEMBERSHIPS
3350 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
3351#endif
3352
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003353 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3354#ifdef IPV6_JOIN_GROUP
3355 insint(d, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
3356#endif
3357#ifdef IPV6_LEAVE_GROUP
3358 insint(d, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
3359#endif
3360#ifdef IPV6_MULTICAST_HOPS
3361 insint(d, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
3362#endif
3363#ifdef IPV6_MULTICAST_IF
3364 insint(d, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
3365#endif
3366#ifdef IPV6_MULTICAST_LOOP
3367 insint(d, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
3368#endif
3369#ifdef IPV6_UNICAST_HOPS
3370 insint(d, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
3371#endif
3372
Guido van Rossum09be4091999-08-09 14:40:40 +00003373 /* TCP options */
3374#ifdef TCP_NODELAY
3375 insint(d, "TCP_NODELAY", TCP_NODELAY);
3376#endif
3377#ifdef TCP_MAXSEG
3378 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
3379#endif
3380
3381 /* IPX options */
3382#ifdef IPX_TYPE
3383 insint(d, "IPX_TYPE", IPX_TYPE);
3384#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003385
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003386 /* get{addr,name}info parameters */
3387#ifdef EAI_ADDRFAMILY
3388 insint(d, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
3389#endif
3390#ifdef EAI_AGAIN
3391 insint(d, "EAI_AGAIN", EAI_AGAIN);
3392#endif
3393#ifdef EAI_BADFLAGS
3394 insint(d, "EAI_BADFLAGS", EAI_BADFLAGS);
3395#endif
3396#ifdef EAI_FAIL
3397 insint(d, "EAI_FAIL", EAI_FAIL);
3398#endif
3399#ifdef EAI_FAMILY
3400 insint(d, "EAI_FAMILY", EAI_FAMILY);
3401#endif
3402#ifdef EAI_MEMORY
3403 insint(d, "EAI_MEMORY", EAI_MEMORY);
3404#endif
3405#ifdef EAI_NODATA
3406 insint(d, "EAI_NODATA", EAI_NODATA);
3407#endif
3408#ifdef EAI_NONAME
3409 insint(d, "EAI_NONAME", EAI_NONAME);
3410#endif
3411#ifdef EAI_SERVICE
3412 insint(d, "EAI_SERVICE", EAI_SERVICE);
3413#endif
3414#ifdef EAI_SOCKTYPE
3415 insint(d, "EAI_SOCKTYPE", EAI_SOCKTYPE);
3416#endif
3417#ifdef EAI_SYSTEM
3418 insint(d, "EAI_SYSTEM", EAI_SYSTEM);
3419#endif
3420#ifdef EAI_BADHINTS
3421 insint(d, "EAI_BADHINTS", EAI_BADHINTS);
3422#endif
3423#ifdef EAI_PROTOCOL
3424 insint(d, "EAI_PROTOCOL", EAI_PROTOCOL);
3425#endif
3426#ifdef EAI_MAX
3427 insint(d, "EAI_MAX", EAI_MAX);
3428#endif
3429#ifdef AI_PASSIVE
3430 insint(d, "AI_PASSIVE", AI_PASSIVE);
3431#endif
3432#ifdef AI_CANONNAME
3433 insint(d, "AI_CANONNAME", AI_CANONNAME);
3434#endif
3435#ifdef AI_NUMERICHOST
3436 insint(d, "AI_NUMERICHOST", AI_NUMERICHOST);
3437#endif
3438#ifdef AI_MASK
3439 insint(d, "AI_MASK", AI_MASK);
3440#endif
3441#ifdef AI_ALL
3442 insint(d, "AI_ALL", AI_ALL);
3443#endif
3444#ifdef AI_V4MAPPED_CFG
3445 insint(d, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
3446#endif
3447#ifdef AI_ADDRCONFIG
3448 insint(d, "AI_ADDRCONFIG", AI_ADDRCONFIG);
3449#endif
3450#ifdef AI_V4MAPPED
3451 insint(d, "AI_V4MAPPED", AI_V4MAPPED);
3452#endif
3453#ifdef AI_DEFAULT
3454 insint(d, "AI_DEFAULT", AI_DEFAULT);
3455#endif
3456#ifdef NI_MAXHOST
3457 insint(d, "NI_MAXHOST", NI_MAXHOST);
3458#endif
3459#ifdef NI_MAXSERV
3460 insint(d, "NI_MAXSERV", NI_MAXSERV);
3461#endif
3462#ifdef NI_NOFQDN
3463 insint(d, "NI_NOFQDN", NI_NOFQDN);
3464#endif
3465#ifdef NI_NUMERICHOST
3466 insint(d, "NI_NUMERICHOST", NI_NUMERICHOST);
3467#endif
3468#ifdef NI_NAMEREQD
3469 insint(d, "NI_NAMEREQD", NI_NAMEREQD);
3470#endif
3471#ifdef NI_NUMERICSERV
3472 insint(d, "NI_NUMERICSERV", NI_NUMERICSERV);
3473#endif
3474#ifdef NI_DGRAM
3475 insint(d, "NI_DGRAM", NI_DGRAM);
3476#endif
3477
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003478 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003479#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003480 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003481#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003482}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003483
3484/* Simplistic emulation code for inet_pton that only works for IPv4 */
3485#ifndef HAVE_INET_PTON
Martin v. Löwisa2ca1ae2001-06-24 21:35:43 +00003486int
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003487inet_pton (int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003488{
3489 if(af == AF_INET){
3490 long packed_addr;
3491#ifdef USE_GUSI1
3492 packed_addr = (long)inet_addr(src).s_addr;
3493#else
3494 packed_addr = inet_addr(src);
3495#endif
3496 if (packed_addr == INADDR_NONE)
3497 return 0;
3498 memcpy(dst, &packed_addr, 4);
3499 return 1;
3500 }
3501 /* Should set errno to EAFNOSUPPORT */
3502 return -1;
3503}
3504
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003505const char *
3506inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003507{
3508 if (af == AF_INET) {
3509 struct in_addr packed_addr;
3510 if (size < 16)
3511 /* Should set errno to ENOSPC. */
3512 return NULL;
3513 memcpy(&packed_addr, src, sizeof(packed_addr));
3514 return strncpy(dst, inet_ntoa(packed_addr), size);
3515 }
3516 /* Should set errno to EAFNOSUPPORT */
3517 return NULL;
3518}
3519#endif