blob: 56e370099c1142faa1c1159a2397bc3d17241501 [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
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000285static PyObject *PySSLErrorObject;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000286#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
Jeremy Hyltonba699362001-10-11 17:23:34 +0000491#define X509_NAME_MAXLEN 256
492
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000493typedef struct {
494 PyObject_HEAD
495 PySocketSockObject *Socket; /* Socket on which we're layered */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000496 SSL_CTX* ctx;
497 SSL* ssl;
498 X509* server_cert;
499 BIO* sbio;
Jeremy Hyltonba699362001-10-11 17:23:34 +0000500 char server[X509_NAME_MAXLEN];
501 char issuer[X509_NAME_MAXLEN];
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000502
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000503} PySSLObject;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000504
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000505staticforward PyTypeObject PySSL_Type;
506staticforward PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args);
507staticforward PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000508
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000509#define PySSLObject_Check(v) ((v)->ob_type == &PySSL_Type)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000510
511#endif /* USE_SSL */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000512
Guido van Rossum30a685f1991-06-27 15:51:29 +0000513/* A forward reference to the Socktype type object.
514 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000515 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000516 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000517
Guido van Rossum73624e91994-10-10 17:59:00 +0000518staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000519
Guido van Rossum30a685f1991-06-27 15:51:29 +0000520
521/* Create a new socket object.
522 This just creates the object and initializes it.
523 If the creation fails, return NULL and set an exception (implicit
524 in NEWOBJ()). */
525
Guido van Rossum73624e91994-10-10 17:59:00 +0000526static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000527PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000528{
Guido van Rossum48a680c2001-03-02 06:34:14 +0000529#ifdef RISCOS
530 int block = 1;
531#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000532 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000533 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000534 s = PyObject_New(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000535 if (s != NULL) {
536 s->sock_fd = fd;
537 s->sock_family = family;
538 s->sock_type = type;
539 s->sock_proto = proto;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000540#ifdef RISCOS
541 if(taskwindow) {
542 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
543 }
544#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000545 }
546 return s;
547}
548
Guido van Rossum30a685f1991-06-27 15:51:29 +0000549
Guido van Rossum48a680c2001-03-02 06:34:14 +0000550/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000551 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000552#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000553PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000554#endif
555
556
Guido van Rossum30a685f1991-06-27 15:51:29 +0000557/* Convert a string specifying a host name or one of a few symbolic
558 names to a numeric IP address. This usually calls gethostbyname()
559 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000560 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000561 an error occurred; then an exception is raised. */
562
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000563static int
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000564setipaddr(char* name, struct sockaddr * addr_ret, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000565{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000566 struct addrinfo hints, *res;
567 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000568
Guido van Rossuma376cc51996-12-05 23:43:35 +0000569 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000570 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000571 int siz;
572 memset(&hints, 0, sizeof(hints));
573 hints.ai_family = af;
574 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
575 hints.ai_flags = AI_PASSIVE;
576 error = getaddrinfo(NULL, "0", &hints, &res);
577 if (error) {
578 PyGAI_Err(error);
579 return -1;
580 }
581 switch (res->ai_family) {
582 case AF_INET:
583 siz = 4;
584 break;
585#ifdef INET6
586 case AF_INET6:
587 siz = 16;
588 break;
589#endif
590 default:
591 freeaddrinfo(res);
592 PyErr_SetString(PySocket_Error,
593 "unsupported address family");
594 return -1;
595 }
596 if (res->ai_next) {
597 PyErr_SetString(PySocket_Error,
598 "wildcard resolved to multiple address");
599 return -1;
600 }
601 memcpy(addr_ret, res->ai_addr, res->ai_addrlen);
602 freeaddrinfo(res);
603 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000604 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000605 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000606 struct sockaddr_in *sin;
607 if (af != PF_INET && af != PF_UNSPEC) {
608 PyErr_SetString(PySocket_Error,
609 "address family mismatched");
610 return -1;
611 }
612 sin = (struct sockaddr_in *)addr_ret;
613 memset((void *) sin, '\0', sizeof(*sin));
614 sin->sin_family = AF_INET;
615#ifdef HAVE_SOCKADDR_SA_LEN
616 sin->sin_len = sizeof(*sin);
617#endif
618 sin->sin_addr.s_addr = INADDR_BROADCAST;
619 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000620 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000621 memset(&hints, 0, sizeof(hints));
622 hints.ai_family = af;
623 error = getaddrinfo(name, NULL, &hints, &res);
624 if (error) {
625 PyGAI_Err(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000626 return -1;
627 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000628 memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
629 freeaddrinfo(res);
630 switch (addr_ret->sa_family) {
631 case AF_INET:
632 return 4;
633#ifdef INET6
634 case AF_INET6:
635 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000636#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000637 default:
638 PyErr_SetString(PySocket_Error, "unknown address family");
639 return -1;
640 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000641}
642
Guido van Rossum30a685f1991-06-27 15:51:29 +0000643
Guido van Rossum30a685f1991-06-27 15:51:29 +0000644/* Create a string object representing an IP address.
645 This is always a string of the form 'dd.dd.dd.dd' (with variable
646 size numbers). */
647
Guido van Rossum73624e91994-10-10 17:59:00 +0000648static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000649makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000650{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000651 char buf[NI_MAXHOST];
652 int error;
653
654 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
655 NI_NUMERICHOST);
656 if (error) {
657 PyGAI_Err(error);
658 return NULL;
659 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000660 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000661}
662
663
664/* Create an object representing the given socket address,
665 suitable for passing it back to bind(), connect() etc.
666 The family field of the sockaddr structure is inspected
667 to determine what kind of address it really is. */
668
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000669/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000670static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000671makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000672{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000673 if (addrlen == 0) {
674 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000675 Py_INCREF(Py_None);
676 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000677 }
678
Guido van Rossumbcc20741998-08-04 22:53:56 +0000679#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000680 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000681 addr->sa_family = AF_INET;
682#endif
683
Guido van Rossum30a685f1991-06-27 15:51:29 +0000684 switch (addr->sa_family) {
685
686 case AF_INET:
687 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000688 struct sockaddr_in *a;
689 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000690 PyObject *ret = NULL;
691 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000692 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000693 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
694 Py_DECREF(addrobj);
695 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000696 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000697 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000698
Guido van Rossumb6775db1994-08-01 11:34:53 +0000699#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000700 case AF_UNIX:
701 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000702 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000703 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000704 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000705#endif /* AF_UNIX */
706
707#ifdef INET6
708 case AF_INET6:
709 {
710 struct sockaddr_in6 *a;
711 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
712 PyObject *ret = NULL;
713 if (addrobj) {
714 a = (struct sockaddr_in6 *)addr;
715 ret = Py_BuildValue("Oiii", addrobj, ntohs(a->sin6_port),
716 a->sin6_flowinfo, a->sin6_scope_id);
717 Py_DECREF(addrobj);
718 }
719 return ret;
720 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000721#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000722
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000723#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000724 case AF_PACKET:
725 {
726 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
727 char *ifname = "";
728 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000729 /* need to look up interface name give index */
730 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000731 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000732 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000733 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000734 }
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000735 return Py_BuildValue("shbhs#", ifname, ntohs(a->sll_protocol),
Guido van Rossum48a680c2001-03-02 06:34:14 +0000736 a->sll_pkttype, a->sll_hatype,
737 a->sll_addr, a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000738 }
739#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000740
Guido van Rossum30a685f1991-06-27 15:51:29 +0000741 /* More cases here... */
742
743 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000744 /* If we don't know the address family, don't raise an
745 exception -- return it as a tuple. */
746 return Py_BuildValue("is#",
747 addr->sa_family,
748 addr->sa_data,
749 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000750
Guido van Rossum30a685f1991-06-27 15:51:29 +0000751 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000752}
753
Guido van Rossum30a685f1991-06-27 15:51:29 +0000754
755/* Parse a socket address argument according to the socket object's
756 address family. Return 1 if the address was in the proper format,
757 0 of not. The address is returned through addr_ret, its length
758 through len_ret. */
759
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000760static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000761getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000762 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000763{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000764 switch (s->sock_family) {
765
Guido van Rossumb6775db1994-08-01 11:34:53 +0000766#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000767 case AF_UNIX:
768 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000769 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000770 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000771 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000772 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000773 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000774 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000775 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000776 PyErr_SetString(PySocket_Error,
777 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000778 return 0;
779 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000780 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000781 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000782 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000783 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000784 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000785 return 1;
786 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000787#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000788
Guido van Rossum30a685f1991-06-27 15:51:29 +0000789 case AF_INET:
790 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000791 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000792 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000793 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000794 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000795 if (!PyTuple_Check(args)) {
796 PyErr_Format(PyExc_TypeError,
797 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
798 args->ob_type->tp_name);
799 return 0;
800 }
801 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000802 return 0;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000803 if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000804 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000805 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000806 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000807 *addr_ret = (struct sockaddr *) addr;
808 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000809 return 1;
810 }
811
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000812#ifdef INET6
813 case AF_INET6:
814 {
815 struct sockaddr_in6* addr;
816 char *host;
817 int port, flowinfo, scope_id;
818 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
819 flowinfo = scope_id = 0;
820 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
821 &scope_id)) {
822 return 0;
823 }
824 if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
825 return 0;
826 addr->sin6_family = s->sock_family;
827 addr->sin6_port = htons((short)port);
828 addr->sin6_flowinfo = flowinfo;
829 addr->sin6_scope_id = scope_id;
830 *addr_ret = (struct sockaddr *) addr;
831 *len_ret = sizeof *addr;
832 return 1;
833 }
834#endif
835
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000836#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000837 case AF_PACKET:
838 {
839 struct sockaddr_ll* addr;
840 struct ifreq ifr;
841 char *interfaceName;
842 int protoNumber;
843 int hatype = 0;
844 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000845 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000846
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000847 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
848 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000849 return 0;
850 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
851 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000852 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Jeremy Hyltone2adc6c2001-10-11 17:27:58 +0000853 PySocket_Err();
Jeremy Hylton22308652001-02-02 03:23:09 +0000854 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000855 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000856 addr = &(s->sock_addr.ll);
857 addr->sll_family = AF_PACKET;
858 addr->sll_protocol = htons((short)protoNumber);
859 addr->sll_ifindex = ifr.ifr_ifindex;
860 addr->sll_pkttype = pkttype;
861 addr->sll_hatype = hatype;
862 *addr_ret = (struct sockaddr *) addr;
863 *len_ret = sizeof *addr;
864 return 1;
865 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000866#endif
867
Guido van Rossum30a685f1991-06-27 15:51:29 +0000868 /* More cases here... */
869
870 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000871 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000872 return 0;
873
874 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000875}
876
Guido van Rossum30a685f1991-06-27 15:51:29 +0000877
Guido van Rossum48a680c2001-03-02 06:34:14 +0000878/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000879 Return 1 if the family is known, 0 otherwise. The length is returned
880 through len_ret. */
881
882static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000883getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000884{
885 switch (s->sock_family) {
886
Guido van Rossumb6775db1994-08-01 11:34:53 +0000887#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000888 case AF_UNIX:
889 {
890 *len_ret = sizeof (struct sockaddr_un);
891 return 1;
892 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000893#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000894
895 case AF_INET:
896 {
897 *len_ret = sizeof (struct sockaddr_in);
898 return 1;
899 }
900
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000901#ifdef INET6
902 case AF_INET6:
903 {
904 *len_ret = sizeof (struct sockaddr_in6);
905 return 1;
906 }
907#endif
908
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000909#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000910 case AF_PACKET:
911 {
912 *len_ret = sizeof (struct sockaddr_ll);
913 return 1;
914 }
915#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000916
Guido van Rossum710e1df1992-06-12 10:39:36 +0000917 /* More cases here... */
918
919 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000920 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000921 return 0;
922
923 }
924}
925
926
Guido van Rossum30a685f1991-06-27 15:51:29 +0000927/* s.accept() method */
928
Guido van Rossum73624e91994-10-10 17:59:00 +0000929static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000930PySocketSock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000931{
932 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000933 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000934 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000935 PyObject *sock = NULL;
936 PyObject *addr = NULL;
937 PyObject *res = NULL;
938
Guido van Rossum710e1df1992-06-12 10:39:36 +0000939 if (!getsockaddrlen(s, &addrlen))
940 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000941 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000942 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000943 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000944 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000945#ifdef MS_WINDOWS
946 if (newfd == INVALID_SOCKET)
947#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000948 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000949#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000950 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000951
Guido van Rossum30a685f1991-06-27 15:51:29 +0000952 /* Create the new object with unspecified family,
953 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000954 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000955 s->sock_family,
956 s->sock_type,
957 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000958 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000959 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000960 goto finally;
961 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000962 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000963 addrlen);
964 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +0000965 goto finally;
966
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000967 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000968
969 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000970 Py_XDECREF(sock);
971 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000972 return res;
973}
974
Guido van Rossum82a5c661998-07-07 20:45:43 +0000975static char accept_doc[] =
976"accept() -> (socket object, address info)\n\
977\n\
978Wait for an incoming connection. Return a new socket representing the\n\
979connection, and the address of the client. For IP sockets, the address\n\
980info is a pair (hostaddr, port).";
981
Guido van Rossum30a685f1991-06-27 15:51:29 +0000982
Guido van Rossume4485b01994-09-07 14:32:49 +0000983/* s.setblocking(1 | 0) method */
984
Guido van Rossum73624e91994-10-10 17:59:00 +0000985static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000986PySocketSock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +0000987{
988 int block;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000989#ifndef RISCOS
Guido van Rossum644a12b1997-04-09 19:24:53 +0000990#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000991 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000992#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000993#endif
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000994 block = PyInt_AsLong(arg);
995 if (block == -1 && PyErr_Occurred())
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 *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001162PySocketSock_bind(PySocketSockObject *s, PyObject *addro)
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;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001167
Fred Drake728819a2000-07-01 03:40:12 +00001168 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001169 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001170 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001171 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001172 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001173 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001174 return PySocket_Err();
1175 Py_INCREF(Py_None);
1176 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001177}
1178
Guido van Rossum82a5c661998-07-07 20:45:43 +00001179static char bind_doc[] =
1180"bind(address)\n\
1181\n\
1182Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001183pair (host, port); the host must refer to the local host. For raw packet\n\
1184sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001185
Guido van Rossum30a685f1991-06-27 15:51:29 +00001186
1187/* s.close() method.
1188 Set the file descriptor to -1 so operations tried subsequently
1189 will surely fail. */
1190
Guido van Rossum73624e91994-10-10 17:59:00 +00001191static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001192PySocketSock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001193{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001194 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001195
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001196 if ((fd = s->sock_fd) != -1) {
1197 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001198 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001199 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001200 Py_END_ALLOW_THREADS
1201 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001202 Py_INCREF(Py_None);
1203 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001204}
1205
Guido van Rossum82a5c661998-07-07 20:45:43 +00001206static char close_doc[] =
1207"close()\n\
1208\n\
1209Close the socket. It cannot be used after this call.";
1210
Guido van Rossum30a685f1991-06-27 15:51:29 +00001211
Fred Drake728819a2000-07-01 03:40:12 +00001212/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001213
Guido van Rossum73624e91994-10-10 17:59:00 +00001214static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001215PySocketSock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001216{
1217 struct sockaddr *addr;
1218 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001219 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001220
Fred Drake728819a2000-07-01 03:40:12 +00001221 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001222 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001223 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001224 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001225 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001226 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001227 return PySocket_Err();
1228 Py_INCREF(Py_None);
1229 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001230}
1231
Guido van Rossum82a5c661998-07-07 20:45:43 +00001232static char connect_doc[] =
1233"connect(address)\n\
1234\n\
1235Connect the socket to a remote address. For IP sockets, the address\n\
1236is a pair (host, port).";
1237
Guido van Rossum30a685f1991-06-27 15:51:29 +00001238
Fred Drake728819a2000-07-01 03:40:12 +00001239/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001240
1241static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001242PySocketSock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001243{
1244 struct sockaddr *addr;
1245 int addrlen;
1246 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001247
Fred Drake728819a2000-07-01 03:40:12 +00001248 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001249 return NULL;
1250 Py_BEGIN_ALLOW_THREADS
1251 res = connect(s->sock_fd, addr, addrlen);
1252 Py_END_ALLOW_THREADS
1253 if (res != 0)
1254 res = errno;
1255 return PyInt_FromLong((long) res);
1256}
1257
Guido van Rossum82a5c661998-07-07 20:45:43 +00001258static char connect_ex_doc[] =
1259"connect_ex(address)\n\
1260\n\
1261This is like connect(address), but returns an error code (the errno value)\n\
1262instead of raising an exception when an error occurs.";
1263
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001264
Guido van Rossumed233a51992-06-23 09:07:03 +00001265/* s.fileno() method */
1266
Guido van Rossum73624e91994-10-10 17:59:00 +00001267static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001268PySocketSock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001269{
Fred Drakea04eaad2000-06-30 02:46:07 +00001270#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001271 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001272#else
1273 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1274#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001275}
1276
Guido van Rossum82a5c661998-07-07 20:45:43 +00001277static char fileno_doc[] =
1278"fileno() -> integer\n\
1279\n\
1280Return the integer file descriptor of the socket.";
1281
Guido van Rossumed233a51992-06-23 09:07:03 +00001282
Guido van Rossumbe32c891996-06-20 16:25:29 +00001283#ifndef NO_DUP
1284/* s.dup() method */
1285
1286static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001287PySocketSock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001288{
Fred Drakea04eaad2000-06-30 02:46:07 +00001289 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001290 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001291
Guido van Rossumbe32c891996-06-20 16:25:29 +00001292 newfd = dup(s->sock_fd);
1293 if (newfd < 0)
1294 return PySocket_Err();
1295 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001296 s->sock_family,
1297 s->sock_type,
1298 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001299 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001300 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001301 return sock;
1302}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001303
1304static char dup_doc[] =
1305"dup() -> socket object\n\
1306\n\
1307Return a new socket object connected to the same system resource.";
1308
Guido van Rossumbe32c891996-06-20 16:25:29 +00001309#endif
1310
1311
Guido van Rossumc89705d1992-11-26 08:54:07 +00001312/* s.getsockname() method */
1313
Guido van Rossum73624e91994-10-10 17:59:00 +00001314static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001315PySocketSock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001316{
1317 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001318 int res;
1319 socklen_t addrlen;
1320
Guido van Rossumc89705d1992-11-26 08:54:07 +00001321 if (!getsockaddrlen(s, &addrlen))
1322 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001323 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001324 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001325 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001326 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001327 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001328 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001329 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001330}
1331
Guido van Rossum82a5c661998-07-07 20:45:43 +00001332static char getsockname_doc[] =
1333"getsockname() -> address info\n\
1334\n\
1335Return the address of the local endpoint. For IP sockets, the address\n\
1336info is a pair (hostaddr, port).";
1337
Guido van Rossumc89705d1992-11-26 08:54:07 +00001338
Guido van Rossumb6775db1994-08-01 11:34:53 +00001339#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001340/* s.getpeername() method */
1341
Guido van Rossum73624e91994-10-10 17:59:00 +00001342static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001343PySocketSock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001344{
1345 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001346 int res;
1347 socklen_t addrlen;
1348
Guido van Rossumc89705d1992-11-26 08:54:07 +00001349 if (!getsockaddrlen(s, &addrlen))
1350 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001351 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001352 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001353 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001354 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001355 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001356 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001357 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001358}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001359
1360static char getpeername_doc[] =
1361"getpeername() -> address info\n\
1362\n\
1363Return the address of the remote endpoint. For IP sockets, the address\n\
1364info is a pair (hostaddr, port).";
1365
Guido van Rossumb6775db1994-08-01 11:34:53 +00001366#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001367
1368
Guido van Rossum30a685f1991-06-27 15:51:29 +00001369/* s.listen(n) method */
1370
Guido van Rossum73624e91994-10-10 17:59:00 +00001371static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001372PySocketSock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001373{
1374 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001375 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001376
1377 backlog = PyInt_AsLong(arg);
1378 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001379 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001380 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001381 if (backlog < 1)
1382 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001383 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001384 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001385 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001386 return PySocket_Err();
1387 Py_INCREF(Py_None);
1388 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001389}
1390
Guido van Rossum82a5c661998-07-07 20:45:43 +00001391static char listen_doc[] =
1392"listen(backlog)\n\
1393\n\
1394Enable a server to accept connections. The backlog argument must be at\n\
1395least 1; it specifies the number of unaccepted connection that the system\n\
1396will allow before refusing new connections.";
1397
1398
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001399#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001400/* s.makefile(mode) method.
1401 Create a new open file object referring to a dupped version of
1402 the socket's file descriptor. (The dup() call is necessary so
1403 that the open file and socket objects may be closed independent
1404 of each other.)
1405 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1406
Guido van Rossum73624e91994-10-10 17:59:00 +00001407static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001408PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001409{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001410 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001411 char *mode = "r";
1412 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001413#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001414 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001415#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001416 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001417#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001418 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001419 PyObject *f;
1420
Guido van Rossum43713e52000-02-29 13:59:29 +00001421 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001422 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001423#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001424 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1425 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001426#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001427 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001428#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001429 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001430 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001431 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001432 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001433 }
1434 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1435 if (f != NULL)
1436 PyFile_SetBufSize(f, bufsize);
1437 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001438}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001439
1440static char makefile_doc[] =
1441"makefile([mode[, buffersize]]) -> file object\n\
1442\n\
1443Return a regular file object corresponding to the socket.\n\
1444The mode and buffersize arguments are as for the built-in open() function.";
1445
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001446#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001447
Guido van Rossum48a680c2001-03-02 06:34:14 +00001448
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001449/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001450
Guido van Rossum73624e91994-10-10 17:59:00 +00001451static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001452PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001453{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001454 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001455 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001456 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001457 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001458 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001459 if (buf == NULL)
1460 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001461 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001462 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001463 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001464 if (n < 0) {
1465 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001466 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001467 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001468 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001469 return NULL;
1470 return buf;
1471}
1472
Guido van Rossum82a5c661998-07-07 20:45:43 +00001473static char recv_doc[] =
1474"recv(buffersize[, flags]) -> data\n\
1475\n\
1476Receive up to buffersize bytes from the socket. For the optional flags\n\
1477argument, see the Unix manual. When no data is available, block until\n\
1478at least one byte is available or until the remote end is closed. When\n\
1479the remote end is closed and all data is read, return the empty string.";
1480
Guido van Rossum30a685f1991-06-27 15:51:29 +00001481
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001482/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001483
Guido van Rossum73624e91994-10-10 17:59:00 +00001484static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001485PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001486{
1487 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001488 PyObject *buf = NULL;
1489 PyObject *addr = NULL;
1490 PyObject *ret = NULL;
1491
Guido van Rossumff3ab422000-04-24 15:16:03 +00001492 int len, n, flags = 0;
1493 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001494 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001495 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001496 if (!getsockaddrlen(s, &addrlen))
1497 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001498 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001499 if (buf == NULL)
1500 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001501 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001502 memset(addrbuf, 0, addrlen);
1503 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001504#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001505#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001506 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001507#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001508 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001509#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001510#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001511 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001512#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001513 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001514 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001515 if (n < 0) {
1516 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001517 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001518 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001519 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001520 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001521
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001522 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001523 goto finally;
1524
Guido van Rossum73624e91994-10-10 17:59:00 +00001525 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001526 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001527 Py_XDECREF(addr);
1528 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001529 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001530}
1531
Guido van Rossum82a5c661998-07-07 20:45:43 +00001532static char recvfrom_doc[] =
1533"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1534\n\
1535Like recv(buffersize, flags) but also return the sender's address info.";
1536
Guido van Rossum30a685f1991-06-27 15:51:29 +00001537
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001538/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001539
Guido van Rossum73624e91994-10-10 17:59:00 +00001540static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001541PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001542{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001543 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001544 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001545 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001546 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001547 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001548 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001549 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001550 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001551 return PySocket_Err();
1552 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001553}
1554
Guido van Rossum82a5c661998-07-07 20:45:43 +00001555static char send_doc[] =
1556"send(data[, flags])\n\
1557\n\
1558Send a data string to the socket. For the optional flags\n\
1559argument, see the Unix manual.";
1560
Guido van Rossum30a685f1991-06-27 15:51:29 +00001561
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001562/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001563
Guido van Rossum73624e91994-10-10 17:59:00 +00001564static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001565PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001566{
Guido van Rossum73624e91994-10-10 17:59:00 +00001567 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001568 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001569 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001570 int addrlen, len, n, flags;
1571 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001572 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001573 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001574 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1575 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001576 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001577 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001578 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001579 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001580 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001581 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001582 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001583 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001584 return PySocket_Err();
1585 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001586}
1587
Guido van Rossum82a5c661998-07-07 20:45:43 +00001588static char sendto_doc[] =
1589"sendto(data[, flags], address)\n\
1590\n\
1591Like send(data, flags) but allows specifying the destination address.\n\
1592For IP sockets, the address is a pair (hostaddr, port).";
1593
Guido van Rossum30a685f1991-06-27 15:51:29 +00001594
1595/* s.shutdown(how) method */
1596
Guido van Rossum73624e91994-10-10 17:59:00 +00001597static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001598PySocketSock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001599{
1600 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001601 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001602
1603 how = PyInt_AsLong(arg);
1604 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001605 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001606 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001607 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001608 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001609 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001610 return PySocket_Err();
1611 Py_INCREF(Py_None);
1612 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001613}
1614
Guido van Rossum82a5c661998-07-07 20:45:43 +00001615static char shutdown_doc[] =
1616"shutdown(flag)\n\
1617\n\
1618Shut down the reading side of the socket (flag == 0), the writing side\n\
1619of the socket (flag == 1), or both ends (flag == 2).";
1620
Guido van Rossum30a685f1991-06-27 15:51:29 +00001621
1622/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001623
Guido van Rossum73624e91994-10-10 17:59:00 +00001624static PyMethodDef PySocketSock_methods[] = {
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001625 {"accept", (PyNoArgsFunction)PySocketSock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001626 accept_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001627 {"bind", (PyCFunction)PySocketSock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001628 bind_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001629 {"close", (PyNoArgsFunction)PySocketSock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001630 close_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001631 {"connect", (PyCFunction)PySocketSock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001632 connect_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001633 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001634 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001635#ifndef NO_DUP
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001636 {"dup", (PyNoArgsFunction)PySocketSock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001637 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001638#endif
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001639 {"fileno", (PyNoArgsFunction)PySocketSock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001640 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001641#ifdef HAVE_GETPEERNAME
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001642 {"getpeername", (PyNoArgsFunction)PySocketSock_getpeername,
1643 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001644#endif
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001645 {"getsockname", (PyNoArgsFunction)PySocketSock_getsockname,
1646 METH_NOARGS, getsockname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001647 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1648 getsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001649 {"listen", (PyCFunction)PySocketSock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001650 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001651#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001652 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1653 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001654#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001655 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1656 recv_doc},
1657 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1658 recvfrom_doc},
1659 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1660 send_doc},
1661 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1662 sendto_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001663 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001664 setblocking_doc},
1665 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1666 setsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001667 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001668 shutdown_doc},
1669#ifdef RISCOS
1670 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1671 sleeptaskw_doc},
1672#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001673 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001674};
1675
Guido van Rossum30a685f1991-06-27 15:51:29 +00001676
Guido van Rossum73624e91994-10-10 17:59:00 +00001677/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001678 First close the file description. */
1679
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001680static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001681PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001682{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001683 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001684 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001685 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001686}
1687
Guido van Rossum30a685f1991-06-27 15:51:29 +00001688
1689/* Return a socket object's named attribute. */
1690
Guido van Rossum73624e91994-10-10 17:59:00 +00001691static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001692PySocketSock_getattr(PySocketSockObject *s, char *name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001693{
Guido van Rossum73624e91994-10-10 17:59:00 +00001694 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001695}
1696
Guido van Rossum30a685f1991-06-27 15:51:29 +00001697
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001698static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001699PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001700{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001701 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001702#if SIZEOF_SOCKET_T > SIZEOF_LONG
1703 if (s->sock_fd > LONG_MAX) {
1704 /* this can occur on Win64, and actually there is a special
1705 ugly printf formatter for decimal pointer length integer
1706 printing, only bother if necessary*/
1707 PyErr_SetString(PyExc_OverflowError,
1708 "no printf formatter to display the socket descriptor in decimal");
1709 return NULL;
1710 }
1711#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001712 sprintf(buf,
1713 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
Fred Drakea04eaad2000-06-30 02:46:07 +00001714 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001715 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001716}
1717
1718
Guido van Rossumb6775db1994-08-01 11:34:53 +00001719/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001720
Guido van Rossum73624e91994-10-10 17:59:00 +00001721static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001722 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001723 0,
1724 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001725 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001726 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001727 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001728 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001729 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001730 0, /*tp_setattr*/
1731 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001732 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001733 0, /*tp_as_number*/
1734 0, /*tp_as_sequence*/
1735 0, /*tp_as_mapping*/
1736};
1737
Guido van Rossum30a685f1991-06-27 15:51:29 +00001738
Guido van Rossum81194471991-07-27 21:42:02 +00001739/* Python interface to gethostname(). */
1740
1741/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001742static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001743PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001744{
1745 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001746 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001747 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001748 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001749 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001750 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001751 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001752 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001753 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001754 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001755 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001756}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001757
Guido van Rossum82a5c661998-07-07 20:45:43 +00001758static char gethostname_doc[] =
1759"gethostname() -> string\n\
1760\n\
1761Return the current host name.";
1762
Guido van Rossumff4949e1992-08-05 19:58:53 +00001763
Guido van Rossum30a685f1991-06-27 15:51:29 +00001764/* Python interface to gethostbyname(name). */
1765
1766/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001767static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001768PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001769{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001770 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001771 struct sockaddr_storage addrbuf;
1772
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001773 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001774 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001775 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001776 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001777 return makeipaddr((struct sockaddr *)&addrbuf,
1778 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001779}
1780
Guido van Rossum82a5c661998-07-07 20:45:43 +00001781static char gethostbyname_doc[] =
1782"gethostbyname(host) -> address\n\
1783\n\
1784Return the IP address (a string of the form '255.255.255.255') for a host.";
1785
1786
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001787/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1788
1789static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001790gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001791{
1792 char **pch;
1793 PyObject *rtn_tuple = (PyObject *)NULL;
1794 PyObject *name_list = (PyObject *)NULL;
1795 PyObject *addr_list = (PyObject *)NULL;
1796 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001797
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001798 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001799 /* Let's get real error message to return */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001800 PyH_Err(h_errno);
1801 return NULL;
1802 }
1803 if (h->h_addrtype != af) {
1804#ifdef HAVE_STRERROR
1805 /* Let's get real error message to return */
1806 PyErr_SetString(PySocket_Error, (char *)strerror(EAFNOSUPPORT));
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001807#else
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001808 PyErr_SetString(PySocket_Error,
1809 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001810#endif
1811 return NULL;
1812 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001813 switch (af) {
1814 case AF_INET:
1815 if (alen < sizeof(struct sockaddr_in))
1816 return NULL;
1817 break;
1818#ifdef INET6
1819 case AF_INET6:
1820 if (alen < sizeof(struct sockaddr_in6))
1821 return NULL;
1822 break;
1823#endif
1824 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001825 if ((name_list = PyList_New(0)) == NULL)
1826 goto err;
1827 if ((addr_list = PyList_New(0)) == NULL)
1828 goto err;
1829 for (pch = h->h_aliases; *pch != NULL; pch++) {
1830 int status;
1831 tmp = PyString_FromString(*pch);
1832 if (tmp == NULL)
1833 goto err;
1834 status = PyList_Append(name_list, tmp);
1835 Py_DECREF(tmp);
1836 if (status)
1837 goto err;
1838 }
1839 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1840 int status;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001841 switch (af) {
1842 case AF_INET:
1843 {
1844 struct sockaddr_in sin;
1845 memset(&sin, 0, sizeof(sin));
1846 sin.sin_family = af;
1847#ifdef HAVE_SOCKADDR_SA_LEN
1848 sin.sin_len = sizeof(sin);
1849#endif
1850 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
1851 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
1852 if (pch == h->h_addr_list && alen >= sizeof(sin))
1853 memcpy((char *) addr, &sin, sizeof(sin));
1854 break;
1855 }
1856#ifdef INET6
1857 case AF_INET6:
1858 {
1859 struct sockaddr_in6 sin6;
1860 memset(&sin6, 0, sizeof(sin6));
1861 sin6.sin6_family = af;
1862#ifdef HAVE_SOCKADDR_SA_LEN
1863 sin6.sin6_len = sizeof(sin6);
1864#endif
1865 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
1866 tmp = makeipaddr((struct sockaddr *)&sin6,
1867 sizeof(sin6));
1868 if (pch == h->h_addr_list && alen >= sizeof(sin6))
1869 memcpy((char *) addr, &sin6, sizeof(sin6));
1870 break;
1871 }
1872#endif
1873 default: /* can't happen */
1874 PyErr_SetString(PySocket_Error,
1875 "unsupported address family");
1876 return NULL;
1877 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001878 if (tmp == NULL)
1879 goto err;
1880 status = PyList_Append(addr_list, tmp);
1881 Py_DECREF(tmp);
1882 if (status)
1883 goto err;
1884 }
1885 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1886 err:
1887 Py_XDECREF(name_list);
1888 Py_XDECREF(addr_list);
1889 return rtn_tuple;
1890}
1891
1892
1893/* Python interface to gethostbyname_ex(name). */
1894
1895/*ARGSUSED*/
1896static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001897PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001898{
1899 char *name;
1900 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001901 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00001902 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00001903 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001904#ifdef HAVE_GETHOSTBYNAME_R
1905 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001906#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1907 struct hostent_data data;
1908#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001909 char buf[16384];
1910 int buf_len = (sizeof buf) - 1;
1911 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001912#endif
1913#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001914 int result;
1915#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001916#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001917
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001918 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001919 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001920 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001921 return NULL;
1922 Py_BEGIN_ALLOW_THREADS
1923#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001924#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001925 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001926#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001927 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001928#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001929 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001930 result = gethostbyname_r(name, &hp_allocated, &data);
1931 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001932#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001933#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001934#ifdef USE_GETHOSTBYNAME_LOCK
1935 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001936#endif
1937 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001938#endif /* HAVE_GETHOSTBYNAME_R */
1939 Py_END_ALLOW_THREADS
Martin v. Löwis9db2f572001-07-23 01:30:10 +00001940 /* Some C libraries would require addr.__ss_family instead of addr.ss_family.
1941 Therefore, we cast the sockaddr_storage into sockaddr to access sa_family. */
1942 sa = (struct sockaddr*)&addr;
1943 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00001944#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001945 PyThread_release_lock(gethostbyname_lock);
1946#endif
1947 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001948}
1949
1950static char ghbn_ex_doc[] =
1951"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1952\n\
1953Return the true host name, a list of aliases, and a list of IP addresses,\n\
1954for a host. The host argument is a string giving a host name or IP number.";
1955
1956
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001957/* Python interface to gethostbyaddr(IP). */
1958
1959/*ARGSUSED*/
1960static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001961PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001962{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001963#ifdef INET6
1964 struct sockaddr_storage addr;
1965#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00001966 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001967#endif
1968 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001969 char *ip_num;
1970 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001971 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001972#ifdef HAVE_GETHOSTBYNAME_R
1973 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001974#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1975 struct hostent_data data;
1976#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001977 char buf[16384];
1978 int buf_len = (sizeof buf) - 1;
1979 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001980#endif
1981#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001982 int result;
1983#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001984#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001985 char *ap;
1986 int al;
1987 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001988
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001989 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001990 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001991 af = PF_UNSPEC;
1992 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001993 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001994 af = sa->sa_family;
1995 ap = NULL;
1996 al = 0;
1997 switch (af) {
1998 case AF_INET:
1999 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2000 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2001 break;
2002#ifdef INET6
2003 case AF_INET6:
2004 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2005 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2006 break;
2007#endif
2008 default:
2009 PyErr_SetString(PySocket_Error, "unsupported address family");
2010 return NULL;
2011 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002012 Py_BEGIN_ALLOW_THREADS
2013#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002014#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002015 result = gethostbyaddr_r(ap, al, af,
2016 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002017 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002018#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002019 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002020 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002021#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002022 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002023 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002024 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002025#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002026#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002027#ifdef USE_GETHOSTBYNAME_LOCK
2028 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002029#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002030 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002031#endif /* HAVE_GETHOSTBYNAME_R */
2032 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002033 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002034#ifdef USE_GETHOSTBYNAME_LOCK
2035 PyThread_release_lock(gethostbyname_lock);
2036#endif
2037 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002038}
2039
Guido van Rossum82a5c661998-07-07 20:45:43 +00002040static char gethostbyaddr_doc[] =
2041"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2042\n\
2043Return the true host name, a list of aliases, and a list of IP addresses,\n\
2044for a host. The host argument is a string giving a host name or IP number.";
2045
Guido van Rossum30a685f1991-06-27 15:51:29 +00002046
2047/* Python interface to getservbyname(name).
2048 This only returns the port number, since the other info is already
2049 known or not useful (like the list of aliases). */
2050
2051/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002052static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002053PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002054{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002055 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002056 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002057 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002058 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002059 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002060 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002061 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002062 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002063 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002064 return NULL;
2065 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002066 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002067}
2068
Guido van Rossum82a5c661998-07-07 20:45:43 +00002069static char getservbyname_doc[] =
2070"getservbyname(servicename, protocolname) -> integer\n\
2071\n\
2072Return a port number from a service name and protocol name.\n\
2073The protocol name should be 'tcp' or 'udp'.";
2074
Guido van Rossum30a685f1991-06-27 15:51:29 +00002075
Guido van Rossum3901d851996-12-19 16:35:04 +00002076/* Python interface to getprotobyname(name).
2077 This only returns the protocol number, since the other info is
2078 already known or not useful (like the list of aliases). */
2079
2080/*ARGSUSED*/
2081static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002082PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002083{
2084 char *name;
2085 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002086#ifdef __BEOS__
2087/* Not available in BeOS yet. - [cjh] */
2088 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
2089 return NULL;
2090#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002091 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002092 return NULL;
2093 Py_BEGIN_ALLOW_THREADS
2094 sp = getprotobyname(name);
2095 Py_END_ALLOW_THREADS
2096 if (sp == NULL) {
2097 PyErr_SetString(PySocket_Error, "protocol not found");
2098 return NULL;
2099 }
2100 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002101#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002102}
2103
Guido van Rossum82a5c661998-07-07 20:45:43 +00002104static char getprotobyname_doc[] =
2105"getprotobyname(name) -> integer\n\
2106\n\
2107Return the protocol number for the named protocol. (Rarely used.)";
2108
Guido van Rossum3901d851996-12-19 16:35:04 +00002109
Guido van Rossum30a685f1991-06-27 15:51:29 +00002110/* Python interface to socket(family, type, proto).
2111 The third (protocol) argument is optional.
2112 Return a new socket object. */
2113
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002114/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002115static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002116PySocket_socket(PyObject *self, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002117{
Guido van Rossum73624e91994-10-10 17:59:00 +00002118 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002119 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002120 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00002121 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002122 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002123 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002124 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002125 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00002126#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00002127 if (fd == INVALID_SOCKET)
2128#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002129 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00002130#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002131 return PySocket_Err();
2132 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002133 /* If the object can't be created, don't forget to close the
2134 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002135 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002136 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00002137 /* From now on, ignore SIGPIPE and let the error checking
2138 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002139#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00002140 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002141#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002142 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002143}
2144
Guido van Rossum82a5c661998-07-07 20:45:43 +00002145static char socket_doc[] =
2146"socket(family, type[, proto]) -> socket object\n\
2147\n\
2148Open a socket of the given type. The family argument specifies the\n\
2149address family; it is normally AF_INET, sometimes AF_UNIX.\n\
2150The type argument specifies whether this is a stream (SOCK_STREAM)\n\
2151or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
2152specifying the default protocol.";
2153
2154
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002155#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002156/* Create a socket object from a numeric file description.
2157 Useful e.g. if stdin is a socket.
2158 Additional arguments as for socket(). */
2159
2160/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002161static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002162PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002163{
Guido van Rossum73624e91994-10-10 17:59:00 +00002164 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002165 SOCKET_T fd;
2166 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002167 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2168 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002169 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002170 /* Dup the fd so it and the socket can be closed independently */
2171 fd = dup(fd);
2172 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00002173 return PySocket_Err();
2174 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002175 /* From now on, ignore SIGPIPE and let the error checking
2176 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002177#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002178 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002179#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002180 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002181}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002182
2183static char fromfd_doc[] =
2184"fromfd(fd, family, type[, proto]) -> socket object\n\
2185\n\
2186Create a socket object from the given file descriptor.\n\
2187The remaining arguments are the same as for socket().";
2188
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002189#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002190
Guido van Rossum82a5c661998-07-07 20:45:43 +00002191
Guido van Rossum006bf911996-06-12 04:04:55 +00002192static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002193PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002194{
2195 int x1, x2;
2196
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002197 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002198 return NULL;
2199 }
2200 x2 = (int)ntohs((short)x1);
2201 return PyInt_FromLong(x2);
2202}
2203
Guido van Rossum82a5c661998-07-07 20:45:43 +00002204static char ntohs_doc[] =
2205"ntohs(integer) -> integer\n\
2206\n\
2207Convert a 16-bit integer from network to host byte order.";
2208
2209
Guido van Rossum006bf911996-06-12 04:04:55 +00002210static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002211PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002212{
2213 int x1, x2;
2214
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002215 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002216 return NULL;
2217 }
2218 x2 = ntohl(x1);
2219 return PyInt_FromLong(x2);
2220}
2221
Guido van Rossum82a5c661998-07-07 20:45:43 +00002222static char ntohl_doc[] =
2223"ntohl(integer) -> integer\n\
2224\n\
2225Convert a 32-bit integer from network to host byte order.";
2226
2227
Guido van Rossum006bf911996-06-12 04:04:55 +00002228static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002229PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002230{
2231 int x1, x2;
2232
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002233 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002234 return NULL;
2235 }
2236 x2 = (int)htons((short)x1);
2237 return PyInt_FromLong(x2);
2238}
2239
Guido van Rossum82a5c661998-07-07 20:45:43 +00002240static char htons_doc[] =
2241"htons(integer) -> integer\n\
2242\n\
2243Convert a 16-bit integer from host to network byte order.";
2244
2245
Guido van Rossum006bf911996-06-12 04:04:55 +00002246static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002247PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002248{
2249 int x1, x2;
2250
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002251 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002252 return NULL;
2253 }
2254 x2 = htonl(x1);
2255 return PyInt_FromLong(x2);
2256}
2257
Guido van Rossum82a5c661998-07-07 20:45:43 +00002258static char htonl_doc[] =
2259"htonl(integer) -> integer\n\
2260\n\
2261Convert a 32-bit integer from host to network byte order.";
2262
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002263/*
2264 * socket.inet_aton() and socket.inet_ntoa() functions
2265 *
2266 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2267 *
2268 */
2269
Guido van Rossum48a680c2001-03-02 06:34:14 +00002270static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002271"inet_aton(string) -> packed 32-bit IP representation\n\
2272\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002273Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002274binary format used in low-level network functions.";
2275
2276static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002277PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002278{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002279#ifndef INADDR_NONE
2280#define INADDR_NONE (-1)
2281#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002282
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002283 /* Have to use inet_addr() instead */
2284 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002285 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002286
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002287 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002288 return NULL;
2289 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00002290#ifdef USE_GUSI1
Fred Drakee5065292001-07-19 21:16:41 +00002291 packed_addr = inet_addr(ip_addr).s_addr;
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002292#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002293 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002294#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002295
2296 if (packed_addr == INADDR_NONE) { /* invalid address */
2297 PyErr_SetString(PySocket_Error,
2298 "illegal IP address string passed to inet_aton");
2299 return NULL;
2300 }
2301
2302 return PyString_FromStringAndSize((char *) &packed_addr,
2303 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002304}
2305
Guido van Rossum48a680c2001-03-02 06:34:14 +00002306static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002307"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002308\n\
2309Convert an IP address from 32-bit packed binary format to string format";
2310
2311static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002312PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002313{
2314 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002315 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002316 struct in_addr packed_addr;
2317
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002318 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002319 return NULL;
2320 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002321
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002322 if (addr_len != sizeof(packed_addr)) {
2323 PyErr_SetString(PySocket_Error,
2324 "packed IP wrong length for inet_ntoa");
2325 return NULL;
2326 }
2327
2328 memcpy(&packed_addr, packed_str, addr_len);
2329
2330 return PyString_FromString(inet_ntoa(packed_addr));
2331}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002332
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002333/* Python interface to getaddrinfo(host, port). */
2334
2335/*ARGSUSED*/
2336static PyObject *
2337PySocket_getaddrinfo(PyObject *self, PyObject *args)
2338{
2339 struct addrinfo hints, *res0, *res;
2340 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002341 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002342 char *hptr, *pptr;
2343 int family, socktype, protocol, flags;
2344 int error;
2345 PyObject *all = (PyObject *)NULL;
2346 PyObject *single = (PyObject *)NULL;
2347
2348 family = socktype = protocol = flags = 0;
2349 family = PF_UNSPEC;
2350 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2351 &hptr, &pobj, &family, &socktype,
2352 &protocol, &flags)) {
2353 return NULL;
2354 }
2355 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002356 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002357 pptr = pbuf;
2358 } else if (PyString_Check(pobj)) {
2359 pptr = PyString_AsString(pobj);
2360 } else if (pobj == Py_None) {
2361 pptr = (char *)NULL;
2362 } else {
2363 PyErr_SetString(PySocket_Error, "Int or String expected");
2364 return NULL;
2365 }
2366 memset(&hints, 0, sizeof(hints));
2367 hints.ai_family = family;
2368 hints.ai_socktype = socktype;
2369 hints.ai_protocol = protocol;
2370 hints.ai_flags = flags;
2371 error = getaddrinfo(hptr, pptr, &hints, &res0);
2372 if (error) {
2373 PyGAI_Err(error);
2374 return NULL;
2375 }
2376
2377 if ((all = PyList_New(0)) == NULL)
2378 goto err;
2379 for (res = res0; res; res = res->ai_next) {
2380 single = Py_BuildValue("iiisO", res->ai_family,
2381 res->ai_socktype, res->ai_protocol,
2382 res->ai_canonname ? res->ai_canonname : "",
2383 makesockaddr(-1, res->ai_addr, res->ai_addrlen));
2384 if (single == NULL)
2385 goto err;
2386
2387 if (PyList_Append(all, single))
2388 goto err;
2389 Py_XDECREF(single);
2390 }
2391 Py_XDECREF(pobj);
2392 return all;
2393 err:
2394 Py_XDECREF(single);
2395 Py_XDECREF(all);
2396 Py_XDECREF(pobj);
2397 return (PyObject *)NULL;
2398}
2399
2400static char getaddrinfo_doc[] =
2401"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2402 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2403\n\
2404Resolve host and port into addrinfo struct.";
2405
2406/* Python interface to getnameinfo(sa, flags). */
2407
2408/*ARGSUSED*/
2409static PyObject *
2410PySocket_getnameinfo(PyObject *self, PyObject *args)
2411{
2412 PyObject *sa = (PyObject *)NULL;
2413 int flags;
2414 char *hostp;
2415 int n, port, flowinfo, scope_id;
2416 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2417 struct addrinfo hints, *res = NULL;
2418 int error;
2419 PyObject *ret = (PyObject *)NULL;
2420
2421 flags = flowinfo = scope_id = 0;
2422 if (PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags) == 0)
2423 return NULL;
2424 n = PyArg_ParseTuple(sa, "si|ii", &hostp, &port, &flowinfo, scope_id);
2425 if (n == 0)
2426 goto fail;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002427 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002428 memset(&hints, 0, sizeof(hints));
2429 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002430 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002431 error = getaddrinfo(hostp, pbuf, &hints, &res);
2432 if (error) {
2433 PyGAI_Err(error);
2434 goto fail;
2435 }
2436 if (res->ai_next) {
2437 PyErr_SetString(PySocket_Error,
2438 "sockaddr resolved to multiple addresses");
2439 goto fail;
2440 }
2441 switch (res->ai_family) {
2442 case AF_INET:
2443 {
2444 char *t1;
2445 int t2;
2446 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
2447 PyErr_SetString(PySocket_Error,
2448 "IPv4 sockaddr must be 2 tuple");
2449 goto fail;
2450 }
2451 break;
2452 }
2453#ifdef INET6
2454 case AF_INET6:
2455 {
2456 struct sockaddr_in6 *sin6;
2457 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2458 sin6->sin6_flowinfo = flowinfo;
2459 sin6->sin6_scope_id = scope_id;
2460 break;
2461 }
2462#endif
2463 }
2464 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2465 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2466 if (error) {
2467 PyGAI_Err(error);
2468 goto fail;
2469 }
2470 ret = Py_BuildValue("ss", hbuf, pbuf);
2471
2472fail:
2473 if (res)
2474 freeaddrinfo(res);
2475 Py_XDECREF(sa);
2476 return ret;
2477}
2478
2479static char getnameinfo_doc[] =
2480"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2481\n\
2482Get host and port for a sockaddr.";
2483
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002484/* XXX It might be helpful to augment the error message generated
2485 below with the name of the SSL function that generated the error.
2486 I expect it's obvious most of the time.
2487*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002488
2489#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002490static PyObject *
2491PySSL_SetError(SSL *ssl, int ret)
2492{
2493 PyObject *v, *n, *s;
2494 char *errstr;
2495 int err;
2496
2497 assert(ret <= 0);
2498
2499 err = SSL_get_error(ssl, ret);
2500 n = PyInt_FromLong(err);
2501 if (n == NULL)
2502 return NULL;
2503 v = PyTuple_New(2);
2504 if (v == NULL) {
2505 Py_DECREF(n);
2506 return NULL;
2507 }
2508
2509 switch (SSL_get_error(ssl, ret)) {
2510 case SSL_ERROR_ZERO_RETURN:
2511 errstr = "TLS/SSL connection has been closed";
2512 break;
2513 case SSL_ERROR_WANT_READ:
2514 errstr = "The operation did not complete (read)";
2515 break;
2516 case SSL_ERROR_WANT_WRITE:
2517 errstr = "The operation did not complete (write)";
2518 break;
2519 case SSL_ERROR_WANT_X509_LOOKUP:
2520 errstr = "The operation did not complete (X509 lookup)";
2521 break;
2522 case SSL_ERROR_SYSCALL:
2523 case SSL_ERROR_SSL:
2524 {
2525 unsigned long e = ERR_get_error();
2526 if (e == 0) {
2527 /* an EOF was observed that violates the protocol */
2528 errstr = "EOF occurred in violation of protocol";
2529 } else if (e == -1) {
2530 /* the underlying BIO reported an I/O error */
2531 Py_DECREF(v);
2532 Py_DECREF(n);
Jeremy Hyltone2adc6c2001-10-11 17:27:58 +00002533 return PySocket_Err();
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002534 } else {
2535 /* XXX Protected by global interpreter lock */
2536 errstr = ERR_error_string(e, NULL);
2537 }
2538 break;
2539 }
2540 default:
2541 errstr = "Invalid error code";
2542 }
2543 s = PyString_FromString(errstr);
2544 if (s == NULL) {
2545 Py_DECREF(v);
2546 Py_DECREF(n);
2547 }
2548 PyTuple_SET_ITEM(v, 0, n);
2549 PyTuple_SET_ITEM(v, 1, s);
2550 PyErr_SetObject(PySSLErrorObject, v);
2551 return NULL;
2552}
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002553
2554/* This is a C function to be called for new object initialization */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002555static PySSLObject *
2556newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002557{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002558 PySSLObject *self;
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002559 char *errstr = NULL;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002560 int ret;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002561
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002562 self = PyObject_New(PySSLObject, &PySSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002563 if (self == NULL){
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002564 errstr = "newPySSLObject error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002565 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002566 }
Jeremy Hyltonba699362001-10-11 17:23:34 +00002567 memset(self->server, '\0', sizeof(char) * X509_NAME_MAXLEN);
2568 memset(self->issuer, '\0', sizeof(char) * X509_NAME_MAXLEN);
Jeremy Hyltonec4b5452001-10-10 03:37:05 +00002569 self->server_cert = NULL;
2570 self->ssl = NULL;
2571 self->ctx = NULL;
2572 self->Socket = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002573
Jeremy Hylton22738b92001-10-10 22:37:48 +00002574 if ((key_file && !cert_file) || (!key_file && cert_file)) {
2575 errstr = "Both the key & certificate files must be specified";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002576 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002577 }
2578
Jeremy Hylton22738b92001-10-10 22:37:48 +00002579 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
2580 if (self->ctx == NULL) {
2581 errstr = "SSL_CTX_new error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002582 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002583 }
2584
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002585 if (key_file) {
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002586 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002587 SSL_FILETYPE_PEM) < 1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002588 errstr = "SSL_CTX_use_PrivateKey_file error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002589 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002590 }
2591
2592 if (SSL_CTX_use_certificate_chain_file(self->ctx,
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002593 cert_file) < 1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002594 errstr = "SSL_CTX_use_certificate_chain_file error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002595 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002596 }
2597 }
2598
2599 SSL_CTX_set_verify(self->ctx,
2600 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2601 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2602 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2603 SSL_set_connect_state(self->ssl);
2604
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002605 /* Actually negotiate SSL connection */
2606 /* XXX If SSL_connect() returns 0, it's also a failure. */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002607 ret = SSL_connect(self->ssl);
2608 if (ret <= 0) {
2609 PySSL_SetError(self->ssl, ret);
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002610 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002611 }
2612 self->ssl->debug = 1;
2613
2614 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2615 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
Jeremy Hyltonba699362001-10-11 17:23:34 +00002616 self->server, X509_NAME_MAXLEN);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002617 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
Jeremy Hyltonba699362001-10-11 17:23:34 +00002618 self->issuer, X509_NAME_MAXLEN);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002619 }
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002620 self->Socket = Sock;
2621 Py_INCREF(self->Socket);
2622 return self;
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002623 fail:
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002624 if (errstr)
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002625 PyErr_SetString(PySSLErrorObject, errstr);
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002626 Py_DECREF(self);
2627 return NULL;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002628}
2629
2630/* This is the Python function called for new object initialization */
2631static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002632PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002633{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002634 PySSLObject *rv;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002635 PySocketSockObject *Sock;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002636 char *key_file = NULL;
2637 char *cert_file = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002638
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002639 if (!PyArg_ParseTuple(args, "O!|zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002640 &PySocketSock_Type, (PyObject*)&Sock,
Jeremy Hyltonab006452001-10-10 03:33:24 +00002641 &key_file, &cert_file))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002642 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002643
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002644 rv = newPySSLObject(Sock, key_file, cert_file);
Jeremy Hyltonab006452001-10-10 03:33:24 +00002645 if (rv == NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002646 return NULL;
2647 return (PyObject *)rv;
2648}
2649
2650static char ssl_doc[] =
Jeremy Hyltonba699362001-10-11 17:23:34 +00002651"ssl(socket, [keyfile, certfile]) -> sslobject";
2652
2653/* SSL object methods */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002654
2655static PyObject *
Jeremy Hyltonba699362001-10-11 17:23:34 +00002656PySSL_server(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002657{
2658 return PyString_FromString(self->server);
2659}
2660
2661static PyObject *
Jeremy Hyltonba699362001-10-11 17:23:34 +00002662PySSL_issuer(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002663{
2664 return PyString_FromString(self->issuer);
2665}
2666
2667
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002668static void PySSL_dealloc(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002669{
2670 if (self->server_cert) /* Possible not to have one? */
2671 X509_free (self->server_cert);
Jeremy Hyltonec4b5452001-10-10 03:37:05 +00002672 if (self->ssl)
2673 SSL_free(self->ssl);
2674 if (self->ctx)
2675 SSL_CTX_free(self->ctx);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002676 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002677 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002678}
2679
Jeremy Hyltonba699362001-10-11 17:23:34 +00002680static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
2681{
2682 char *data;
2683 int len;
2684
2685 if (!PyArg_ParseTuple(args, "s#:write", &data, &len))
2686 return NULL;
2687
2688 len = SSL_write(self->ssl, data, len);
2689 if (len > 0)
2690 return PyInt_FromLong(len);
2691 else
2692 return PySSL_SetError(self->ssl, len);
2693}
2694
2695static char PySSL_SSLwrite_doc[] =
2696"write(s) -> len\n\
2697\n\
2698Writes the string s into the SSL object. Returns the number\n\
2699of bytes written.";
2700
2701static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
2702{
2703 PyObject *buf;
2704 int count = 0;
2705 int len = 1024;
2706
2707 if (!PyArg_ParseTuple(args, "|i:read", &len))
2708 return NULL;
2709
2710 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2711 return NULL;
2712
2713 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2714 if (count <= 0) {
2715 Py_DECREF(buf);
2716 return PySSL_SetError(self->ssl, count);
2717 }
2718 if (count != len && _PyString_Resize(&buf, count) < 0)
2719 return NULL;
2720 return buf;
2721}
2722
2723static char PySSL_SSLread_doc[] =
2724"read([len]) -> string\n\
2725\n\
2726Read up to len bytes from the SSL socket.";
2727
2728static PyMethodDef PySSLMethods[] = {
2729 {"write", (PyCFunction)PySSL_SSLwrite, 1,
2730 PySSL_SSLwrite_doc},
2731 {"read", (PyCFunction)PySSL_SSLread, 1,
2732 PySSL_SSLread_doc},
2733 {"server", (PyNoArgsFunction)PySSL_server, METH_NOARGS},
2734 {"issuer", (PyNoArgsFunction)PySSL_issuer, METH_NOARGS},
2735 {NULL, NULL}
2736};
2737
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002738static PyObject *PySSL_getattr(PySSLObject *self, char *name)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002739{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002740 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002741}
2742
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002743staticforward PyTypeObject PySSL_Type = {
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002744 PyObject_HEAD_INIT(NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002745 0, /*ob_size*/
2746 "SSL", /*tp_name*/
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002747 sizeof(PySSLObject), /*tp_basicsize*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002748 0, /*tp_itemsize*/
2749 /* methods */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002750 (destructor)PySSL_dealloc, /*tp_dealloc*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002751 0, /*tp_print*/
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002752 (getattrfunc)PySSL_getattr, /*tp_getattr*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002753 0, /*tp_setattr*/
2754 0, /*tp_compare*/
2755 0, /*tp_repr*/
2756 0, /*tp_as_number*/
2757 0, /*tp_as_sequence*/
2758 0, /*tp_as_mapping*/
2759 0, /*tp_hash*/
2760};
2761
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002762#endif /* USE_SSL */
2763
2764
Guido van Rossum30a685f1991-06-27 15:51:29 +00002765/* List of functions exported by this module. */
2766
Guido van Rossum73624e91994-10-10 17:59:00 +00002767static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002768 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002769 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002770 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002771 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002772 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002773 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002774 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002775 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002776 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002777 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002778 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002779 METH_VARARGS,getprotobyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002780 {"socket", PySocket_socket,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002781 METH_VARARGS, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002782#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002783 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002784 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002785#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002786 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002787 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002788 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002789 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002790 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002791 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002792 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002793 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002794 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002795 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002796 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002797 METH_VARARGS, inet_ntoa_doc},
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002798 {"getaddrinfo", PySocket_getaddrinfo,
2799 METH_VARARGS, getaddrinfo_doc},
2800 {"getnameinfo", PySocket_getnameinfo,
2801 METH_VARARGS, getnameinfo_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002802#ifdef USE_SSL
Guido van Rossum48a680c2001-03-02 06:34:14 +00002803 {"ssl", PySocket_ssl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002804 METH_VARARGS, ssl_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002805#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002806 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002807};
2808
Guido van Rossum30a685f1991-06-27 15:51:29 +00002809
2810/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002811 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002812 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002813 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002814static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002815insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002816{
Guido van Rossum73624e91994-10-10 17:59:00 +00002817 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002818 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002819 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002820
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002821 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002822}
2823
Guido van Rossum30a685f1991-06-27 15:51:29 +00002824
Guido van Rossum8d665e61996-06-26 18:22:49 +00002825#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002826
2827/* Additional initialization and cleanup for NT/Windows */
2828
2829static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002830NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002831{
2832 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002833}
2834
2835static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002836NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002837{
2838 WSADATA WSAData;
2839 int ret;
2840 char buf[100];
2841 ret = WSAStartup(0x0101, &WSAData);
2842 switch (ret) {
2843 case 0: /* no error */
2844 atexit(NTcleanup);
2845 return 1;
2846 case WSASYSNOTREADY:
2847 PyErr_SetString(PyExc_ImportError,
2848 "WSAStartup failed: network not ready");
2849 break;
2850 case WSAVERNOTSUPPORTED:
2851 case WSAEINVAL:
2852 PyErr_SetString(PyExc_ImportError,
2853 "WSAStartup failed: requested version not supported");
2854 break;
2855 default:
2856 sprintf(buf, "WSAStartup failed: error code %d", ret);
2857 PyErr_SetString(PyExc_ImportError, buf);
2858 break;
2859 }
2860 return 0;
2861}
2862
Guido van Rossum8d665e61996-06-26 18:22:49 +00002863#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002864
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002865#if defined(PYOS_OS2)
2866
2867/* Additional initialization and cleanup for OS/2 */
2868
2869static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002870OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002871{
2872 /* No cleanup is necessary for OS/2 Sockets */
2873}
2874
2875static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002876OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002877{
2878 char reason[64];
2879 int rc = sock_init();
2880
2881 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002882 atexit(OS2cleanup);
2883 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002884 }
2885
2886 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2887 PyErr_SetString(PyExc_ImportError, reason);
2888
Guido van Rossum32c575d1997-12-02 20:37:32 +00002889 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002890}
2891
2892#endif /* PYOS_OS2 */
2893
Guido van Rossum30a685f1991-06-27 15:51:29 +00002894/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002895 * This is called when the first 'import socket' is done,
2896 * via a table in config.c, if config.c is compiled with USE_SOCKET
2897 * defined.
2898 *
2899 * For MS_WINDOWS (which means any Windows variant), this module
2900 * is actually called "_socket", and there's a wrapper "socket.py"
2901 * which implements some missing functionality (such as makefile(),
2902 * dup() and fromfd()). The import of "_socket" may fail with an
2903 * ImportError exception if initialization of WINSOCK fails. When
2904 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2905 * scheduled to be made at exit time.
2906 *
2907 * For OS/2, this module is also called "_socket" and uses a wrapper
2908 * "socket.py" which implements that functionality that is missing
2909 * when PC operating systems don't put socket descriptors in the
2910 * operating system's filesystem layer.
2911 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002912
Guido van Rossum82a5c661998-07-07 20:45:43 +00002913static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00002914"Implementation module for socket operations. See the socket module\n\
2915for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00002916
2917static char sockettype_doc[] =
2918"A socket represents one endpoint of a network connection.\n\
2919\n\
2920Methods:\n\
2921\n\
2922accept() -- accept a connection, returning new socket and client address\n\
2923bind() -- bind the socket to a local address\n\
2924close() -- close the socket\n\
2925connect() -- connect the socket to a remote address\n\
2926connect_ex() -- connect, return an error code instead of an exception \n\
2927dup() -- return a new socket object identical to the current one (*)\n\
2928fileno() -- return underlying file descriptor\n\
2929getpeername() -- return remote address (*)\n\
2930getsockname() -- return local address\n\
2931getsockopt() -- get socket options\n\
2932listen() -- start listening for incoming connections\n\
2933makefile() -- return a file object corresponding tot the socket (*)\n\
2934recv() -- receive data\n\
2935recvfrom() -- receive data and sender's address\n\
2936send() -- send data\n\
2937sendto() -- send data to a given address\n\
2938setblocking() -- set or clear the blocking I/O flag\n\
2939setsockopt() -- set socket options\n\
2940shutdown() -- shut down traffic in one or both directions\n\
2941\n\
2942(*) not available on all platforms!)";
2943
Guido van Rossum3886bb61998-12-04 18:50:17 +00002944DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002945init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002946{
Guido van Rossum73624e91994-10-10 17:59:00 +00002947 PyObject *m, *d;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002948#ifdef RISCOS
2949 _kernel_swi_regs r;
2950 r.r[0]=0;
2951 _kernel_swi(0x43380, &r, &r);
2952 taskwindow = r.r[0];
2953#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00002954#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002955 if (!NTinit())
2956 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002957#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002958#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002959 if (!OS2init())
2960 return;
Fred Drakea136d492000-08-16 14:18:30 +00002961#endif /* __TOS_OS2__ */
2962#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002963#endif /* RISCOS */
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002964#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002965 PySSL_Type.ob_type = &PyType_Type;
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002966#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00002967 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00002968 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002969 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2970 if (PySocket_Error == NULL)
2971 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00002972 PyDict_SetItemString(d, "error", PySocket_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002973 PyH_Error = PyErr_NewException("socket.herror", PySocket_Error, NULL);
2974 if (PyH_Error == NULL)
2975 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00002976 PyDict_SetItemString(d, "herror", PyH_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002977 PyGAI_Error = PyErr_NewException("socket.gaierror", PySocket_Error,
2978 NULL);
2979 if (PyGAI_Error == NULL)
2980 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00002981 PyDict_SetItemString(d, "gaierror", PyGAI_Error);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002982#ifdef USE_SSL
2983 SSL_load_error_strings();
2984 SSLeay_add_ssl_algorithms();
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002985 PySSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2986 if (PySSLErrorObject == NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002987 return;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002988 PyDict_SetItemString(d, "sslerror", PySSLErrorObject);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002989 if (PyDict_SetItemString(d, "SSLType",
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002990 (PyObject *)&PySSL_Type) != 0)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002991 return;
Jeremy Hylton57ca8732001-10-11 00:00:17 +00002992 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
2993 SSL_ERROR_ZERO_RETURN);
2994 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
2995 SSL_ERROR_WANT_READ);
2996 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
2997 SSL_ERROR_WANT_WRITE);
2998 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
2999 SSL_ERROR_WANT_X509_LOOKUP);
3000 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
3001 SSL_ERROR_SYSCALL);
3002 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
3003 SSL_ERROR_SSL);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003004#endif /* USE_SSL */
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00003005 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00003006 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum91ba64d1997-06-02 22:18:09 +00003007 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00003008 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003009 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003010
3011 /* Address families (we only support AF_INET and AF_UNIX) */
3012#ifdef AF_UNSPEC
3013 insint(d, "AF_UNSPEC", AF_UNSPEC);
3014#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003015 insint(d, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003016#ifdef AF_INET6
3017 insint(d, "AF_INET6", AF_INET6);
3018#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00003019#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003020 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003021#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003022#ifdef AF_AX25
3023 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
3024#endif
3025#ifdef AF_IPX
3026 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
3027#endif
3028#ifdef AF_APPLETALK
3029 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
3030#endif
3031#ifdef AF_NETROM
3032 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
3033#endif
3034#ifdef AF_BRIDGE
3035 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
3036#endif
3037#ifdef AF_AAL5
3038 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
3039#endif
3040#ifdef AF_X25
3041 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
3042#endif
3043#ifdef AF_INET6
3044 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
3045#endif
3046#ifdef AF_ROSE
3047 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
3048#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003049#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00003050 insint(d, "AF_PACKET", AF_PACKET);
3051 insint(d, "PF_PACKET", PF_PACKET);
3052 insint(d, "PACKET_HOST", PACKET_HOST);
3053 insint(d, "PACKET_BROADCAST", PACKET_BROADCAST);
3054 insint(d, "PACKET_MULTICAST", PACKET_MULTICAST);
3055 insint(d, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3056 insint(d, "PACKET_OUTGOING", PACKET_OUTGOING);
3057 insint(d, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3058 insint(d, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003059#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003060
3061 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003062 insint(d, "SOCK_STREAM", SOCK_STREAM);
3063 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003064#ifndef __BEOS__
3065/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003066 insint(d, "SOCK_RAW", SOCK_RAW);
3067 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
3068 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003069#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003070
3071#ifdef SO_DEBUG
3072 insint(d, "SO_DEBUG", SO_DEBUG);
3073#endif
3074#ifdef SO_ACCEPTCONN
3075 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
3076#endif
3077#ifdef SO_REUSEADDR
3078 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
3079#endif
3080#ifdef SO_KEEPALIVE
3081 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
3082#endif
3083#ifdef SO_DONTROUTE
3084 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
3085#endif
3086#ifdef SO_BROADCAST
3087 insint(d, "SO_BROADCAST", SO_BROADCAST);
3088#endif
3089#ifdef SO_USELOOPBACK
3090 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
3091#endif
3092#ifdef SO_LINGER
3093 insint(d, "SO_LINGER", SO_LINGER);
3094#endif
3095#ifdef SO_OOBINLINE
3096 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
3097#endif
3098#ifdef SO_REUSEPORT
3099 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
3100#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003101#ifdef SO_SNDBUF
3102 insint(d, "SO_SNDBUF", SO_SNDBUF);
3103#endif
3104#ifdef SO_RCVBUF
3105 insint(d, "SO_RCVBUF", SO_RCVBUF);
3106#endif
3107#ifdef SO_SNDLOWAT
3108 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
3109#endif
3110#ifdef SO_RCVLOWAT
3111 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
3112#endif
3113#ifdef SO_SNDTIMEO
3114 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
3115#endif
3116#ifdef SO_RCVTIMEO
3117 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
3118#endif
3119#ifdef SO_ERROR
3120 insint(d, "SO_ERROR", SO_ERROR);
3121#endif
3122#ifdef SO_TYPE
3123 insint(d, "SO_TYPE", SO_TYPE);
3124#endif
3125
3126 /* Maximum number of connections for "listen" */
3127#ifdef SOMAXCONN
3128 insint(d, "SOMAXCONN", SOMAXCONN);
3129#else
3130 insint(d, "SOMAXCONN", 5); /* Common value */
3131#endif
3132
3133 /* Flags for send, recv */
3134#ifdef MSG_OOB
3135 insint(d, "MSG_OOB", MSG_OOB);
3136#endif
3137#ifdef MSG_PEEK
3138 insint(d, "MSG_PEEK", MSG_PEEK);
3139#endif
3140#ifdef MSG_DONTROUTE
3141 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
3142#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003143#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00003144 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003145#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003146#ifdef MSG_EOR
3147 insint(d, "MSG_EOR", MSG_EOR);
3148#endif
3149#ifdef MSG_TRUNC
3150 insint(d, "MSG_TRUNC", MSG_TRUNC);
3151#endif
3152#ifdef MSG_CTRUNC
3153 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
3154#endif
3155#ifdef MSG_WAITALL
3156 insint(d, "MSG_WAITALL", MSG_WAITALL);
3157#endif
3158#ifdef MSG_BTAG
3159 insint(d, "MSG_BTAG", MSG_BTAG);
3160#endif
3161#ifdef MSG_ETAG
3162 insint(d, "MSG_ETAG", MSG_ETAG);
3163#endif
3164
3165 /* Protocol level and numbers, usable for [gs]etsockopt */
3166#ifdef SOL_SOCKET
3167 insint(d, "SOL_SOCKET", SOL_SOCKET);
3168#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003169#ifdef SOL_IP
3170 insint(d, "SOL_IP", SOL_IP);
3171#else
3172 insint(d, "SOL_IP", 0);
3173#endif
3174#ifdef SOL_IPX
3175 insint(d, "SOL_IPX", SOL_IPX);
3176#endif
3177#ifdef SOL_AX25
3178 insint(d, "SOL_AX25", SOL_AX25);
3179#endif
3180#ifdef SOL_ATALK
3181 insint(d, "SOL_ATALK", SOL_ATALK);
3182#endif
3183#ifdef SOL_NETROM
3184 insint(d, "SOL_NETROM", SOL_NETROM);
3185#endif
3186#ifdef SOL_ROSE
3187 insint(d, "SOL_ROSE", SOL_ROSE);
3188#endif
3189#ifdef SOL_TCP
3190 insint(d, "SOL_TCP", SOL_TCP);
3191#else
3192 insint(d, "SOL_TCP", 6);
3193#endif
3194#ifdef SOL_UDP
3195 insint(d, "SOL_UDP", SOL_UDP);
3196#else
3197 insint(d, "SOL_UDP", 17);
3198#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003199#ifdef IPPROTO_IP
3200 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003201#else
3202 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003203#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003204#ifdef IPPROTO_HOPOPTS
3205 insint(d, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
3206#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003207#ifdef IPPROTO_ICMP
3208 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003209#else
3210 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003211#endif
3212#ifdef IPPROTO_IGMP
3213 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
3214#endif
3215#ifdef IPPROTO_GGP
3216 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
3217#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003218#ifdef IPPROTO_IPV4
3219 insint(d, "IPPROTO_IPV4", IPPROTO_IPV4);
3220#endif
3221#ifdef IPPROTO_IPIP
3222 insint(d, "IPPROTO_IPIP", IPPROTO_IPIP);
3223#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003224#ifdef IPPROTO_TCP
3225 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003226#else
3227 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003228#endif
3229#ifdef IPPROTO_EGP
3230 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
3231#endif
3232#ifdef IPPROTO_PUP
3233 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
3234#endif
3235#ifdef IPPROTO_UDP
3236 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003237#else
3238 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003239#endif
3240#ifdef IPPROTO_IDP
3241 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
3242#endif
3243#ifdef IPPROTO_HELLO
3244 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
3245#endif
3246#ifdef IPPROTO_ND
3247 insint(d, "IPPROTO_ND", IPPROTO_ND);
3248#endif
3249#ifdef IPPROTO_TP
3250 insint(d, "IPPROTO_TP", IPPROTO_TP);
3251#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003252#ifdef IPPROTO_IPV6
3253 insint(d, "IPPROTO_IPV6", IPPROTO_IPV6);
3254#endif
3255#ifdef IPPROTO_ROUTING
3256 insint(d, "IPPROTO_ROUTING", IPPROTO_ROUTING);
3257#endif
3258#ifdef IPPROTO_FRAGMENT
3259 insint(d, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
3260#endif
3261#ifdef IPPROTO_RSVP
3262 insint(d, "IPPROTO_RSVP", IPPROTO_RSVP);
3263#endif
3264#ifdef IPPROTO_GRE
3265 insint(d, "IPPROTO_GRE", IPPROTO_GRE);
3266#endif
3267#ifdef IPPROTO_ESP
3268 insint(d, "IPPROTO_ESP", IPPROTO_ESP);
3269#endif
3270#ifdef IPPROTO_AH
3271 insint(d, "IPPROTO_AH", IPPROTO_AH);
3272#endif
3273#ifdef IPPROTO_MOBILE
3274 insint(d, "IPPROTO_MOBILE", IPPROTO_MOBILE);
3275#endif
3276#ifdef IPPROTO_ICMPV6
3277 insint(d, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
3278#endif
3279#ifdef IPPROTO_NONE
3280 insint(d, "IPPROTO_NONE", IPPROTO_NONE);
3281#endif
3282#ifdef IPPROTO_DSTOPTS
3283 insint(d, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
3284#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003285#ifdef IPPROTO_XTP
3286 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
3287#endif
3288#ifdef IPPROTO_EON
3289 insint(d, "IPPROTO_EON", IPPROTO_EON);
3290#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003291#ifdef IPPROTO_PIM
3292 insint(d, "IPPROTO_PIM", IPPROTO_PIM);
3293#endif
3294#ifdef IPPROTO_IPCOMP
3295 insint(d, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
3296#endif
3297#ifdef IPPROTO_VRRP
3298 insint(d, "IPPROTO_VRRP", IPPROTO_VRRP);
3299#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003300#ifdef IPPROTO_BIP
3301 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
3302#endif
3303/**/
3304#ifdef IPPROTO_RAW
3305 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003306#else
3307 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003308#endif
3309#ifdef IPPROTO_MAX
3310 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
3311#endif
3312
3313 /* Some port configuration */
3314#ifdef IPPORT_RESERVED
3315 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
3316#else
3317 insint(d, "IPPORT_RESERVED", 1024);
3318#endif
3319#ifdef IPPORT_USERRESERVED
3320 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
3321#else
3322 insint(d, "IPPORT_USERRESERVED", 5000);
3323#endif
3324
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003325 /* Some reserved IP v.4 addresses */
3326#ifdef INADDR_ANY
3327 insint(d, "INADDR_ANY", INADDR_ANY);
3328#else
3329 insint(d, "INADDR_ANY", 0x00000000);
3330#endif
3331#ifdef INADDR_BROADCAST
3332 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
3333#else
3334 insint(d, "INADDR_BROADCAST", 0xffffffff);
3335#endif
3336#ifdef INADDR_LOOPBACK
3337 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
3338#else
3339 insint(d, "INADDR_LOOPBACK", 0x7F000001);
3340#endif
3341#ifdef INADDR_UNSPEC_GROUP
3342 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
3343#else
3344 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
3345#endif
3346#ifdef INADDR_ALLHOSTS_GROUP
3347 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
3348#else
3349 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
3350#endif
3351#ifdef INADDR_MAX_LOCAL_GROUP
3352 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
3353#else
3354 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
3355#endif
3356#ifdef INADDR_NONE
3357 insint(d, "INADDR_NONE", INADDR_NONE);
3358#else
3359 insint(d, "INADDR_NONE", 0xffffffff);
3360#endif
3361
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003362 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003363#ifdef IP_OPTIONS
3364 insint(d, "IP_OPTIONS", IP_OPTIONS);
3365#endif
3366#ifdef IP_HDRINCL
3367 insint(d, "IP_HDRINCL", IP_HDRINCL);
3368#endif
3369#ifdef IP_TOS
3370 insint(d, "IP_TOS", IP_TOS);
3371#endif
3372#ifdef IP_TTL
3373 insint(d, "IP_TTL", IP_TTL);
3374#endif
3375#ifdef IP_RECVOPTS
3376 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
3377#endif
3378#ifdef IP_RECVRETOPTS
3379 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
3380#endif
3381#ifdef IP_RECVDSTADDR
3382 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
3383#endif
3384#ifdef IP_RETOPTS
3385 insint(d, "IP_RETOPTS", IP_RETOPTS);
3386#endif
3387#ifdef IP_MULTICAST_IF
3388 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
3389#endif
3390#ifdef IP_MULTICAST_TTL
3391 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
3392#endif
3393#ifdef IP_MULTICAST_LOOP
3394 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
3395#endif
3396#ifdef IP_ADD_MEMBERSHIP
3397 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
3398#endif
3399#ifdef IP_DROP_MEMBERSHIP
3400 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
3401#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003402#ifdef IP_DEFAULT_MULTICAST_TTL
3403 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
3404#endif
3405#ifdef IP_DEFAULT_MULTICAST_LOOP
3406 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
3407#endif
3408#ifdef IP_MAX_MEMBERSHIPS
3409 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
3410#endif
3411
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003412 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3413#ifdef IPV6_JOIN_GROUP
3414 insint(d, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
3415#endif
3416#ifdef IPV6_LEAVE_GROUP
3417 insint(d, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
3418#endif
3419#ifdef IPV6_MULTICAST_HOPS
3420 insint(d, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
3421#endif
3422#ifdef IPV6_MULTICAST_IF
3423 insint(d, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
3424#endif
3425#ifdef IPV6_MULTICAST_LOOP
3426 insint(d, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
3427#endif
3428#ifdef IPV6_UNICAST_HOPS
3429 insint(d, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
3430#endif
3431
Guido van Rossum09be4091999-08-09 14:40:40 +00003432 /* TCP options */
3433#ifdef TCP_NODELAY
3434 insint(d, "TCP_NODELAY", TCP_NODELAY);
3435#endif
3436#ifdef TCP_MAXSEG
3437 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
3438#endif
3439
3440 /* IPX options */
3441#ifdef IPX_TYPE
3442 insint(d, "IPX_TYPE", IPX_TYPE);
3443#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003444
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003445 /* get{addr,name}info parameters */
3446#ifdef EAI_ADDRFAMILY
3447 insint(d, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
3448#endif
3449#ifdef EAI_AGAIN
3450 insint(d, "EAI_AGAIN", EAI_AGAIN);
3451#endif
3452#ifdef EAI_BADFLAGS
3453 insint(d, "EAI_BADFLAGS", EAI_BADFLAGS);
3454#endif
3455#ifdef EAI_FAIL
3456 insint(d, "EAI_FAIL", EAI_FAIL);
3457#endif
3458#ifdef EAI_FAMILY
3459 insint(d, "EAI_FAMILY", EAI_FAMILY);
3460#endif
3461#ifdef EAI_MEMORY
3462 insint(d, "EAI_MEMORY", EAI_MEMORY);
3463#endif
3464#ifdef EAI_NODATA
3465 insint(d, "EAI_NODATA", EAI_NODATA);
3466#endif
3467#ifdef EAI_NONAME
3468 insint(d, "EAI_NONAME", EAI_NONAME);
3469#endif
3470#ifdef EAI_SERVICE
3471 insint(d, "EAI_SERVICE", EAI_SERVICE);
3472#endif
3473#ifdef EAI_SOCKTYPE
3474 insint(d, "EAI_SOCKTYPE", EAI_SOCKTYPE);
3475#endif
3476#ifdef EAI_SYSTEM
3477 insint(d, "EAI_SYSTEM", EAI_SYSTEM);
3478#endif
3479#ifdef EAI_BADHINTS
3480 insint(d, "EAI_BADHINTS", EAI_BADHINTS);
3481#endif
3482#ifdef EAI_PROTOCOL
3483 insint(d, "EAI_PROTOCOL", EAI_PROTOCOL);
3484#endif
3485#ifdef EAI_MAX
3486 insint(d, "EAI_MAX", EAI_MAX);
3487#endif
3488#ifdef AI_PASSIVE
3489 insint(d, "AI_PASSIVE", AI_PASSIVE);
3490#endif
3491#ifdef AI_CANONNAME
3492 insint(d, "AI_CANONNAME", AI_CANONNAME);
3493#endif
3494#ifdef AI_NUMERICHOST
3495 insint(d, "AI_NUMERICHOST", AI_NUMERICHOST);
3496#endif
3497#ifdef AI_MASK
3498 insint(d, "AI_MASK", AI_MASK);
3499#endif
3500#ifdef AI_ALL
3501 insint(d, "AI_ALL", AI_ALL);
3502#endif
3503#ifdef AI_V4MAPPED_CFG
3504 insint(d, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
3505#endif
3506#ifdef AI_ADDRCONFIG
3507 insint(d, "AI_ADDRCONFIG", AI_ADDRCONFIG);
3508#endif
3509#ifdef AI_V4MAPPED
3510 insint(d, "AI_V4MAPPED", AI_V4MAPPED);
3511#endif
3512#ifdef AI_DEFAULT
3513 insint(d, "AI_DEFAULT", AI_DEFAULT);
3514#endif
3515#ifdef NI_MAXHOST
3516 insint(d, "NI_MAXHOST", NI_MAXHOST);
3517#endif
3518#ifdef NI_MAXSERV
3519 insint(d, "NI_MAXSERV", NI_MAXSERV);
3520#endif
3521#ifdef NI_NOFQDN
3522 insint(d, "NI_NOFQDN", NI_NOFQDN);
3523#endif
3524#ifdef NI_NUMERICHOST
3525 insint(d, "NI_NUMERICHOST", NI_NUMERICHOST);
3526#endif
3527#ifdef NI_NAMEREQD
3528 insint(d, "NI_NAMEREQD", NI_NAMEREQD);
3529#endif
3530#ifdef NI_NUMERICSERV
3531 insint(d, "NI_NUMERICSERV", NI_NUMERICSERV);
3532#endif
3533#ifdef NI_DGRAM
3534 insint(d, "NI_DGRAM", NI_DGRAM);
3535#endif
3536
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003537 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003538#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003539 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003540#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003541}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003542
3543/* Simplistic emulation code for inet_pton that only works for IPv4 */
3544#ifndef HAVE_INET_PTON
Martin v. Löwisa2ca1ae2001-06-24 21:35:43 +00003545int
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003546inet_pton (int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003547{
3548 if(af == AF_INET){
3549 long packed_addr;
3550#ifdef USE_GUSI1
3551 packed_addr = (long)inet_addr(src).s_addr;
3552#else
3553 packed_addr = inet_addr(src);
3554#endif
3555 if (packed_addr == INADDR_NONE)
3556 return 0;
3557 memcpy(dst, &packed_addr, 4);
3558 return 1;
3559 }
3560 /* Should set errno to EAFNOSUPPORT */
3561 return -1;
3562}
3563
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003564const char *
3565inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003566{
3567 if (af == AF_INET) {
3568 struct in_addr packed_addr;
3569 if (size < 16)
3570 /* Should set errno to ENOSPC. */
3571 return NULL;
3572 memcpy(&packed_addr, src, sizeof(packed_addr));
3573 return strncpy(dst, inet_ntoa(packed_addr), size);
3574 }
3575 /* Should set errno to EAFNOSUPPORT */
3576 return NULL;
3577}
3578#endif