blob: f8f522b9b957cfed3e6c6b1a25dc9fac50cb4374 [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
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000491typedef struct {
492 PyObject_HEAD
493 PySocketSockObject *Socket; /* Socket on which we're layered */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000494 SSL_CTX* ctx;
495 SSL* ssl;
496 X509* server_cert;
497 BIO* sbio;
498 char server[256];
499 char issuer[256];
500
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000501} PySSLObject;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000502
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000503staticforward PyTypeObject PySSL_Type;
504staticforward PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args);
505staticforward PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000506
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +0000507#define PySSLObject_Check(v) ((v)->ob_type == &PySSL_Type)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +0000508
509#endif /* USE_SSL */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000510
Guido van Rossum30a685f1991-06-27 15:51:29 +0000511/* A forward reference to the Socktype type object.
512 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000513 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000514 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000515
Guido van Rossum73624e91994-10-10 17:59:00 +0000516staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000517
Guido van Rossum30a685f1991-06-27 15:51:29 +0000518
519/* Create a new socket object.
520 This just creates the object and initializes it.
521 If the creation fails, return NULL and set an exception (implicit
522 in NEWOBJ()). */
523
Guido van Rossum73624e91994-10-10 17:59:00 +0000524static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000525PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000526{
Guido van Rossum48a680c2001-03-02 06:34:14 +0000527#ifdef RISCOS
528 int block = 1;
529#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000530 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000531 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000532 s = PyObject_New(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000533 if (s != NULL) {
534 s->sock_fd = fd;
535 s->sock_family = family;
536 s->sock_type = type;
537 s->sock_proto = proto;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000538#ifdef RISCOS
539 if(taskwindow) {
540 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
541 }
542#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000543 }
544 return s;
545}
546
Guido van Rossum30a685f1991-06-27 15:51:29 +0000547
Guido van Rossum48a680c2001-03-02 06:34:14 +0000548/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000549 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000550#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000551PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000552#endif
553
554
Guido van Rossum30a685f1991-06-27 15:51:29 +0000555/* Convert a string specifying a host name or one of a few symbolic
556 names to a numeric IP address. This usually calls gethostbyname()
557 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000558 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000559 an error occurred; then an exception is raised. */
560
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000561static int
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000562setipaddr(char* name, struct sockaddr * addr_ret, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000563{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000564 struct addrinfo hints, *res;
565 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000566
Guido van Rossuma376cc51996-12-05 23:43:35 +0000567 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000568 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000569 int siz;
570 memset(&hints, 0, sizeof(hints));
571 hints.ai_family = af;
572 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
573 hints.ai_flags = AI_PASSIVE;
574 error = getaddrinfo(NULL, "0", &hints, &res);
575 if (error) {
576 PyGAI_Err(error);
577 return -1;
578 }
579 switch (res->ai_family) {
580 case AF_INET:
581 siz = 4;
582 break;
583#ifdef INET6
584 case AF_INET6:
585 siz = 16;
586 break;
587#endif
588 default:
589 freeaddrinfo(res);
590 PyErr_SetString(PySocket_Error,
591 "unsupported address family");
592 return -1;
593 }
594 if (res->ai_next) {
595 PyErr_SetString(PySocket_Error,
596 "wildcard resolved to multiple address");
597 return -1;
598 }
599 memcpy(addr_ret, res->ai_addr, res->ai_addrlen);
600 freeaddrinfo(res);
601 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000602 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000603 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000604 struct sockaddr_in *sin;
605 if (af != PF_INET && af != PF_UNSPEC) {
606 PyErr_SetString(PySocket_Error,
607 "address family mismatched");
608 return -1;
609 }
610 sin = (struct sockaddr_in *)addr_ret;
611 memset((void *) sin, '\0', sizeof(*sin));
612 sin->sin_family = AF_INET;
613#ifdef HAVE_SOCKADDR_SA_LEN
614 sin->sin_len = sizeof(*sin);
615#endif
616 sin->sin_addr.s_addr = INADDR_BROADCAST;
617 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000618 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000619 memset(&hints, 0, sizeof(hints));
620 hints.ai_family = af;
621 error = getaddrinfo(name, NULL, &hints, &res);
622 if (error) {
623 PyGAI_Err(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000624 return -1;
625 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000626 memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
627 freeaddrinfo(res);
628 switch (addr_ret->sa_family) {
629 case AF_INET:
630 return 4;
631#ifdef INET6
632 case AF_INET6:
633 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000634#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000635 default:
636 PyErr_SetString(PySocket_Error, "unknown address family");
637 return -1;
638 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000639}
640
Guido van Rossum30a685f1991-06-27 15:51:29 +0000641
Guido van Rossum30a685f1991-06-27 15:51:29 +0000642/* Create a string object representing an IP address.
643 This is always a string of the form 'dd.dd.dd.dd' (with variable
644 size numbers). */
645
Guido van Rossum73624e91994-10-10 17:59:00 +0000646static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000647makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000648{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000649 char buf[NI_MAXHOST];
650 int error;
651
652 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
653 NI_NUMERICHOST);
654 if (error) {
655 PyGAI_Err(error);
656 return NULL;
657 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000658 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000659}
660
661
662/* Create an object representing the given socket address,
663 suitable for passing it back to bind(), connect() etc.
664 The family field of the sockaddr structure is inspected
665 to determine what kind of address it really is. */
666
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000667/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000668static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000669makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000670{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000671 if (addrlen == 0) {
672 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000673 Py_INCREF(Py_None);
674 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000675 }
676
Guido van Rossumbcc20741998-08-04 22:53:56 +0000677#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000678 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000679 addr->sa_family = AF_INET;
680#endif
681
Guido van Rossum30a685f1991-06-27 15:51:29 +0000682 switch (addr->sa_family) {
683
684 case AF_INET:
685 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000686 struct sockaddr_in *a;
687 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000688 PyObject *ret = NULL;
689 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000690 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000691 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
692 Py_DECREF(addrobj);
693 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000694 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000695 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000696
Guido van Rossumb6775db1994-08-01 11:34:53 +0000697#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000698 case AF_UNIX:
699 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000700 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000701 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000702 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000703#endif /* AF_UNIX */
704
705#ifdef INET6
706 case AF_INET6:
707 {
708 struct sockaddr_in6 *a;
709 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
710 PyObject *ret = NULL;
711 if (addrobj) {
712 a = (struct sockaddr_in6 *)addr;
713 ret = Py_BuildValue("Oiii", addrobj, ntohs(a->sin6_port),
714 a->sin6_flowinfo, a->sin6_scope_id);
715 Py_DECREF(addrobj);
716 }
717 return ret;
718 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000719#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000720
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000721#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000722 case AF_PACKET:
723 {
724 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
725 char *ifname = "";
726 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000727 /* need to look up interface name give index */
728 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000729 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000730 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000731 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000732 }
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000733 return Py_BuildValue("shbhs#", ifname, ntohs(a->sll_protocol),
Guido van Rossum48a680c2001-03-02 06:34:14 +0000734 a->sll_pkttype, a->sll_hatype,
735 a->sll_addr, a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000736 }
737#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000738
Guido van Rossum30a685f1991-06-27 15:51:29 +0000739 /* More cases here... */
740
741 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000742 /* If we don't know the address family, don't raise an
743 exception -- return it as a tuple. */
744 return Py_BuildValue("is#",
745 addr->sa_family,
746 addr->sa_data,
747 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000748
Guido van Rossum30a685f1991-06-27 15:51:29 +0000749 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000750}
751
Guido van Rossum30a685f1991-06-27 15:51:29 +0000752
753/* Parse a socket address argument according to the socket object's
754 address family. Return 1 if the address was in the proper format,
755 0 of not. The address is returned through addr_ret, its length
756 through len_ret. */
757
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000758static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000759getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000760 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000761{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000762 switch (s->sock_family) {
763
Guido van Rossumb6775db1994-08-01 11:34:53 +0000764#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000765 case AF_UNIX:
766 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000767 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000768 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000769 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000770 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000771 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000772 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000773 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000774 PyErr_SetString(PySocket_Error,
775 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000776 return 0;
777 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000778 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000779 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000780 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000781 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000782 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000783 return 1;
784 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000785#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000786
Guido van Rossum30a685f1991-06-27 15:51:29 +0000787 case AF_INET:
788 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000789 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000790 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000791 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000792 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000793 if (!PyTuple_Check(args)) {
794 PyErr_Format(PyExc_TypeError,
795 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
796 args->ob_type->tp_name);
797 return 0;
798 }
799 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000800 return 0;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000801 if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000802 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000803 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000804 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000805 *addr_ret = (struct sockaddr *) addr;
806 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000807 return 1;
808 }
809
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000810#ifdef INET6
811 case AF_INET6:
812 {
813 struct sockaddr_in6* addr;
814 char *host;
815 int port, flowinfo, scope_id;
816 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
817 flowinfo = scope_id = 0;
818 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
819 &scope_id)) {
820 return 0;
821 }
822 if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
823 return 0;
824 addr->sin6_family = s->sock_family;
825 addr->sin6_port = htons((short)port);
826 addr->sin6_flowinfo = flowinfo;
827 addr->sin6_scope_id = scope_id;
828 *addr_ret = (struct sockaddr *) addr;
829 *len_ret = sizeof *addr;
830 return 1;
831 }
832#endif
833
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000834#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000835 case AF_PACKET:
836 {
837 struct sockaddr_ll* addr;
838 struct ifreq ifr;
839 char *interfaceName;
840 int protoNumber;
841 int hatype = 0;
842 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000843 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000844
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000845 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
846 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000847 return 0;
848 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
849 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000850 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
851 PyErr_SetFromErrno(PySocket_Error);
Jeremy Hylton22308652001-02-02 03:23:09 +0000852 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000853 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000854 addr = &(s->sock_addr.ll);
855 addr->sll_family = AF_PACKET;
856 addr->sll_protocol = htons((short)protoNumber);
857 addr->sll_ifindex = ifr.ifr_ifindex;
858 addr->sll_pkttype = pkttype;
859 addr->sll_hatype = hatype;
860 *addr_ret = (struct sockaddr *) addr;
861 *len_ret = sizeof *addr;
862 return 1;
863 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000864#endif
865
Guido van Rossum30a685f1991-06-27 15:51:29 +0000866 /* More cases here... */
867
868 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000869 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000870 return 0;
871
872 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000873}
874
Guido van Rossum30a685f1991-06-27 15:51:29 +0000875
Guido van Rossum48a680c2001-03-02 06:34:14 +0000876/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000877 Return 1 if the family is known, 0 otherwise. The length is returned
878 through len_ret. */
879
880static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000881getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000882{
883 switch (s->sock_family) {
884
Guido van Rossumb6775db1994-08-01 11:34:53 +0000885#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000886 case AF_UNIX:
887 {
888 *len_ret = sizeof (struct sockaddr_un);
889 return 1;
890 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000891#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000892
893 case AF_INET:
894 {
895 *len_ret = sizeof (struct sockaddr_in);
896 return 1;
897 }
898
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000899#ifdef INET6
900 case AF_INET6:
901 {
902 *len_ret = sizeof (struct sockaddr_in6);
903 return 1;
904 }
905#endif
906
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000907#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000908 case AF_PACKET:
909 {
910 *len_ret = sizeof (struct sockaddr_ll);
911 return 1;
912 }
913#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000914
Guido van Rossum710e1df1992-06-12 10:39:36 +0000915 /* More cases here... */
916
917 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000918 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000919 return 0;
920
921 }
922}
923
924
Guido van Rossum30a685f1991-06-27 15:51:29 +0000925/* s.accept() method */
926
Guido van Rossum73624e91994-10-10 17:59:00 +0000927static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000928PySocketSock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000929{
930 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000931 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000932 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000933 PyObject *sock = NULL;
934 PyObject *addr = NULL;
935 PyObject *res = NULL;
936
Guido van Rossum710e1df1992-06-12 10:39:36 +0000937 if (!getsockaddrlen(s, &addrlen))
938 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000939 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000940 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000941 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000942 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000943#ifdef MS_WINDOWS
944 if (newfd == INVALID_SOCKET)
945#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000946 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000947#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000948 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000949
Guido van Rossum30a685f1991-06-27 15:51:29 +0000950 /* Create the new object with unspecified family,
951 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000952 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000953 s->sock_family,
954 s->sock_type,
955 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000956 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000957 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000958 goto finally;
959 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000960 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000961 addrlen);
962 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +0000963 goto finally;
964
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000965 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000966
967 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000968 Py_XDECREF(sock);
969 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000970 return res;
971}
972
Guido van Rossum82a5c661998-07-07 20:45:43 +0000973static char accept_doc[] =
974"accept() -> (socket object, address info)\n\
975\n\
976Wait for an incoming connection. Return a new socket representing the\n\
977connection, and the address of the client. For IP sockets, the address\n\
978info is a pair (hostaddr, port).";
979
Guido van Rossum30a685f1991-06-27 15:51:29 +0000980
Guido van Rossume4485b01994-09-07 14:32:49 +0000981/* s.setblocking(1 | 0) method */
982
Guido van Rossum73624e91994-10-10 17:59:00 +0000983static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000984PySocketSock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +0000985{
986 int block;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000987#ifndef RISCOS
Guido van Rossum644a12b1997-04-09 19:24:53 +0000988#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000989 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000990#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000991#endif
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000992 block = PyInt_AsLong(arg);
993 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +0000994 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000995 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000996#ifdef __BEOS__
997 block = !block;
998 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
999 (void *)(&block), sizeof( int ) );
1000#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00001001#ifndef RISCOS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001002#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001003#ifdef PYOS_OS2
1004 block = !block;
1005 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
1006#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +00001007 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
1008 if (block)
1009 delay_flag &= (~O_NDELAY);
1010 else
1011 delay_flag |= O_NDELAY;
1012 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001013#endif /* !PYOS_OS2 */
1014#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001015 block = !block;
1016 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001017#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +00001018#endif /* __BEOS__ */
Guido van Rossum48a680c2001-03-02 06:34:14 +00001019#endif /* RISCOS */
Guido van Rossum73624e91994-10-10 17:59:00 +00001020 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +00001021
Guido van Rossum73624e91994-10-10 17:59:00 +00001022 Py_INCREF(Py_None);
1023 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001024}
Guido van Rossume4485b01994-09-07 14:32:49 +00001025
Guido van Rossum82a5c661998-07-07 20:45:43 +00001026static char setblocking_doc[] =
1027"setblocking(flag)\n\
1028\n\
1029Set the socket to blocking (flag is true) or non-blocking (false).\n\
1030This uses the FIONBIO ioctl with the O_NDELAY flag.";
1031
Guido van Rossume4485b01994-09-07 14:32:49 +00001032
Guido van Rossum48a680c2001-03-02 06:34:14 +00001033#ifdef RISCOS
1034/* s.sleeptaskw(1 | 0) method */
1035
1036static PyObject *
1037PySocketSock_sleeptaskw(PySocketSockObject *s,PyObject *args)
1038{
1039 int block;
1040 int delay_flag;
1041 if (!PyArg_GetInt(args, &block))
1042 return NULL;
1043 Py_BEGIN_ALLOW_THREADS
1044 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1045 Py_END_ALLOW_THREADS
1046
1047 Py_INCREF(Py_None);
1048 return Py_None;
1049}
1050static char sleeptaskw_doc[] =
1051"sleeptaskw(flag)\n\
1052\n\
1053Allow sleeps in taskwindows.";
1054#endif
1055
1056
Guido van Rossumaee08791992-09-08 09:05:33 +00001057/* s.setsockopt() method.
1058 With an integer third argument, sets an integer option.
1059 With a string third argument, sets an option from a buffer;
1060 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001061
Guido van Rossum73624e91994-10-10 17:59:00 +00001062static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001063PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001064{
1065 int level;
1066 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001067 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001068 char *buf;
1069 int buflen;
1070 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001071
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001072 if (PyArg_ParseTuple(args, "iii:setsockopt",
1073 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001074 buf = (char *) &flag;
1075 buflen = sizeof flag;
1076 }
1077 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001078 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001079 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1080 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001081 return NULL;
1082 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001083 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001084 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001085 return PySocket_Err();
1086 Py_INCREF(Py_None);
1087 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001088}
1089
Guido van Rossum82a5c661998-07-07 20:45:43 +00001090static char setsockopt_doc[] =
1091"setsockopt(level, option, value)\n\
1092\n\
1093Set a socket option. See the Unix manual for level and option.\n\
1094The value argument can either be an integer or a string.";
1095
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001096
Guido van Rossumaee08791992-09-08 09:05:33 +00001097/* s.getsockopt() method.
1098 With two arguments, retrieves an integer option.
1099 With a third integer argument, retrieves a string buffer of that size;
1100 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001101
Guido van Rossum73624e91994-10-10 17:59:00 +00001102static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001103PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001104{
1105 int level;
1106 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001107 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001108 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001109 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001110
Guido van Rossumbcc20741998-08-04 22:53:56 +00001111#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001112 /* We have incomplete socket support. */
1113 PyErr_SetString(PySocket_Error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001114 return NULL;
1115#else
1116
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001117 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1118 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001119 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001120
Guido van Rossumbe32c891996-06-20 16:25:29 +00001121 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001122 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001123 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001124 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001125 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001126 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001127 return PySocket_Err();
1128 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001129 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001130 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001131 PyErr_SetString(PySocket_Error,
1132 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001133 return NULL;
1134 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001135 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001136 if (buf == NULL)
1137 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001138 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001139 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001140 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001141 Py_DECREF(buf);
1142 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +00001143 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001144 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001145 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001146#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001147}
1148
Guido van Rossum82a5c661998-07-07 20:45:43 +00001149static char getsockopt_doc[] =
1150"getsockopt(level, option[, buffersize]) -> value\n\
1151\n\
1152Get a socket option. See the Unix manual for level and option.\n\
1153If a nonzero buffersize argument is given, the return value is a\n\
1154string of that length; otherwise it is an integer.";
1155
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001156
Fred Drake728819a2000-07-01 03:40:12 +00001157/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001158
Guido van Rossum73624e91994-10-10 17:59:00 +00001159static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001160PySocketSock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001161{
1162 struct sockaddr *addr;
1163 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001164 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001165
Fred Drake728819a2000-07-01 03:40:12 +00001166 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001167 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001168 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001169 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001170 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001171 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001172 return PySocket_Err();
1173 Py_INCREF(Py_None);
1174 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001175}
1176
Guido van Rossum82a5c661998-07-07 20:45:43 +00001177static char bind_doc[] =
1178"bind(address)\n\
1179\n\
1180Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001181pair (host, port); the host must refer to the local host. For raw packet\n\
1182sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001183
Guido van Rossum30a685f1991-06-27 15:51:29 +00001184
1185/* s.close() method.
1186 Set the file descriptor to -1 so operations tried subsequently
1187 will surely fail. */
1188
Guido van Rossum73624e91994-10-10 17:59:00 +00001189static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001190PySocketSock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001191{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001192 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001193
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001194 if ((fd = s->sock_fd) != -1) {
1195 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001196 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001197 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001198 Py_END_ALLOW_THREADS
1199 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001200 Py_INCREF(Py_None);
1201 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001202}
1203
Guido van Rossum82a5c661998-07-07 20:45:43 +00001204static char close_doc[] =
1205"close()\n\
1206\n\
1207Close the socket. It cannot be used after this call.";
1208
Guido van Rossum30a685f1991-06-27 15:51:29 +00001209
Fred Drake728819a2000-07-01 03:40:12 +00001210/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001211
Guido van Rossum73624e91994-10-10 17:59:00 +00001212static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001213PySocketSock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001214{
1215 struct sockaddr *addr;
1216 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001217 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001218
Fred Drake728819a2000-07-01 03:40:12 +00001219 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001220 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001221 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001222 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001223 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001224 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001225 return PySocket_Err();
1226 Py_INCREF(Py_None);
1227 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001228}
1229
Guido van Rossum82a5c661998-07-07 20:45:43 +00001230static char connect_doc[] =
1231"connect(address)\n\
1232\n\
1233Connect the socket to a remote address. For IP sockets, the address\n\
1234is a pair (host, port).";
1235
Guido van Rossum30a685f1991-06-27 15:51:29 +00001236
Fred Drake728819a2000-07-01 03:40:12 +00001237/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001238
1239static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001240PySocketSock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001241{
1242 struct sockaddr *addr;
1243 int addrlen;
1244 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001245
Fred Drake728819a2000-07-01 03:40:12 +00001246 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001247 return NULL;
1248 Py_BEGIN_ALLOW_THREADS
1249 res = connect(s->sock_fd, addr, addrlen);
1250 Py_END_ALLOW_THREADS
1251 if (res != 0)
1252 res = errno;
1253 return PyInt_FromLong((long) res);
1254}
1255
Guido van Rossum82a5c661998-07-07 20:45:43 +00001256static char connect_ex_doc[] =
1257"connect_ex(address)\n\
1258\n\
1259This is like connect(address), but returns an error code (the errno value)\n\
1260instead of raising an exception when an error occurs.";
1261
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001262
Guido van Rossumed233a51992-06-23 09:07:03 +00001263/* s.fileno() method */
1264
Guido van Rossum73624e91994-10-10 17:59:00 +00001265static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001266PySocketSock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001267{
Fred Drakea04eaad2000-06-30 02:46:07 +00001268#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001269 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001270#else
1271 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1272#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001273}
1274
Guido van Rossum82a5c661998-07-07 20:45:43 +00001275static char fileno_doc[] =
1276"fileno() -> integer\n\
1277\n\
1278Return the integer file descriptor of the socket.";
1279
Guido van Rossumed233a51992-06-23 09:07:03 +00001280
Guido van Rossumbe32c891996-06-20 16:25:29 +00001281#ifndef NO_DUP
1282/* s.dup() method */
1283
1284static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001285PySocketSock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001286{
Fred Drakea04eaad2000-06-30 02:46:07 +00001287 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001288 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001289
Guido van Rossumbe32c891996-06-20 16:25:29 +00001290 newfd = dup(s->sock_fd);
1291 if (newfd < 0)
1292 return PySocket_Err();
1293 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001294 s->sock_family,
1295 s->sock_type,
1296 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001297 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001298 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001299 return sock;
1300}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001301
1302static char dup_doc[] =
1303"dup() -> socket object\n\
1304\n\
1305Return a new socket object connected to the same system resource.";
1306
Guido van Rossumbe32c891996-06-20 16:25:29 +00001307#endif
1308
1309
Guido van Rossumc89705d1992-11-26 08:54:07 +00001310/* s.getsockname() method */
1311
Guido van Rossum73624e91994-10-10 17:59:00 +00001312static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001313PySocketSock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001314{
1315 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001316 int res;
1317 socklen_t addrlen;
1318
Guido van Rossumc89705d1992-11-26 08:54:07 +00001319 if (!getsockaddrlen(s, &addrlen))
1320 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001321 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001322 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001323 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001324 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001325 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001326 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001327 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001328}
1329
Guido van Rossum82a5c661998-07-07 20:45:43 +00001330static char getsockname_doc[] =
1331"getsockname() -> address info\n\
1332\n\
1333Return the address of the local endpoint. For IP sockets, the address\n\
1334info is a pair (hostaddr, port).";
1335
Guido van Rossumc89705d1992-11-26 08:54:07 +00001336
Guido van Rossumb6775db1994-08-01 11:34:53 +00001337#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001338/* s.getpeername() method */
1339
Guido van Rossum73624e91994-10-10 17:59:00 +00001340static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001341PySocketSock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001342{
1343 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001344 int res;
1345 socklen_t addrlen;
1346
Guido van Rossumc89705d1992-11-26 08:54:07 +00001347 if (!getsockaddrlen(s, &addrlen))
1348 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001349 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001350 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001351 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001352 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001353 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001354 return PySocket_Err();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001355 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001356}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001357
1358static char getpeername_doc[] =
1359"getpeername() -> address info\n\
1360\n\
1361Return the address of the remote endpoint. For IP sockets, the address\n\
1362info is a pair (hostaddr, port).";
1363
Guido van Rossumb6775db1994-08-01 11:34:53 +00001364#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001365
1366
Guido van Rossum30a685f1991-06-27 15:51:29 +00001367/* s.listen(n) method */
1368
Guido van Rossum73624e91994-10-10 17:59:00 +00001369static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001370PySocketSock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001371{
1372 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001373 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001374
1375 backlog = PyInt_AsLong(arg);
1376 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001377 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001378 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001379 if (backlog < 1)
1380 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001381 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001382 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001383 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001384 return PySocket_Err();
1385 Py_INCREF(Py_None);
1386 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001387}
1388
Guido van Rossum82a5c661998-07-07 20:45:43 +00001389static char listen_doc[] =
1390"listen(backlog)\n\
1391\n\
1392Enable a server to accept connections. The backlog argument must be at\n\
1393least 1; it specifies the number of unaccepted connection that the system\n\
1394will allow before refusing new connections.";
1395
1396
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001397#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001398/* s.makefile(mode) method.
1399 Create a new open file object referring to a dupped version of
1400 the socket's file descriptor. (The dup() call is necessary so
1401 that the open file and socket objects may be closed independent
1402 of each other.)
1403 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1404
Guido van Rossum73624e91994-10-10 17:59:00 +00001405static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001406PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001407{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001408 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001409 char *mode = "r";
1410 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001411#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001412 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001413#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001414 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001415#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001416 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001417 PyObject *f;
1418
Guido van Rossum43713e52000-02-29 13:59:29 +00001419 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001420 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001421#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001422 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1423 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001424#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001425 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001426#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001427 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001428 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001429 SOCKETCLOSE(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001430 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +00001431 }
1432 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1433 if (f != NULL)
1434 PyFile_SetBufSize(f, bufsize);
1435 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001436}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001437
1438static char makefile_doc[] =
1439"makefile([mode[, buffersize]]) -> file object\n\
1440\n\
1441Return a regular file object corresponding to the socket.\n\
1442The mode and buffersize arguments are as for the built-in open() function.";
1443
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001444#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001445
Guido van Rossum48a680c2001-03-02 06:34:14 +00001446
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001447/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001448
Guido van Rossum73624e91994-10-10 17:59:00 +00001449static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001450PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001451{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001452 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001453 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001454 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001455 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001456 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001457 if (buf == NULL)
1458 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001459 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001460 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001461 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001462 if (n < 0) {
1463 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001464 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001465 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001466 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001467 return NULL;
1468 return buf;
1469}
1470
Guido van Rossum82a5c661998-07-07 20:45:43 +00001471static char recv_doc[] =
1472"recv(buffersize[, flags]) -> data\n\
1473\n\
1474Receive up to buffersize bytes from the socket. For the optional flags\n\
1475argument, see the Unix manual. When no data is available, block until\n\
1476at least one byte is available or until the remote end is closed. When\n\
1477the remote end is closed and all data is read, return the empty string.";
1478
Guido van Rossum30a685f1991-06-27 15:51:29 +00001479
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001480/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001481
Guido van Rossum73624e91994-10-10 17:59:00 +00001482static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001483PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001484{
1485 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001486 PyObject *buf = NULL;
1487 PyObject *addr = NULL;
1488 PyObject *ret = NULL;
1489
Guido van Rossumff3ab422000-04-24 15:16:03 +00001490 int len, n, flags = 0;
1491 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001492 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001493 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001494 if (!getsockaddrlen(s, &addrlen))
1495 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001496 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001497 if (buf == NULL)
1498 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001499 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001500 memset(addrbuf, 0, addrlen);
1501 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001502#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +00001503#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001504 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001505#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001506 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001507#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001508#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001509 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001510#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001511 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001512 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001513 if (n < 0) {
1514 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +00001515 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001516 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001517 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001518 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001519
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001520 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001521 goto finally;
1522
Guido van Rossum73624e91994-10-10 17:59:00 +00001523 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001524 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001525 Py_XDECREF(addr);
1526 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001527 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001528}
1529
Guido van Rossum82a5c661998-07-07 20:45:43 +00001530static char recvfrom_doc[] =
1531"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1532\n\
1533Like recv(buffersize, flags) but also return the sender's address info.";
1534
Guido van Rossum30a685f1991-06-27 15:51:29 +00001535
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001536/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001537
Guido van Rossum73624e91994-10-10 17:59:00 +00001538static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001539PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001540{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001541 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001542 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001543 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001544 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001545 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001546 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001547 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001548 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001549 return PySocket_Err();
1550 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001551}
1552
Guido van Rossum82a5c661998-07-07 20:45:43 +00001553static char send_doc[] =
1554"send(data[, flags])\n\
1555\n\
1556Send a data string to the socket. For the optional flags\n\
1557argument, see the Unix manual.";
1558
Guido van Rossum30a685f1991-06-27 15:51:29 +00001559
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001560/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001561
Guido van Rossum73624e91994-10-10 17:59:00 +00001562static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001563PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001564{
Guido van Rossum73624e91994-10-10 17:59:00 +00001565 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001566 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001567 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001568 int addrlen, len, n, flags;
1569 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001570 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001571 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001572 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1573 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001574 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001575 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001576 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001577 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001578 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001579 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001580 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001581 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001582 return PySocket_Err();
1583 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001584}
1585
Guido van Rossum82a5c661998-07-07 20:45:43 +00001586static char sendto_doc[] =
1587"sendto(data[, flags], address)\n\
1588\n\
1589Like send(data, flags) but allows specifying the destination address.\n\
1590For IP sockets, the address is a pair (hostaddr, port).";
1591
Guido van Rossum30a685f1991-06-27 15:51:29 +00001592
1593/* s.shutdown(how) method */
1594
Guido van Rossum73624e91994-10-10 17:59:00 +00001595static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001596PySocketSock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001597{
1598 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001599 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001600
1601 how = PyInt_AsLong(arg);
1602 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001603 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001604 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001605 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001606 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001607 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001608 return PySocket_Err();
1609 Py_INCREF(Py_None);
1610 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001611}
1612
Guido van Rossum82a5c661998-07-07 20:45:43 +00001613static char shutdown_doc[] =
1614"shutdown(flag)\n\
1615\n\
1616Shut down the reading side of the socket (flag == 0), the writing side\n\
1617of the socket (flag == 1), or both ends (flag == 2).";
1618
Guido van Rossum30a685f1991-06-27 15:51:29 +00001619
1620/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001621
Guido van Rossum73624e91994-10-10 17:59:00 +00001622static PyMethodDef PySocketSock_methods[] = {
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001623 {"accept", (PyNoArgsFunction)PySocketSock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001624 accept_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001625 {"bind", (PyCFunction)PySocketSock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001626 bind_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001627 {"close", (PyNoArgsFunction)PySocketSock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001628 close_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001629 {"connect", (PyCFunction)PySocketSock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001630 connect_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001631 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001632 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001633#ifndef NO_DUP
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001634 {"dup", (PyNoArgsFunction)PySocketSock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001635 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001636#endif
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001637 {"fileno", (PyNoArgsFunction)PySocketSock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001638 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001639#ifdef HAVE_GETPEERNAME
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001640 {"getpeername", (PyNoArgsFunction)PySocketSock_getpeername,
1641 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001642#endif
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001643 {"getsockname", (PyNoArgsFunction)PySocketSock_getsockname,
1644 METH_NOARGS, getsockname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001645 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1646 getsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001647 {"listen", (PyCFunction)PySocketSock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001648 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001649#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001650 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1651 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001652#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001653 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1654 recv_doc},
1655 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1656 recvfrom_doc},
1657 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1658 send_doc},
1659 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1660 sendto_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001661 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001662 setblocking_doc},
1663 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1664 setsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001665 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001666 shutdown_doc},
1667#ifdef RISCOS
1668 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1669 sleeptaskw_doc},
1670#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001671 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001672};
1673
Guido van Rossum30a685f1991-06-27 15:51:29 +00001674
Guido van Rossum73624e91994-10-10 17:59:00 +00001675/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001676 First close the file description. */
1677
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001678static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001679PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001680{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001681 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001682 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +00001683 PyObject_Del(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001684}
1685
Guido van Rossum30a685f1991-06-27 15:51:29 +00001686
1687/* Return a socket object's named attribute. */
1688
Guido van Rossum73624e91994-10-10 17:59:00 +00001689static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001690PySocketSock_getattr(PySocketSockObject *s, char *name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001691{
Guido van Rossum73624e91994-10-10 17:59:00 +00001692 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001693}
1694
Guido van Rossum30a685f1991-06-27 15:51:29 +00001695
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001696static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001697PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001698{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001699 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001700#if SIZEOF_SOCKET_T > SIZEOF_LONG
1701 if (s->sock_fd > LONG_MAX) {
1702 /* this can occur on Win64, and actually there is a special
1703 ugly printf formatter for decimal pointer length integer
1704 printing, only bother if necessary*/
1705 PyErr_SetString(PyExc_OverflowError,
1706 "no printf formatter to display the socket descriptor in decimal");
1707 return NULL;
1708 }
1709#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001710 sprintf(buf,
1711 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
Fred Drakea04eaad2000-06-30 02:46:07 +00001712 (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001713 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001714}
1715
1716
Guido van Rossumb6775db1994-08-01 11:34:53 +00001717/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001718
Guido van Rossum73624e91994-10-10 17:59:00 +00001719static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001720 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001721 0,
1722 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001723 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001724 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001725 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001726 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001727 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001728 0, /*tp_setattr*/
1729 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001730 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001731 0, /*tp_as_number*/
1732 0, /*tp_as_sequence*/
1733 0, /*tp_as_mapping*/
1734};
1735
Guido van Rossum30a685f1991-06-27 15:51:29 +00001736
Guido van Rossum81194471991-07-27 21:42:02 +00001737/* Python interface to gethostname(). */
1738
1739/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001740static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001741PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001742{
1743 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001744 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001745 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001746 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001747 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001748 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001749 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001750 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001751 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001752 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001753 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001754}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001755
Guido van Rossum82a5c661998-07-07 20:45:43 +00001756static char gethostname_doc[] =
1757"gethostname() -> string\n\
1758\n\
1759Return the current host name.";
1760
Guido van Rossumff4949e1992-08-05 19:58:53 +00001761
Guido van Rossum30a685f1991-06-27 15:51:29 +00001762/* Python interface to gethostbyname(name). */
1763
1764/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001765static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001766PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001767{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001768 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001769 struct sockaddr_storage addrbuf;
1770
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001771 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001772 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001773 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001774 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001775 return makeipaddr((struct sockaddr *)&addrbuf,
1776 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001777}
1778
Guido van Rossum82a5c661998-07-07 20:45:43 +00001779static char gethostbyname_doc[] =
1780"gethostbyname(host) -> address\n\
1781\n\
1782Return the IP address (a string of the form '255.255.255.255') for a host.";
1783
1784
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001785/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1786
1787static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001788gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001789{
1790 char **pch;
1791 PyObject *rtn_tuple = (PyObject *)NULL;
1792 PyObject *name_list = (PyObject *)NULL;
1793 PyObject *addr_list = (PyObject *)NULL;
1794 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001795
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001796 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001797 /* Let's get real error message to return */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001798 PyH_Err(h_errno);
1799 return NULL;
1800 }
1801 if (h->h_addrtype != af) {
1802#ifdef HAVE_STRERROR
1803 /* Let's get real error message to return */
1804 PyErr_SetString(PySocket_Error, (char *)strerror(EAFNOSUPPORT));
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001805#else
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001806 PyErr_SetString(PySocket_Error,
1807 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001808#endif
1809 return NULL;
1810 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001811 switch (af) {
1812 case AF_INET:
1813 if (alen < sizeof(struct sockaddr_in))
1814 return NULL;
1815 break;
1816#ifdef INET6
1817 case AF_INET6:
1818 if (alen < sizeof(struct sockaddr_in6))
1819 return NULL;
1820 break;
1821#endif
1822 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001823 if ((name_list = PyList_New(0)) == NULL)
1824 goto err;
1825 if ((addr_list = PyList_New(0)) == NULL)
1826 goto err;
1827 for (pch = h->h_aliases; *pch != NULL; pch++) {
1828 int status;
1829 tmp = PyString_FromString(*pch);
1830 if (tmp == NULL)
1831 goto err;
1832 status = PyList_Append(name_list, tmp);
1833 Py_DECREF(tmp);
1834 if (status)
1835 goto err;
1836 }
1837 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1838 int status;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001839 switch (af) {
1840 case AF_INET:
1841 {
1842 struct sockaddr_in sin;
1843 memset(&sin, 0, sizeof(sin));
1844 sin.sin_family = af;
1845#ifdef HAVE_SOCKADDR_SA_LEN
1846 sin.sin_len = sizeof(sin);
1847#endif
1848 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
1849 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
1850 if (pch == h->h_addr_list && alen >= sizeof(sin))
1851 memcpy((char *) addr, &sin, sizeof(sin));
1852 break;
1853 }
1854#ifdef INET6
1855 case AF_INET6:
1856 {
1857 struct sockaddr_in6 sin6;
1858 memset(&sin6, 0, sizeof(sin6));
1859 sin6.sin6_family = af;
1860#ifdef HAVE_SOCKADDR_SA_LEN
1861 sin6.sin6_len = sizeof(sin6);
1862#endif
1863 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
1864 tmp = makeipaddr((struct sockaddr *)&sin6,
1865 sizeof(sin6));
1866 if (pch == h->h_addr_list && alen >= sizeof(sin6))
1867 memcpy((char *) addr, &sin6, sizeof(sin6));
1868 break;
1869 }
1870#endif
1871 default: /* can't happen */
1872 PyErr_SetString(PySocket_Error,
1873 "unsupported address family");
1874 return NULL;
1875 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001876 if (tmp == NULL)
1877 goto err;
1878 status = PyList_Append(addr_list, tmp);
1879 Py_DECREF(tmp);
1880 if (status)
1881 goto err;
1882 }
1883 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1884 err:
1885 Py_XDECREF(name_list);
1886 Py_XDECREF(addr_list);
1887 return rtn_tuple;
1888}
1889
1890
1891/* Python interface to gethostbyname_ex(name). */
1892
1893/*ARGSUSED*/
1894static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001895PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001896{
1897 char *name;
1898 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001899 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00001900 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00001901 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001902#ifdef HAVE_GETHOSTBYNAME_R
1903 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001904#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1905 struct hostent_data data;
1906#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001907 char buf[16384];
1908 int buf_len = (sizeof buf) - 1;
1909 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001910#endif
1911#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001912 int result;
1913#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001914#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001915
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001916 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001917 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001918 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001919 return NULL;
1920 Py_BEGIN_ALLOW_THREADS
1921#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001922#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001923 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001924#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001925 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001926#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00001927 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001928 result = gethostbyname_r(name, &hp_allocated, &data);
1929 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001930#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001931#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00001932#ifdef USE_GETHOSTBYNAME_LOCK
1933 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001934#endif
1935 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001936#endif /* HAVE_GETHOSTBYNAME_R */
1937 Py_END_ALLOW_THREADS
Martin v. Löwis9db2f572001-07-23 01:30:10 +00001938 /* Some C libraries would require addr.__ss_family instead of addr.ss_family.
1939 Therefore, we cast the sockaddr_storage into sockaddr to access sa_family. */
1940 sa = (struct sockaddr*)&addr;
1941 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00001942#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00001943 PyThread_release_lock(gethostbyname_lock);
1944#endif
1945 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001946}
1947
1948static char ghbn_ex_doc[] =
1949"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
1950\n\
1951Return the true host name, a list of aliases, and a list of IP addresses,\n\
1952for a host. The host argument is a string giving a host name or IP number.";
1953
1954
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001955/* Python interface to gethostbyaddr(IP). */
1956
1957/*ARGSUSED*/
1958static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001959PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001960{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001961#ifdef INET6
1962 struct sockaddr_storage addr;
1963#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00001964 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001965#endif
1966 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001967 char *ip_num;
1968 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00001969 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001970#ifdef HAVE_GETHOSTBYNAME_R
1971 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001972#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1973 struct hostent_data data;
1974#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001975 char buf[16384];
1976 int buf_len = (sizeof buf) - 1;
1977 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001978#endif
1979#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001980 int result;
1981#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00001982#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001983 char *ap;
1984 int al;
1985 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001986
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001987 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001988 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001989 af = PF_UNSPEC;
1990 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001991 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001992 af = sa->sa_family;
1993 ap = NULL;
1994 al = 0;
1995 switch (af) {
1996 case AF_INET:
1997 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
1998 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
1999 break;
2000#ifdef INET6
2001 case AF_INET6:
2002 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2003 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2004 break;
2005#endif
2006 default:
2007 PyErr_SetString(PySocket_Error, "unsupported address family");
2008 return NULL;
2009 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002010 Py_BEGIN_ALLOW_THREADS
2011#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002012#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002013 result = gethostbyaddr_r(ap, al, af,
2014 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002015 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002016#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002017 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002018 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002019#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002020 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002021 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002022 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002023#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002024#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002025#ifdef USE_GETHOSTBYNAME_LOCK
2026 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002027#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002028 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002029#endif /* HAVE_GETHOSTBYNAME_R */
2030 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002031 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002032#ifdef USE_GETHOSTBYNAME_LOCK
2033 PyThread_release_lock(gethostbyname_lock);
2034#endif
2035 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002036}
2037
Guido van Rossum82a5c661998-07-07 20:45:43 +00002038static char gethostbyaddr_doc[] =
2039"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2040\n\
2041Return the true host name, a list of aliases, and a list of IP addresses,\n\
2042for a host. The host argument is a string giving a host name or IP number.";
2043
Guido van Rossum30a685f1991-06-27 15:51:29 +00002044
2045/* Python interface to getservbyname(name).
2046 This only returns the port number, since the other info is already
2047 known or not useful (like the list of aliases). */
2048
2049/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002050static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002051PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002052{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002053 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002054 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002055 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002056 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002057 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002058 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002059 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002060 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002061 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002062 return NULL;
2063 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002064 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002065}
2066
Guido van Rossum82a5c661998-07-07 20:45:43 +00002067static char getservbyname_doc[] =
2068"getservbyname(servicename, protocolname) -> integer\n\
2069\n\
2070Return a port number from a service name and protocol name.\n\
2071The protocol name should be 'tcp' or 'udp'.";
2072
Guido van Rossum30a685f1991-06-27 15:51:29 +00002073
Guido van Rossum3901d851996-12-19 16:35:04 +00002074/* Python interface to getprotobyname(name).
2075 This only returns the protocol number, since the other info is
2076 already known or not useful (like the list of aliases). */
2077
2078/*ARGSUSED*/
2079static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002080PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002081{
2082 char *name;
2083 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002084#ifdef __BEOS__
2085/* Not available in BeOS yet. - [cjh] */
2086 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
2087 return NULL;
2088#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002089 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002090 return NULL;
2091 Py_BEGIN_ALLOW_THREADS
2092 sp = getprotobyname(name);
2093 Py_END_ALLOW_THREADS
2094 if (sp == NULL) {
2095 PyErr_SetString(PySocket_Error, "protocol not found");
2096 return NULL;
2097 }
2098 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002099#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002100}
2101
Guido van Rossum82a5c661998-07-07 20:45:43 +00002102static char getprotobyname_doc[] =
2103"getprotobyname(name) -> integer\n\
2104\n\
2105Return the protocol number for the named protocol. (Rarely used.)";
2106
Guido van Rossum3901d851996-12-19 16:35:04 +00002107
Guido van Rossum30a685f1991-06-27 15:51:29 +00002108/* Python interface to socket(family, type, proto).
2109 The third (protocol) argument is optional.
2110 Return a new socket object. */
2111
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002112/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002113static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002114PySocket_socket(PyObject *self, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002115{
Guido van Rossum73624e91994-10-10 17:59:00 +00002116 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002117 SOCKET_T fd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002118 int family, type, proto = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00002119 if (!PyArg_ParseTuple(args, "ii|i:socket", &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002120 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002121 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002122 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002123 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00002124#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00002125 if (fd == INVALID_SOCKET)
2126#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002127 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00002128#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002129 return PySocket_Err();
2130 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002131 /* If the object can't be created, don't forget to close the
2132 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002133 if (s == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002134 (void) SOCKETCLOSE(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00002135 /* From now on, ignore SIGPIPE and let the error checking
2136 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002137#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00002138 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002139#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002140 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002141}
2142
Guido van Rossum82a5c661998-07-07 20:45:43 +00002143static char socket_doc[] =
2144"socket(family, type[, proto]) -> socket object\n\
2145\n\
2146Open a socket of the given type. The family argument specifies the\n\
2147address family; it is normally AF_INET, sometimes AF_UNIX.\n\
2148The type argument specifies whether this is a stream (SOCK_STREAM)\n\
2149or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
2150specifying the default protocol.";
2151
2152
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002153#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002154/* Create a socket object from a numeric file description.
2155 Useful e.g. if stdin is a socket.
2156 Additional arguments as for socket(). */
2157
2158/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002159static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002160PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002161{
Guido van Rossum73624e91994-10-10 17:59:00 +00002162 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002163 SOCKET_T fd;
2164 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002165 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2166 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002167 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002168 /* Dup the fd so it and the socket can be closed independently */
2169 fd = dup(fd);
2170 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00002171 return PySocket_Err();
2172 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002173 /* From now on, ignore SIGPIPE and let the error checking
2174 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002175#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002176 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002177#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002178 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002179}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002180
2181static char fromfd_doc[] =
2182"fromfd(fd, family, type[, proto]) -> socket object\n\
2183\n\
2184Create a socket object from the given file descriptor.\n\
2185The remaining arguments are the same as for socket().";
2186
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002187#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002188
Guido van Rossum82a5c661998-07-07 20:45:43 +00002189
Guido van Rossum006bf911996-06-12 04:04:55 +00002190static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002191PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002192{
2193 int x1, x2;
2194
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002195 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002196 return NULL;
2197 }
2198 x2 = (int)ntohs((short)x1);
2199 return PyInt_FromLong(x2);
2200}
2201
Guido van Rossum82a5c661998-07-07 20:45:43 +00002202static char ntohs_doc[] =
2203"ntohs(integer) -> integer\n\
2204\n\
2205Convert a 16-bit integer from network to host byte order.";
2206
2207
Guido van Rossum006bf911996-06-12 04:04:55 +00002208static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002209PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002210{
2211 int x1, x2;
2212
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002213 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002214 return NULL;
2215 }
2216 x2 = ntohl(x1);
2217 return PyInt_FromLong(x2);
2218}
2219
Guido van Rossum82a5c661998-07-07 20:45:43 +00002220static char ntohl_doc[] =
2221"ntohl(integer) -> integer\n\
2222\n\
2223Convert a 32-bit integer from network to host byte order.";
2224
2225
Guido van Rossum006bf911996-06-12 04:04:55 +00002226static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002227PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002228{
2229 int x1, x2;
2230
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002231 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002232 return NULL;
2233 }
2234 x2 = (int)htons((short)x1);
2235 return PyInt_FromLong(x2);
2236}
2237
Guido van Rossum82a5c661998-07-07 20:45:43 +00002238static char htons_doc[] =
2239"htons(integer) -> integer\n\
2240\n\
2241Convert a 16-bit integer from host to network byte order.";
2242
2243
Guido van Rossum006bf911996-06-12 04:04:55 +00002244static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002245PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002246{
2247 int x1, x2;
2248
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002249 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002250 return NULL;
2251 }
2252 x2 = htonl(x1);
2253 return PyInt_FromLong(x2);
2254}
2255
Guido van Rossum82a5c661998-07-07 20:45:43 +00002256static char htonl_doc[] =
2257"htonl(integer) -> integer\n\
2258\n\
2259Convert a 32-bit integer from host to network byte order.";
2260
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002261/*
2262 * socket.inet_aton() and socket.inet_ntoa() functions
2263 *
2264 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2265 *
2266 */
2267
Guido van Rossum48a680c2001-03-02 06:34:14 +00002268static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002269"inet_aton(string) -> packed 32-bit IP representation\n\
2270\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002271Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002272binary format used in low-level network functions.";
2273
2274static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002275PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002276{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002277#ifndef INADDR_NONE
2278#define INADDR_NONE (-1)
2279#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002280
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002281 /* Have to use inet_addr() instead */
2282 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002283 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002284
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002285 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002286 return NULL;
2287 }
Guido van Rossumff3ab422000-04-24 15:16:03 +00002288#ifdef USE_GUSI1
Fred Drakee5065292001-07-19 21:16:41 +00002289 packed_addr = inet_addr(ip_addr).s_addr;
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002290#else
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002291 packed_addr = inet_addr(ip_addr);
Guido van Rossum1b6e4631999-11-04 18:22:29 +00002292#endif
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002293
2294 if (packed_addr == INADDR_NONE) { /* invalid address */
2295 PyErr_SetString(PySocket_Error,
2296 "illegal IP address string passed to inet_aton");
2297 return NULL;
2298 }
2299
2300 return PyString_FromStringAndSize((char *) &packed_addr,
2301 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002302}
2303
Guido van Rossum48a680c2001-03-02 06:34:14 +00002304static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002305"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002306\n\
2307Convert an IP address from 32-bit packed binary format to string format";
2308
2309static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002310PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002311{
2312 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002313 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002314 struct in_addr packed_addr;
2315
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002316 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002317 return NULL;
2318 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002319
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002320 if (addr_len != sizeof(packed_addr)) {
2321 PyErr_SetString(PySocket_Error,
2322 "packed IP wrong length for inet_ntoa");
2323 return NULL;
2324 }
2325
2326 memcpy(&packed_addr, packed_str, addr_len);
2327
2328 return PyString_FromString(inet_ntoa(packed_addr));
2329}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002330
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002331/* Python interface to getaddrinfo(host, port). */
2332
2333/*ARGSUSED*/
2334static PyObject *
2335PySocket_getaddrinfo(PyObject *self, PyObject *args)
2336{
2337 struct addrinfo hints, *res0, *res;
2338 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002339 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002340 char *hptr, *pptr;
2341 int family, socktype, protocol, flags;
2342 int error;
2343 PyObject *all = (PyObject *)NULL;
2344 PyObject *single = (PyObject *)NULL;
2345
2346 family = socktype = protocol = flags = 0;
2347 family = PF_UNSPEC;
2348 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2349 &hptr, &pobj, &family, &socktype,
2350 &protocol, &flags)) {
2351 return NULL;
2352 }
2353 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002354 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002355 pptr = pbuf;
2356 } else if (PyString_Check(pobj)) {
2357 pptr = PyString_AsString(pobj);
2358 } else if (pobj == Py_None) {
2359 pptr = (char *)NULL;
2360 } else {
2361 PyErr_SetString(PySocket_Error, "Int or String expected");
2362 return NULL;
2363 }
2364 memset(&hints, 0, sizeof(hints));
2365 hints.ai_family = family;
2366 hints.ai_socktype = socktype;
2367 hints.ai_protocol = protocol;
2368 hints.ai_flags = flags;
2369 error = getaddrinfo(hptr, pptr, &hints, &res0);
2370 if (error) {
2371 PyGAI_Err(error);
2372 return NULL;
2373 }
2374
2375 if ((all = PyList_New(0)) == NULL)
2376 goto err;
2377 for (res = res0; res; res = res->ai_next) {
2378 single = Py_BuildValue("iiisO", res->ai_family,
2379 res->ai_socktype, res->ai_protocol,
2380 res->ai_canonname ? res->ai_canonname : "",
2381 makesockaddr(-1, res->ai_addr, res->ai_addrlen));
2382 if (single == NULL)
2383 goto err;
2384
2385 if (PyList_Append(all, single))
2386 goto err;
2387 Py_XDECREF(single);
2388 }
2389 Py_XDECREF(pobj);
2390 return all;
2391 err:
2392 Py_XDECREF(single);
2393 Py_XDECREF(all);
2394 Py_XDECREF(pobj);
2395 return (PyObject *)NULL;
2396}
2397
2398static char getaddrinfo_doc[] =
2399"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2400 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2401\n\
2402Resolve host and port into addrinfo struct.";
2403
2404/* Python interface to getnameinfo(sa, flags). */
2405
2406/*ARGSUSED*/
2407static PyObject *
2408PySocket_getnameinfo(PyObject *self, PyObject *args)
2409{
2410 PyObject *sa = (PyObject *)NULL;
2411 int flags;
2412 char *hostp;
2413 int n, port, flowinfo, scope_id;
2414 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2415 struct addrinfo hints, *res = NULL;
2416 int error;
2417 PyObject *ret = (PyObject *)NULL;
2418
2419 flags = flowinfo = scope_id = 0;
2420 if (PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags) == 0)
2421 return NULL;
2422 n = PyArg_ParseTuple(sa, "si|ii", &hostp, &port, &flowinfo, scope_id);
2423 if (n == 0)
2424 goto fail;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002425 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002426 memset(&hints, 0, sizeof(hints));
2427 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002428 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002429 error = getaddrinfo(hostp, pbuf, &hints, &res);
2430 if (error) {
2431 PyGAI_Err(error);
2432 goto fail;
2433 }
2434 if (res->ai_next) {
2435 PyErr_SetString(PySocket_Error,
2436 "sockaddr resolved to multiple addresses");
2437 goto fail;
2438 }
2439 switch (res->ai_family) {
2440 case AF_INET:
2441 {
2442 char *t1;
2443 int t2;
2444 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
2445 PyErr_SetString(PySocket_Error,
2446 "IPv4 sockaddr must be 2 tuple");
2447 goto fail;
2448 }
2449 break;
2450 }
2451#ifdef INET6
2452 case AF_INET6:
2453 {
2454 struct sockaddr_in6 *sin6;
2455 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2456 sin6->sin6_flowinfo = flowinfo;
2457 sin6->sin6_scope_id = scope_id;
2458 break;
2459 }
2460#endif
2461 }
2462 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2463 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2464 if (error) {
2465 PyGAI_Err(error);
2466 goto fail;
2467 }
2468 ret = Py_BuildValue("ss", hbuf, pbuf);
2469
2470fail:
2471 if (res)
2472 freeaddrinfo(res);
2473 Py_XDECREF(sa);
2474 return ret;
2475}
2476
2477static char getnameinfo_doc[] =
2478"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2479\n\
2480Get host and port for a sockaddr.";
2481
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002482/* XXX It might be helpful to augment the error message generated
2483 below with the name of the SSL function that generated the error.
2484 I expect it's obvious most of the time.
2485*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002486
2487#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002488static PyObject *
2489PySSL_SetError(SSL *ssl, int ret)
2490{
2491 PyObject *v, *n, *s;
2492 char *errstr;
2493 int err;
2494
2495 assert(ret <= 0);
2496
2497 err = SSL_get_error(ssl, ret);
2498 n = PyInt_FromLong(err);
2499 if (n == NULL)
2500 return NULL;
2501 v = PyTuple_New(2);
2502 if (v == NULL) {
2503 Py_DECREF(n);
2504 return NULL;
2505 }
2506
2507 switch (SSL_get_error(ssl, ret)) {
2508 case SSL_ERROR_ZERO_RETURN:
2509 errstr = "TLS/SSL connection has been closed";
2510 break;
2511 case SSL_ERROR_WANT_READ:
2512 errstr = "The operation did not complete (read)";
2513 break;
2514 case SSL_ERROR_WANT_WRITE:
2515 errstr = "The operation did not complete (write)";
2516 break;
2517 case SSL_ERROR_WANT_X509_LOOKUP:
2518 errstr = "The operation did not complete (X509 lookup)";
2519 break;
2520 case SSL_ERROR_SYSCALL:
2521 case SSL_ERROR_SSL:
2522 {
2523 unsigned long e = ERR_get_error();
2524 if (e == 0) {
2525 /* an EOF was observed that violates the protocol */
2526 errstr = "EOF occurred in violation of protocol";
2527 } else if (e == -1) {
2528 /* the underlying BIO reported an I/O error */
2529 Py_DECREF(v);
2530 Py_DECREF(n);
2531 PyErr_SetFromErrno(PyExc_IOError);
2532 return NULL;
2533 } else {
2534 /* XXX Protected by global interpreter lock */
2535 errstr = ERR_error_string(e, NULL);
2536 }
2537 break;
2538 }
2539 default:
2540 errstr = "Invalid error code";
2541 }
2542 s = PyString_FromString(errstr);
2543 if (s == NULL) {
2544 Py_DECREF(v);
2545 Py_DECREF(n);
2546 }
2547 PyTuple_SET_ITEM(v, 0, n);
2548 PyTuple_SET_ITEM(v, 1, s);
2549 PyErr_SetObject(PySSLErrorObject, v);
2550 return NULL;
2551}
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002552
2553/* This is a C function to be called for new object initialization */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002554static PySSLObject *
2555newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002556{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002557 PySSLObject *self;
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002558 char *errstr = NULL;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002559 int ret;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002560
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002561 self = PyObject_New(PySSLObject, &PySSL_Type); /* Create new object */
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002562 if (self == NULL){
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002563 errstr = "newPySSLObject error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002564 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002565 }
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002566 memset(self->server, '\0', sizeof(char) * 256);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002567 memset(self->issuer, '\0', sizeof(char) * 256);
Jeremy Hyltonec4b5452001-10-10 03:37:05 +00002568 self->server_cert = NULL;
2569 self->ssl = NULL;
2570 self->ctx = NULL;
2571 self->Socket = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002572
Jeremy Hylton22738b92001-10-10 22:37:48 +00002573 if ((key_file && !cert_file) || (!key_file && cert_file)) {
2574 errstr = "Both the key & certificate files must be specified";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002575 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002576 }
2577
Jeremy Hylton22738b92001-10-10 22:37:48 +00002578 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
2579 if (self->ctx == NULL) {
2580 errstr = "SSL_CTX_new error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002581 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002582 }
2583
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002584 if (key_file) {
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002585 if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002586 SSL_FILETYPE_PEM) < 1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002587 errstr = "SSL_CTX_use_PrivateKey_file error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002588 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002589 }
2590
2591 if (SSL_CTX_use_certificate_chain_file(self->ctx,
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002592 cert_file) < 1) {
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002593 errstr = "SSL_CTX_use_certificate_chain_file error";
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002594 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002595 }
2596 }
2597
2598 SSL_CTX_set_verify(self->ctx,
2599 SSL_VERIFY_NONE, NULL); /* set verify lvl */
2600 self->ssl = SSL_new(self->ctx); /* New ssl struct */
2601 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
2602 SSL_set_connect_state(self->ssl);
2603
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002604 /* Actually negotiate SSL connection */
2605 /* XXX If SSL_connect() returns 0, it's also a failure. */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002606 ret = SSL_connect(self->ssl);
2607 if (ret <= 0) {
2608 PySSL_SetError(self->ssl, ret);
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002609 goto fail;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002610 }
2611 self->ssl->debug = 1;
2612
2613 if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
2614 X509_NAME_oneline(X509_get_subject_name(self->server_cert),
2615 self->server, 256);
2616 X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
2617 self->issuer, 256);
2618 }
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002619 self->Socket = Sock;
2620 Py_INCREF(self->Socket);
2621 return self;
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002622 fail:
Jeremy Hyltonb0b0bd62001-10-10 22:33:32 +00002623 if (errstr)
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002624 PyErr_SetString(PySSLErrorObject, errstr);
Jeremy Hyltonf86d63e2001-10-10 03:19:39 +00002625 Py_DECREF(self);
2626 return NULL;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002627}
2628
2629/* This is the Python function called for new object initialization */
2630static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002631PySocket_ssl(PyObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002632{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002633 PySSLObject *rv;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002634 PySocketSockObject *Sock;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002635 char *key_file = NULL;
2636 char *cert_file = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002637
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002638 if (!PyArg_ParseTuple(args, "O!|zz:ssl",
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002639 &PySocketSock_Type, (PyObject*)&Sock,
Jeremy Hyltonab006452001-10-10 03:33:24 +00002640 &key_file, &cert_file))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002641 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002642
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002643 rv = newPySSLObject(Sock, key_file, cert_file);
Jeremy Hyltonab006452001-10-10 03:33:24 +00002644 if (rv == NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002645 return NULL;
2646 return (PyObject *)rv;
2647}
2648
2649static char ssl_doc[] =
2650"ssl(socket, keyfile, certfile) -> sslobject";
2651
2652static PyObject *
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002653PySSL_server(PySSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002654{
2655 return PyString_FromString(self->server);
2656}
2657
2658static PyObject *
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002659PySSL_issuer(PySSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002660{
2661 return PyString_FromString(self->issuer);
2662}
2663
2664
2665/* SSL object methods */
2666
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002667static PyMethodDef PySSLMethods[] = {
2668 {"write", (PyCFunction)PySSL_SSLwrite, 1},
2669 {"read", (PyCFunction)PySSL_SSLread, 1},
2670 {"server", (PyCFunction)PySSL_server, 1},
2671 {"issuer", (PyCFunction)PySSL_issuer, 1},
Jeremy Hyltonab006452001-10-10 03:33:24 +00002672 {NULL, NULL}
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002673};
2674
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002675static void PySSL_dealloc(PySSLObject *self)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002676{
2677 if (self->server_cert) /* Possible not to have one? */
2678 X509_free (self->server_cert);
Jeremy Hyltonec4b5452001-10-10 03:37:05 +00002679 if (self->ssl)
2680 SSL_free(self->ssl);
2681 if (self->ctx)
2682 SSL_CTX_free(self->ctx);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002683 Py_XDECREF(self->Socket);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002684 PyObject_Del(self);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002685}
2686
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002687static PyObject *PySSL_getattr(PySSLObject *self, char *name)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002688{
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002689 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002690}
2691
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002692staticforward PyTypeObject PySSL_Type = {
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002693 PyObject_HEAD_INIT(NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002694 0, /*ob_size*/
2695 "SSL", /*tp_name*/
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002696 sizeof(PySSLObject), /*tp_basicsize*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002697 0, /*tp_itemsize*/
2698 /* methods */
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002699 (destructor)PySSL_dealloc, /*tp_dealloc*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002700 0, /*tp_print*/
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002701 (getattrfunc)PySSL_getattr, /*tp_getattr*/
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002702 0, /*tp_setattr*/
2703 0, /*tp_compare*/
2704 0, /*tp_repr*/
2705 0, /*tp_as_number*/
2706 0, /*tp_as_sequence*/
2707 0, /*tp_as_mapping*/
2708 0, /*tp_hash*/
2709};
2710
2711
2712
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002713static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002714{
2715 char *data;
Andrew M. Kuchlingb38175e2001-02-07 20:41:17 +00002716 size_t len;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002717
Andrew M. Kuchlingb38175e2001-02-07 20:41:17 +00002718 if (!PyArg_ParseTuple(args, "s#:write", &data, &len))
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002719 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002720
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002721 len = SSL_write(self->ssl, data, len);
2722 return PyInt_FromLong((long)len);
2723}
2724
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002725static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002726{
2727 PyObject *buf;
2728 int count = 0;
2729 int len = 1024;
2730 int res;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002731
Guido van Rossum43713e52000-02-29 13:59:29 +00002732 PyArg_ParseTuple(args, "|i:read", &len);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002733
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002734 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
2735 return NULL; /* Error object should already be set */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002736
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002737 count = SSL_read(self->ssl, PyString_AsString(buf), len);
2738 res = SSL_get_error(self->ssl, count);
2739
2740 switch (res) {
Jeremy Hylton42dd01a2001-02-01 23:35:20 +00002741 case SSL_ERROR_NONE:
2742 assert(count > 0);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002743 break;
Jeremy Hylton42dd01a2001-02-01 23:35:20 +00002744 case SSL_ERROR_ZERO_RETURN: /* normal EOF */
2745 assert(count == 0);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002746 break;
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002747 default:
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002748 return PyErr_SetFromErrno(PySSLErrorObject);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002749 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002750
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002751 fflush(stderr);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002752
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002753 if (count < 0) {
2754 Py_DECREF(buf);
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002755 return PyErr_SetFromErrno(PySSLErrorObject);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002756 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002757
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002758 if (count != len && _PyString_Resize(&buf, count) < 0)
2759 return NULL;
2760 return buf;
2761}
2762
2763#endif /* USE_SSL */
2764
2765
Guido van Rossum30a685f1991-06-27 15:51:29 +00002766/* List of functions exported by this module. */
2767
Guido van Rossum73624e91994-10-10 17:59:00 +00002768static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002769 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002770 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002771 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002772 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002773 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002774 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002775 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002776 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002777 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002778 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002779 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002780 METH_VARARGS,getprotobyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002781 {"socket", PySocket_socket,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002782 METH_VARARGS, socket_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002783#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002784 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002785 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002786#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002787 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002788 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002789 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002790 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002791 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002792 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002793 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002794 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002795 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002796 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002797 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002798 METH_VARARGS, inet_ntoa_doc},
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002799 {"getaddrinfo", PySocket_getaddrinfo,
2800 METH_VARARGS, getaddrinfo_doc},
2801 {"getnameinfo", PySocket_getnameinfo,
2802 METH_VARARGS, getnameinfo_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002803#ifdef USE_SSL
Guido van Rossum48a680c2001-03-02 06:34:14 +00002804 {"ssl", PySocket_ssl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002805 METH_VARARGS, ssl_doc},
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002806#endif /* USE_SSL */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002807 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002808};
2809
Guido van Rossum30a685f1991-06-27 15:51:29 +00002810
2811/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002812 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002813 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002814 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002815static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002816insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002817{
Guido van Rossum73624e91994-10-10 17:59:00 +00002818 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002819 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002820 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002821
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002822 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002823}
2824
Guido van Rossum30a685f1991-06-27 15:51:29 +00002825
Guido van Rossum8d665e61996-06-26 18:22:49 +00002826#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002827
2828/* Additional initialization and cleanup for NT/Windows */
2829
2830static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002831NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002832{
2833 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002834}
2835
2836static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002837NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002838{
2839 WSADATA WSAData;
2840 int ret;
2841 char buf[100];
2842 ret = WSAStartup(0x0101, &WSAData);
2843 switch (ret) {
2844 case 0: /* no error */
2845 atexit(NTcleanup);
2846 return 1;
2847 case WSASYSNOTREADY:
2848 PyErr_SetString(PyExc_ImportError,
2849 "WSAStartup failed: network not ready");
2850 break;
2851 case WSAVERNOTSUPPORTED:
2852 case WSAEINVAL:
2853 PyErr_SetString(PyExc_ImportError,
2854 "WSAStartup failed: requested version not supported");
2855 break;
2856 default:
2857 sprintf(buf, "WSAStartup failed: error code %d", ret);
2858 PyErr_SetString(PyExc_ImportError, buf);
2859 break;
2860 }
2861 return 0;
2862}
2863
Guido van Rossum8d665e61996-06-26 18:22:49 +00002864#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002865
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002866#if defined(PYOS_OS2)
2867
2868/* Additional initialization and cleanup for OS/2 */
2869
2870static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002871OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002872{
2873 /* No cleanup is necessary for OS/2 Sockets */
2874}
2875
2876static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002877OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002878{
2879 char reason[64];
2880 int rc = sock_init();
2881
2882 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002883 atexit(OS2cleanup);
2884 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002885 }
2886
2887 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
2888 PyErr_SetString(PyExc_ImportError, reason);
2889
Guido van Rossum32c575d1997-12-02 20:37:32 +00002890 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002891}
2892
2893#endif /* PYOS_OS2 */
2894
Guido van Rossum30a685f1991-06-27 15:51:29 +00002895/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002896 * This is called when the first 'import socket' is done,
2897 * via a table in config.c, if config.c is compiled with USE_SOCKET
2898 * defined.
2899 *
2900 * For MS_WINDOWS (which means any Windows variant), this module
2901 * is actually called "_socket", and there's a wrapper "socket.py"
2902 * which implements some missing functionality (such as makefile(),
2903 * dup() and fromfd()). The import of "_socket" may fail with an
2904 * ImportError exception if initialization of WINSOCK fails. When
2905 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2906 * scheduled to be made at exit time.
2907 *
2908 * For OS/2, this module is also called "_socket" and uses a wrapper
2909 * "socket.py" which implements that functionality that is missing
2910 * when PC operating systems don't put socket descriptors in the
2911 * operating system's filesystem layer.
2912 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002913
Guido van Rossum82a5c661998-07-07 20:45:43 +00002914static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00002915"Implementation module for socket operations. See the socket module\n\
2916for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00002917
2918static char sockettype_doc[] =
2919"A socket represents one endpoint of a network connection.\n\
2920\n\
2921Methods:\n\
2922\n\
2923accept() -- accept a connection, returning new socket and client address\n\
2924bind() -- bind the socket to a local address\n\
2925close() -- close the socket\n\
2926connect() -- connect the socket to a remote address\n\
2927connect_ex() -- connect, return an error code instead of an exception \n\
2928dup() -- return a new socket object identical to the current one (*)\n\
2929fileno() -- return underlying file descriptor\n\
2930getpeername() -- return remote address (*)\n\
2931getsockname() -- return local address\n\
2932getsockopt() -- get socket options\n\
2933listen() -- start listening for incoming connections\n\
2934makefile() -- return a file object corresponding tot the socket (*)\n\
2935recv() -- receive data\n\
2936recvfrom() -- receive data and sender's address\n\
2937send() -- send data\n\
2938sendto() -- send data to a given address\n\
2939setblocking() -- set or clear the blocking I/O flag\n\
2940setsockopt() -- set socket options\n\
2941shutdown() -- shut down traffic in one or both directions\n\
2942\n\
2943(*) not available on all platforms!)";
2944
Guido van Rossum3886bb61998-12-04 18:50:17 +00002945DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002946init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002947{
Guido van Rossum73624e91994-10-10 17:59:00 +00002948 PyObject *m, *d;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002949#ifdef RISCOS
2950 _kernel_swi_regs r;
2951 r.r[0]=0;
2952 _kernel_swi(0x43380, &r, &r);
2953 taskwindow = r.r[0];
2954#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00002955#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002956 if (!NTinit())
2957 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002958#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00002959#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002960 if (!OS2init())
2961 return;
Fred Drakea136d492000-08-16 14:18:30 +00002962#endif /* __TOS_OS2__ */
2963#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002964#endif /* RISCOS */
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002965#ifdef USE_SSL
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002966 PySSL_Type.ob_type = &PyType_Type;
Guido van Rossuma120ffc2001-01-22 15:29:14 +00002967#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00002968 m = Py_InitModule3("_socket", PySocket_methods, module_doc);
Guido van Rossum73624e91994-10-10 17:59:00 +00002969 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002970 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2971 if (PySocket_Error == NULL)
2972 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00002973 PyDict_SetItemString(d, "error", PySocket_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002974 PyH_Error = PyErr_NewException("socket.herror", PySocket_Error, NULL);
2975 if (PyH_Error == NULL)
2976 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00002977 PyDict_SetItemString(d, "herror", PyH_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002978 PyGAI_Error = PyErr_NewException("socket.gaierror", PySocket_Error,
2979 NULL);
2980 if (PyGAI_Error == NULL)
2981 return;
Martin v. Löwis864e9ff2001-08-04 22:32:03 +00002982 PyDict_SetItemString(d, "gaierror", PyGAI_Error);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002983#ifdef USE_SSL
2984 SSL_load_error_strings();
2985 SSLeay_add_ssl_algorithms();
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002986 PySSLErrorObject = PyErr_NewException("socket.sslerror", NULL, NULL);
2987 if (PySSLErrorObject == NULL)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002988 return;
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002989 PyDict_SetItemString(d, "sslerror", PySSLErrorObject);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002990 if (PyDict_SetItemString(d, "SSLType",
Jeremy Hylton5b6ce5a2001-10-10 23:55:43 +00002991 (PyObject *)&PySSL_Type) != 0)
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00002992 return;
Jeremy Hylton57ca8732001-10-11 00:00:17 +00002993 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
2994 SSL_ERROR_ZERO_RETURN);
2995 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
2996 SSL_ERROR_WANT_READ);
2997 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
2998 SSL_ERROR_WANT_WRITE);
2999 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
3000 SSL_ERROR_WANT_X509_LOOKUP);
3001 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
3002 SSL_ERROR_SYSCALL);
3003 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
3004 SSL_ERROR_SSL);
Guido van Rossum09c8b6c1999-12-07 21:37:17 +00003005#endif /* USE_SSL */
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00003006 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum82a5c661998-07-07 20:45:43 +00003007 PySocketSock_Type.tp_doc = sockettype_doc;
Guido van Rossum91ba64d1997-06-02 22:18:09 +00003008 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00003009 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003010 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003011
3012 /* Address families (we only support AF_INET and AF_UNIX) */
3013#ifdef AF_UNSPEC
3014 insint(d, "AF_UNSPEC", AF_UNSPEC);
3015#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003016 insint(d, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003017#ifdef AF_INET6
3018 insint(d, "AF_INET6", AF_INET6);
3019#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00003020#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003021 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003022#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003023#ifdef AF_AX25
3024 insint(d, "AF_AX25", AF_AX25); /* Amateur Radio AX.25 */
3025#endif
3026#ifdef AF_IPX
3027 insint(d, "AF_IPX", AF_IPX); /* Novell IPX */
3028#endif
3029#ifdef AF_APPLETALK
3030 insint(d, "AF_APPLETALK", AF_APPLETALK); /* Appletalk DDP */
3031#endif
3032#ifdef AF_NETROM
3033 insint(d, "AF_NETROM", AF_NETROM); /* Amateur radio NetROM */
3034#endif
3035#ifdef AF_BRIDGE
3036 insint(d, "AF_BRIDGE", AF_BRIDGE); /* Multiprotocol bridge */
3037#endif
3038#ifdef AF_AAL5
3039 insint(d, "AF_AAL5", AF_AAL5); /* Reserved for Werner's ATM */
3040#endif
3041#ifdef AF_X25
3042 insint(d, "AF_X25", AF_X25); /* Reserved for X.25 project */
3043#endif
3044#ifdef AF_INET6
3045 insint(d, "AF_INET6", AF_INET6); /* IP version 6 */
3046#endif
3047#ifdef AF_ROSE
3048 insint(d, "AF_ROSE", AF_ROSE); /* Amateur Radio X.25 PLP */
3049#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003050#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00003051 insint(d, "AF_PACKET", AF_PACKET);
3052 insint(d, "PF_PACKET", PF_PACKET);
3053 insint(d, "PACKET_HOST", PACKET_HOST);
3054 insint(d, "PACKET_BROADCAST", PACKET_BROADCAST);
3055 insint(d, "PACKET_MULTICAST", PACKET_MULTICAST);
3056 insint(d, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3057 insint(d, "PACKET_OUTGOING", PACKET_OUTGOING);
3058 insint(d, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3059 insint(d, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003060#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003061
3062 /* Socket types */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003063 insint(d, "SOCK_STREAM", SOCK_STREAM);
3064 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003065#ifndef __BEOS__
3066/* We have incomplete socket support. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003067 insint(d, "SOCK_RAW", SOCK_RAW);
3068 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
3069 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003070#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003071
3072#ifdef SO_DEBUG
3073 insint(d, "SO_DEBUG", SO_DEBUG);
3074#endif
3075#ifdef SO_ACCEPTCONN
3076 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
3077#endif
3078#ifdef SO_REUSEADDR
3079 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
3080#endif
3081#ifdef SO_KEEPALIVE
3082 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
3083#endif
3084#ifdef SO_DONTROUTE
3085 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
3086#endif
3087#ifdef SO_BROADCAST
3088 insint(d, "SO_BROADCAST", SO_BROADCAST);
3089#endif
3090#ifdef SO_USELOOPBACK
3091 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
3092#endif
3093#ifdef SO_LINGER
3094 insint(d, "SO_LINGER", SO_LINGER);
3095#endif
3096#ifdef SO_OOBINLINE
3097 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
3098#endif
3099#ifdef SO_REUSEPORT
3100 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
3101#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003102#ifdef SO_SNDBUF
3103 insint(d, "SO_SNDBUF", SO_SNDBUF);
3104#endif
3105#ifdef SO_RCVBUF
3106 insint(d, "SO_RCVBUF", SO_RCVBUF);
3107#endif
3108#ifdef SO_SNDLOWAT
3109 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
3110#endif
3111#ifdef SO_RCVLOWAT
3112 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
3113#endif
3114#ifdef SO_SNDTIMEO
3115 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
3116#endif
3117#ifdef SO_RCVTIMEO
3118 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
3119#endif
3120#ifdef SO_ERROR
3121 insint(d, "SO_ERROR", SO_ERROR);
3122#endif
3123#ifdef SO_TYPE
3124 insint(d, "SO_TYPE", SO_TYPE);
3125#endif
3126
3127 /* Maximum number of connections for "listen" */
3128#ifdef SOMAXCONN
3129 insint(d, "SOMAXCONN", SOMAXCONN);
3130#else
3131 insint(d, "SOMAXCONN", 5); /* Common value */
3132#endif
3133
3134 /* Flags for send, recv */
3135#ifdef MSG_OOB
3136 insint(d, "MSG_OOB", MSG_OOB);
3137#endif
3138#ifdef MSG_PEEK
3139 insint(d, "MSG_PEEK", MSG_PEEK);
3140#endif
3141#ifdef MSG_DONTROUTE
3142 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
3143#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003144#ifdef MSG_DONTWAIT
Guido van Rossum14f3f592000-04-25 21:53:58 +00003145 insint(d, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003146#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003147#ifdef MSG_EOR
3148 insint(d, "MSG_EOR", MSG_EOR);
3149#endif
3150#ifdef MSG_TRUNC
3151 insint(d, "MSG_TRUNC", MSG_TRUNC);
3152#endif
3153#ifdef MSG_CTRUNC
3154 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
3155#endif
3156#ifdef MSG_WAITALL
3157 insint(d, "MSG_WAITALL", MSG_WAITALL);
3158#endif
3159#ifdef MSG_BTAG
3160 insint(d, "MSG_BTAG", MSG_BTAG);
3161#endif
3162#ifdef MSG_ETAG
3163 insint(d, "MSG_ETAG", MSG_ETAG);
3164#endif
3165
3166 /* Protocol level and numbers, usable for [gs]etsockopt */
3167#ifdef SOL_SOCKET
3168 insint(d, "SOL_SOCKET", SOL_SOCKET);
3169#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003170#ifdef SOL_IP
3171 insint(d, "SOL_IP", SOL_IP);
3172#else
3173 insint(d, "SOL_IP", 0);
3174#endif
3175#ifdef SOL_IPX
3176 insint(d, "SOL_IPX", SOL_IPX);
3177#endif
3178#ifdef SOL_AX25
3179 insint(d, "SOL_AX25", SOL_AX25);
3180#endif
3181#ifdef SOL_ATALK
3182 insint(d, "SOL_ATALK", SOL_ATALK);
3183#endif
3184#ifdef SOL_NETROM
3185 insint(d, "SOL_NETROM", SOL_NETROM);
3186#endif
3187#ifdef SOL_ROSE
3188 insint(d, "SOL_ROSE", SOL_ROSE);
3189#endif
3190#ifdef SOL_TCP
3191 insint(d, "SOL_TCP", SOL_TCP);
3192#else
3193 insint(d, "SOL_TCP", 6);
3194#endif
3195#ifdef SOL_UDP
3196 insint(d, "SOL_UDP", SOL_UDP);
3197#else
3198 insint(d, "SOL_UDP", 17);
3199#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003200#ifdef IPPROTO_IP
3201 insint(d, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003202#else
3203 insint(d, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003204#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003205#ifdef IPPROTO_HOPOPTS
3206 insint(d, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
3207#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003208#ifdef IPPROTO_ICMP
3209 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003210#else
3211 insint(d, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003212#endif
3213#ifdef IPPROTO_IGMP
3214 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
3215#endif
3216#ifdef IPPROTO_GGP
3217 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
3218#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003219#ifdef IPPROTO_IPV4
3220 insint(d, "IPPROTO_IPV4", IPPROTO_IPV4);
3221#endif
3222#ifdef IPPROTO_IPIP
3223 insint(d, "IPPROTO_IPIP", IPPROTO_IPIP);
3224#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003225#ifdef IPPROTO_TCP
3226 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003227#else
3228 insint(d, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003229#endif
3230#ifdef IPPROTO_EGP
3231 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
3232#endif
3233#ifdef IPPROTO_PUP
3234 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
3235#endif
3236#ifdef IPPROTO_UDP
3237 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003238#else
3239 insint(d, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003240#endif
3241#ifdef IPPROTO_IDP
3242 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
3243#endif
3244#ifdef IPPROTO_HELLO
3245 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
3246#endif
3247#ifdef IPPROTO_ND
3248 insint(d, "IPPROTO_ND", IPPROTO_ND);
3249#endif
3250#ifdef IPPROTO_TP
3251 insint(d, "IPPROTO_TP", IPPROTO_TP);
3252#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003253#ifdef IPPROTO_IPV6
3254 insint(d, "IPPROTO_IPV6", IPPROTO_IPV6);
3255#endif
3256#ifdef IPPROTO_ROUTING
3257 insint(d, "IPPROTO_ROUTING", IPPROTO_ROUTING);
3258#endif
3259#ifdef IPPROTO_FRAGMENT
3260 insint(d, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
3261#endif
3262#ifdef IPPROTO_RSVP
3263 insint(d, "IPPROTO_RSVP", IPPROTO_RSVP);
3264#endif
3265#ifdef IPPROTO_GRE
3266 insint(d, "IPPROTO_GRE", IPPROTO_GRE);
3267#endif
3268#ifdef IPPROTO_ESP
3269 insint(d, "IPPROTO_ESP", IPPROTO_ESP);
3270#endif
3271#ifdef IPPROTO_AH
3272 insint(d, "IPPROTO_AH", IPPROTO_AH);
3273#endif
3274#ifdef IPPROTO_MOBILE
3275 insint(d, "IPPROTO_MOBILE", IPPROTO_MOBILE);
3276#endif
3277#ifdef IPPROTO_ICMPV6
3278 insint(d, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
3279#endif
3280#ifdef IPPROTO_NONE
3281 insint(d, "IPPROTO_NONE", IPPROTO_NONE);
3282#endif
3283#ifdef IPPROTO_DSTOPTS
3284 insint(d, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
3285#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003286#ifdef IPPROTO_XTP
3287 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
3288#endif
3289#ifdef IPPROTO_EON
3290 insint(d, "IPPROTO_EON", IPPROTO_EON);
3291#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003292#ifdef IPPROTO_PIM
3293 insint(d, "IPPROTO_PIM", IPPROTO_PIM);
3294#endif
3295#ifdef IPPROTO_IPCOMP
3296 insint(d, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
3297#endif
3298#ifdef IPPROTO_VRRP
3299 insint(d, "IPPROTO_VRRP", IPPROTO_VRRP);
3300#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003301#ifdef IPPROTO_BIP
3302 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
3303#endif
3304/**/
3305#ifdef IPPROTO_RAW
3306 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003307#else
3308 insint(d, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003309#endif
3310#ifdef IPPROTO_MAX
3311 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
3312#endif
3313
3314 /* Some port configuration */
3315#ifdef IPPORT_RESERVED
3316 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
3317#else
3318 insint(d, "IPPORT_RESERVED", 1024);
3319#endif
3320#ifdef IPPORT_USERRESERVED
3321 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
3322#else
3323 insint(d, "IPPORT_USERRESERVED", 5000);
3324#endif
3325
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003326 /* Some reserved IP v.4 addresses */
3327#ifdef INADDR_ANY
3328 insint(d, "INADDR_ANY", INADDR_ANY);
3329#else
3330 insint(d, "INADDR_ANY", 0x00000000);
3331#endif
3332#ifdef INADDR_BROADCAST
3333 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
3334#else
3335 insint(d, "INADDR_BROADCAST", 0xffffffff);
3336#endif
3337#ifdef INADDR_LOOPBACK
3338 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
3339#else
3340 insint(d, "INADDR_LOOPBACK", 0x7F000001);
3341#endif
3342#ifdef INADDR_UNSPEC_GROUP
3343 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
3344#else
3345 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
3346#endif
3347#ifdef INADDR_ALLHOSTS_GROUP
3348 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
3349#else
3350 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
3351#endif
3352#ifdef INADDR_MAX_LOCAL_GROUP
3353 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
3354#else
3355 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
3356#endif
3357#ifdef INADDR_NONE
3358 insint(d, "INADDR_NONE", INADDR_NONE);
3359#else
3360 insint(d, "INADDR_NONE", 0xffffffff);
3361#endif
3362
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003363 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003364#ifdef IP_OPTIONS
3365 insint(d, "IP_OPTIONS", IP_OPTIONS);
3366#endif
3367#ifdef IP_HDRINCL
3368 insint(d, "IP_HDRINCL", IP_HDRINCL);
3369#endif
3370#ifdef IP_TOS
3371 insint(d, "IP_TOS", IP_TOS);
3372#endif
3373#ifdef IP_TTL
3374 insint(d, "IP_TTL", IP_TTL);
3375#endif
3376#ifdef IP_RECVOPTS
3377 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
3378#endif
3379#ifdef IP_RECVRETOPTS
3380 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
3381#endif
3382#ifdef IP_RECVDSTADDR
3383 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
3384#endif
3385#ifdef IP_RETOPTS
3386 insint(d, "IP_RETOPTS", IP_RETOPTS);
3387#endif
3388#ifdef IP_MULTICAST_IF
3389 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
3390#endif
3391#ifdef IP_MULTICAST_TTL
3392 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
3393#endif
3394#ifdef IP_MULTICAST_LOOP
3395 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
3396#endif
3397#ifdef IP_ADD_MEMBERSHIP
3398 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
3399#endif
3400#ifdef IP_DROP_MEMBERSHIP
3401 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
3402#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003403#ifdef IP_DEFAULT_MULTICAST_TTL
3404 insint(d, "IP_DEFAULT_MULTICAST_TTL", IP_DEFAULT_MULTICAST_TTL);
3405#endif
3406#ifdef IP_DEFAULT_MULTICAST_LOOP
3407 insint(d, "IP_DEFAULT_MULTICAST_LOOP", IP_DEFAULT_MULTICAST_LOOP);
3408#endif
3409#ifdef IP_MAX_MEMBERSHIPS
3410 insint(d, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
3411#endif
3412
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003413 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3414#ifdef IPV6_JOIN_GROUP
3415 insint(d, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
3416#endif
3417#ifdef IPV6_LEAVE_GROUP
3418 insint(d, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
3419#endif
3420#ifdef IPV6_MULTICAST_HOPS
3421 insint(d, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
3422#endif
3423#ifdef IPV6_MULTICAST_IF
3424 insint(d, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
3425#endif
3426#ifdef IPV6_MULTICAST_LOOP
3427 insint(d, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
3428#endif
3429#ifdef IPV6_UNICAST_HOPS
3430 insint(d, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
3431#endif
3432
Guido van Rossum09be4091999-08-09 14:40:40 +00003433 /* TCP options */
3434#ifdef TCP_NODELAY
3435 insint(d, "TCP_NODELAY", TCP_NODELAY);
3436#endif
3437#ifdef TCP_MAXSEG
3438 insint(d, "TCP_MAXSEG", TCP_MAXSEG);
3439#endif
3440
3441 /* IPX options */
3442#ifdef IPX_TYPE
3443 insint(d, "IPX_TYPE", IPX_TYPE);
3444#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003445
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003446 /* get{addr,name}info parameters */
3447#ifdef EAI_ADDRFAMILY
3448 insint(d, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
3449#endif
3450#ifdef EAI_AGAIN
3451 insint(d, "EAI_AGAIN", EAI_AGAIN);
3452#endif
3453#ifdef EAI_BADFLAGS
3454 insint(d, "EAI_BADFLAGS", EAI_BADFLAGS);
3455#endif
3456#ifdef EAI_FAIL
3457 insint(d, "EAI_FAIL", EAI_FAIL);
3458#endif
3459#ifdef EAI_FAMILY
3460 insint(d, "EAI_FAMILY", EAI_FAMILY);
3461#endif
3462#ifdef EAI_MEMORY
3463 insint(d, "EAI_MEMORY", EAI_MEMORY);
3464#endif
3465#ifdef EAI_NODATA
3466 insint(d, "EAI_NODATA", EAI_NODATA);
3467#endif
3468#ifdef EAI_NONAME
3469 insint(d, "EAI_NONAME", EAI_NONAME);
3470#endif
3471#ifdef EAI_SERVICE
3472 insint(d, "EAI_SERVICE", EAI_SERVICE);
3473#endif
3474#ifdef EAI_SOCKTYPE
3475 insint(d, "EAI_SOCKTYPE", EAI_SOCKTYPE);
3476#endif
3477#ifdef EAI_SYSTEM
3478 insint(d, "EAI_SYSTEM", EAI_SYSTEM);
3479#endif
3480#ifdef EAI_BADHINTS
3481 insint(d, "EAI_BADHINTS", EAI_BADHINTS);
3482#endif
3483#ifdef EAI_PROTOCOL
3484 insint(d, "EAI_PROTOCOL", EAI_PROTOCOL);
3485#endif
3486#ifdef EAI_MAX
3487 insint(d, "EAI_MAX", EAI_MAX);
3488#endif
3489#ifdef AI_PASSIVE
3490 insint(d, "AI_PASSIVE", AI_PASSIVE);
3491#endif
3492#ifdef AI_CANONNAME
3493 insint(d, "AI_CANONNAME", AI_CANONNAME);
3494#endif
3495#ifdef AI_NUMERICHOST
3496 insint(d, "AI_NUMERICHOST", AI_NUMERICHOST);
3497#endif
3498#ifdef AI_MASK
3499 insint(d, "AI_MASK", AI_MASK);
3500#endif
3501#ifdef AI_ALL
3502 insint(d, "AI_ALL", AI_ALL);
3503#endif
3504#ifdef AI_V4MAPPED_CFG
3505 insint(d, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
3506#endif
3507#ifdef AI_ADDRCONFIG
3508 insint(d, "AI_ADDRCONFIG", AI_ADDRCONFIG);
3509#endif
3510#ifdef AI_V4MAPPED
3511 insint(d, "AI_V4MAPPED", AI_V4MAPPED);
3512#endif
3513#ifdef AI_DEFAULT
3514 insint(d, "AI_DEFAULT", AI_DEFAULT);
3515#endif
3516#ifdef NI_MAXHOST
3517 insint(d, "NI_MAXHOST", NI_MAXHOST);
3518#endif
3519#ifdef NI_MAXSERV
3520 insint(d, "NI_MAXSERV", NI_MAXSERV);
3521#endif
3522#ifdef NI_NOFQDN
3523 insint(d, "NI_NOFQDN", NI_NOFQDN);
3524#endif
3525#ifdef NI_NUMERICHOST
3526 insint(d, "NI_NUMERICHOST", NI_NUMERICHOST);
3527#endif
3528#ifdef NI_NAMEREQD
3529 insint(d, "NI_NAMEREQD", NI_NAMEREQD);
3530#endif
3531#ifdef NI_NUMERICSERV
3532 insint(d, "NI_NUMERICSERV", NI_NUMERICSERV);
3533#endif
3534#ifdef NI_DGRAM
3535 insint(d, "NI_DGRAM", NI_DGRAM);
3536#endif
3537
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003538 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003539#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003540 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003541#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003542}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003543
3544/* Simplistic emulation code for inet_pton that only works for IPv4 */
3545#ifndef HAVE_INET_PTON
Martin v. Löwisa2ca1ae2001-06-24 21:35:43 +00003546int
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003547inet_pton (int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003548{
3549 if(af == AF_INET){
3550 long packed_addr;
3551#ifdef USE_GUSI1
3552 packed_addr = (long)inet_addr(src).s_addr;
3553#else
3554 packed_addr = inet_addr(src);
3555#endif
3556 if (packed_addr == INADDR_NONE)
3557 return 0;
3558 memcpy(dst, &packed_addr, 4);
3559 return 1;
3560 }
3561 /* Should set errno to EAFNOSUPPORT */
3562 return -1;
3563}
3564
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003565const char *
3566inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003567{
3568 if (af == AF_INET) {
3569 struct in_addr packed_addr;
3570 if (size < 16)
3571 /* Should set errno to ENOSPC. */
3572 return NULL;
3573 memcpy(&packed_addr, src, sizeof(packed_addr));
3574 return strncpy(dst, inet_ntoa(packed_addr), size);
3575 }
3576 /* Should set errno to EAFNOSUPPORT */
3577 return NULL;
3578}
3579#endif