blob: 27eb31334989d9b9579fb977cc5670a0337e280e [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/***********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossum6574b3e1991-06-25 21:36:08 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossum6574b3e1991-06-25 21:36:08 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000029
30******************************************************************/
31
32/* Socket module */
33
34/*
35This module provides an interface to Berkeley socket IPC.
36
37Limitations:
38
Guido van Rossum30a685f1991-06-27 15:51:29 +000039- only AF_INET and AF_UNIX address families are supported
Guido van Rossum81194471991-07-27 21:42:02 +000040- no read/write operations (use send/recv or makefile instead)
Guido van Rossumbe32c891996-06-20 16:25:29 +000041- additional restrictions apply on Windows
Guido van Rossum6574b3e1991-06-25 21:36:08 +000042
Guido van Rossum27e177d1995-03-16 15:43:47 +000043Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000044
Guido van Rossum27e177d1995-03-16 15:43:47 +000045- socket.error: exception raised for socket specific errors
Guido van Rossum30a685f1991-06-27 15:51:29 +000046- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000047- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000048- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000049- socket.getprotobyname(protocolname) --> protocol number
Guido van Rossum27e177d1995-03-16 15:43:47 +000050- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000051- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum006bf911996-06-12 04:04:55 +000052- socket.ntohs(16 bit value) --> new int object
53- socket.ntohl(32 bit value) --> new int object
54- socket.htons(16 bit value) --> new int object
55- socket.htonl(32 bit value) --> new int object
Guido van Rossum27e177d1995-03-16 15:43:47 +000056- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +000057- an Internet socket address is a pair (hostname, port)
58 where hostname can be anything recognized by gethostbyname()
59 (including the dd.dd.dd.dd notation) and port is in host byte order
60- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000061- a UNIX domain socket address is a string specifying the pathname
Guido van Rossum6574b3e1991-06-25 21:36:08 +000062
Guido van Rossum30a685f1991-06-27 15:51:29 +000063Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000064
Guido van Rossum81194471991-07-27 21:42:02 +000065- s.accept() --> new socket object, sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000066- s.bind(sockaddr) --> None
67- s.close() --> None
68- s.connect(sockaddr) --> None
69- s.fileno() --> file descriptor
Guido van Rossumbe32c891996-06-20 16:25:29 +000070- s.dup() --> same as socket.fromfd(os.dup(s.fileno(), ...)
Guido van Rossumc89705d1992-11-26 08:54:07 +000071- s.getpeername() --> sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000072- s.getsockname() --> sockaddr
73- s.getsockopt(level, optname[, buflen]) --> int or string
74- s.listen(backlog) --> None
Guido van Rossum6b144911995-03-14 15:05:13 +000075- s.makefile([mode[, bufsize]]) --> file object
Guido van Rossum27e177d1995-03-16 15:43:47 +000076- s.recv(buflen [,flags]) --> string
77- s.recvfrom(buflen [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000078- s.send(string [,flags]) --> nbytes
79- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum27e177d1995-03-16 15:43:47 +000080- s.setblocking(0 | 1) --> None
81- s.setsockopt(level, optname, value) --> None
82- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000083- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000084
Guido van Rossum6574b3e1991-06-25 21:36:08 +000085*/
86
Guido van Rossum73624e91994-10-10 17:59:00 +000087#include "Python.h"
Guido van Rossum6574b3e1991-06-25 21:36:08 +000088
Guido van Rossuma376cc51996-12-05 23:43:35 +000089#ifdef HAVE_UNISTD_H
90#include <unistd.h>
91#endif
92
Guido van Rossumfb4130d1996-12-10 15:17:08 +000093#ifndef MS_WINDOWS
94extern int gethostname(); /* For Solaris, at least */
95#endif
96
Guido van Rossumb6775db1994-08-01 11:34:53 +000097#include <sys/types.h>
98#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +000099
Guido van Rossum81194471991-07-27 21:42:02 +0000100#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000101#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000102#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000103#include <sys/socket.h>
104#include <netinet/in.h>
Guido van Rossume4485b01994-09-07 14:32:49 +0000105#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000106#else
107#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000108#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000109#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000110#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000111#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000112#else
113#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000114#endif
115
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000116#ifndef O_NDELAY
117#define O_NDELAY O_NONBLOCK /* For QNX only? */
118#endif
119
Jack Jansen508537b1996-02-14 15:57:45 +0000120#ifdef USE_GUSI
121/* fdopen() isn't declared in stdio.h (sigh) */
122#include <GUSI.h>
123#endif
124
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000125
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000126/* Here we have some hacks to choose between K&R or ANSI style function
127 definitions. For NT to build this as an extension module (ie, DLL)
128 it must be compiled by the C++ compiler, as it takes the address of
129 a static data item exported from the main Python DLL.
130*/
Guido van Rossum8d665e61996-06-26 18:22:49 +0000131#ifdef MS_WINDOWS
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000132/* seem to be a few differences in the API */
133#define close closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000134#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000135#define FORCE_ANSI_FUNC_DEFS
136#endif
137
138#ifdef FORCE_ANSI_FUNC_DEFS
139#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
140fnname( arg1type arg1name )
141
142#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
143fnname( arg1type arg1name, arg2type arg2name )
144
145#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
146fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
147
148#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
149fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
150
151#else /* !FORCE_ANSI_FN_DEFS */
152#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
153fnname( arg1name ) \
154 arg1type arg1name;
155
156#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
157fnname( arg1name, arg2name ) \
158 arg1type arg1name; \
159 arg2type arg2name;
160
161#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
162fnname( arg1name, arg2name, arg3name ) \
163 arg1type arg1name; \
164 arg2type arg2name; \
165 arg3type arg3name;
166
167#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
168fnname( arg1name, arg2name, arg3name, arg4name ) \
169 arg1type arg1name; \
170 arg2type arg2name; \
171 arg3type arg3name; \
172 arg4type arg4name;
173
174#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000175
176/* Global variable holding the exception type for errors detected
177 by this module (but not argument type or memory errors, etc.). */
178
Guido van Rossum73624e91994-10-10 17:59:00 +0000179static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000180
181
182/* Convenience function to raise an error according to errno
183 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000184
Guido van Rossum73624e91994-10-10 17:59:00 +0000185static PyObject *
186PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000187{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000188#ifdef MS_WINDOWS
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000189 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000190 PyObject *v;
191 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000192 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000193 PyErr_SetObject(PySocket_Error, v);
194 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000195 }
196 return NULL;
197 }
198 else
199#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000200 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000201}
202
Guido van Rossum30a685f1991-06-27 15:51:29 +0000203
204/* The object holding a socket. It holds some extra information,
205 like the address family, which is used to decode socket address
206 arguments properly. */
207
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000208typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000209 PyObject_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000210 int sock_fd; /* Socket file descriptor */
211 int sock_family; /* Address family, e.g., AF_INET */
212 int sock_type; /* Socket type, e.g., SOCK_STREAM */
213 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000214 union sock_addr {
215 struct sockaddr_in in;
216#ifdef AF_UNIX
217 struct sockaddr_un un;
218#endif
219 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000220} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000221
Guido van Rossum30a685f1991-06-27 15:51:29 +0000222
223/* A forward reference to the Socktype type object.
224 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000225 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000226 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000227
Guido van Rossum73624e91994-10-10 17:59:00 +0000228staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000229
Guido van Rossum30a685f1991-06-27 15:51:29 +0000230
231/* Create a new socket object.
232 This just creates the object and initializes it.
233 If the creation fails, return NULL and set an exception (implicit
234 in NEWOBJ()). */
235
Guido van Rossum73624e91994-10-10 17:59:00 +0000236static PySocketSockObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000237BUILD_FUNC_DEF_4(PySocketSock_New,int,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000238{
Guido van Rossum73624e91994-10-10 17:59:00 +0000239 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000240 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum73624e91994-10-10 17:59:00 +0000241 s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000242 if (s != NULL) {
243 s->sock_fd = fd;
244 s->sock_family = family;
245 s->sock_type = type;
246 s->sock_proto = proto;
247 }
248 return s;
249}
250
Guido van Rossum30a685f1991-06-27 15:51:29 +0000251
252/* Convert a string specifying a host name or one of a few symbolic
253 names to a numeric IP address. This usually calls gethostbyname()
254 to do the work; the names "" and "<broadcast>" are special.
255 Return the length (should always be 4 bytes), or negative if
256 an error occurred; then an exception is raised. */
257
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000258static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000259BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000260{
261 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000262 int d1, d2, d3, d4;
263 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000264#ifdef HAVE_GETHOSTBYNAME_R
265 struct hostent hp_allocated;
266 char buf[1001];
267 int buf_len = (sizeof buf) - 1;
268 int errnop;
269#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000270
Guido van Rossuma376cc51996-12-05 23:43:35 +0000271 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000272 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000273 addr_ret->sin_addr.s_addr = INADDR_ANY;
274 return 4;
275 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000276 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000277 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
278 return 4;
279 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000280 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
281 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
282 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
283 addr_ret->sin_addr.s_addr = htonl(
284 ((long) d1 << 24) | ((long) d2 << 16) |
285 ((long) d3 << 8) | ((long) d4 << 0));
286 return 4;
287 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000288#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum73624e91994-10-10 17:59:00 +0000289 Py_BEGIN_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000290 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum73624e91994-10-10 17:59:00 +0000291 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000292#else /* not HAVE_GETHOSTBYNAME_R */
293 hp = gethostbyname(name);
294#endif /* HAVE_GETHOSTBYNAME_R */
295
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000296 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000297#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000298 /* Let's get real error message to return */
299 extern int h_errno;
300 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
301#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000302 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000303#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000304 return -1;
305 }
306 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
307 return hp->h_length;
308}
309
Guido van Rossum30a685f1991-06-27 15:51:29 +0000310
Guido van Rossum30a685f1991-06-27 15:51:29 +0000311/* Create a string object representing an IP address.
312 This is always a string of the form 'dd.dd.dd.dd' (with variable
313 size numbers). */
314
Guido van Rossum73624e91994-10-10 17:59:00 +0000315static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000316BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000317{
318 long x = ntohl(addr->sin_addr.s_addr);
319 char buf[100];
320 sprintf(buf, "%d.%d.%d.%d",
321 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
322 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000323 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000324}
325
326
327/* Create an object representing the given socket address,
328 suitable for passing it back to bind(), connect() etc.
329 The family field of the sockaddr structure is inspected
330 to determine what kind of address it really is. */
331
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000332/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000333static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000334BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000335{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000336 if (addrlen == 0) {
337 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000338 Py_INCREF(Py_None);
339 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000340 }
341
Guido van Rossum30a685f1991-06-27 15:51:29 +0000342 switch (addr->sa_family) {
343
344 case AF_INET:
345 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000346 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000347 PyObject *addrobj = makeipaddr(a);
348 PyObject *ret = NULL;
349 if (addrobj) {
350 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
351 Py_DECREF(addrobj);
352 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000353 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000354 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000355
Guido van Rossumb6775db1994-08-01 11:34:53 +0000356#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000357 case AF_UNIX:
358 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000359 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000360 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000361 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000362#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000363
364 /* More cases here... */
365
366 default:
Barry Warsaw752300b1997-01-03 17:18:10 +0000367 PyErr_SetString(PySocket_Error,
368 "return unknown socket address type");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000369 return NULL;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000370
Guido van Rossum30a685f1991-06-27 15:51:29 +0000371 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000372}
373
Guido van Rossum30a685f1991-06-27 15:51:29 +0000374
375/* Parse a socket address argument according to the socket object's
376 address family. Return 1 if the address was in the proper format,
377 0 of not. The address is returned through addr_ret, its length
378 through len_ret. */
379
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000380static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000381BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000382getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000383{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000384 switch (s->sock_family) {
385
Guido van Rossumb6775db1994-08-01 11:34:53 +0000386#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000387 case AF_UNIX:
388 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000389 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000390 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000391 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000392 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum73624e91994-10-10 17:59:00 +0000393 if (!PyArg_Parse(args, "s#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000394 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000395 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000396 PyErr_SetString(PySocket_Error,
397 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000398 return 0;
399 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000400 addr->sun_family = AF_UNIX;
401 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000402 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000403 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000404 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000405 return 1;
406 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000407#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000408
Guido van Rossum30a685f1991-06-27 15:51:29 +0000409 case AF_INET:
410 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000411 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000412 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000413 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000414 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000415 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000416 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000417 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000418 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000419 addr->sin_family = AF_INET;
420 addr->sin_port = htons(port);
421 *addr_ret = (struct sockaddr *) addr;
422 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000423 return 1;
424 }
425
Guido van Rossum30a685f1991-06-27 15:51:29 +0000426 /* More cases here... */
427
428 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000429 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000430 return 0;
431
432 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000433}
434
Guido van Rossum30a685f1991-06-27 15:51:29 +0000435
Guido van Rossum710e1df1992-06-12 10:39:36 +0000436/* Get the address length according to the socket object's address family.
437 Return 1 if the family is known, 0 otherwise. The length is returned
438 through len_ret. */
439
440static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000441BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000442{
443 switch (s->sock_family) {
444
Guido van Rossumb6775db1994-08-01 11:34:53 +0000445#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000446 case AF_UNIX:
447 {
448 *len_ret = sizeof (struct sockaddr_un);
449 return 1;
450 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000451#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000452
453 case AF_INET:
454 {
455 *len_ret = sizeof (struct sockaddr_in);
456 return 1;
457 }
458
459 /* More cases here... */
460
461 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000462 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000463 return 0;
464
465 }
466}
467
468
Guido van Rossum30a685f1991-06-27 15:51:29 +0000469/* s.accept() method */
470
Guido van Rossum73624e91994-10-10 17:59:00 +0000471static PyObject *
472BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000473{
474 char addrbuf[256];
475 int addrlen, newfd;
Barry Warsaw752300b1997-01-03 17:18:10 +0000476 PyObject *sock = NULL;
477 PyObject *addr = NULL;
478 PyObject *res = NULL;
479
Guido van Rossum73624e91994-10-10 17:59:00 +0000480 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000481 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000482 if (!getsockaddrlen(s, &addrlen))
483 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000484 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000485 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000486 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000487 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000488 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000489
Guido van Rossum30a685f1991-06-27 15:51:29 +0000490 /* Create the new object with unspecified family,
491 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000492 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000493 s->sock_family,
494 s->sock_type,
495 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000496 if (sock == NULL) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000497 close(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000498 goto finally;
499 }
500 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
501 goto finally;
502
503 if (!(res = Py_BuildValue("OO", sock, addr)))
504 goto finally;
505
506 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000507 Py_XDECREF(sock);
508 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000509 return res;
510}
511
Guido van Rossum30a685f1991-06-27 15:51:29 +0000512
Guido van Rossume4485b01994-09-07 14:32:49 +0000513/* s.setblocking(1 | 0) method */
514
Guido van Rossum73624e91994-10-10 17:59:00 +0000515static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000516BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000517{
518 int block;
519 int delay_flag;
Guido van Rossum73624e91994-10-10 17:59:00 +0000520 if (!PyArg_GetInt(args, &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000521 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000522 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +0000523#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000524 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
525 if (block)
526 delay_flag &= (~O_NDELAY);
527 else
528 delay_flag |= O_NDELAY;
529 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000530#else
531 block = !block;
532 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
533#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000534 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000535
Guido van Rossum73624e91994-10-10 17:59:00 +0000536 Py_INCREF(Py_None);
537 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000538}
Guido van Rossume4485b01994-09-07 14:32:49 +0000539
540
Guido van Rossumaee08791992-09-08 09:05:33 +0000541/* s.setsockopt() method.
542 With an integer third argument, sets an integer option.
543 With a string third argument, sets an option from a buffer;
544 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000545
Guido van Rossum73624e91994-10-10 17:59:00 +0000546static PyObject *
547BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000548{
549 int level;
550 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000551 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000552 char *buf;
553 int buflen;
554 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000555
Guido van Rossum73624e91994-10-10 17:59:00 +0000556 if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000557 buf = (char *) &flag;
558 buflen = sizeof flag;
559 }
560 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000561 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +0000562 if (!PyArg_Parse(args, "(iis#)", &level, &optname,
563 &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000564 return NULL;
565 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000566 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000567 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000568 return PySocket_Err();
569 Py_INCREF(Py_None);
570 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000571}
572
573
Guido van Rossumaee08791992-09-08 09:05:33 +0000574/* s.getsockopt() method.
575 With two arguments, retrieves an integer option.
576 With a third integer argument, retrieves a string buffer of that size;
577 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000578
Guido van Rossum73624e91994-10-10 17:59:00 +0000579static PyObject *
580BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000581{
582 int level;
583 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000584 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000585 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000586 int buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000587
Guido van Rossumbe32c891996-06-20 16:25:29 +0000588 if (!PyArg_ParseTuple(args, "ii|i", &level, &optname, &buflen))
589 return NULL;
590
591 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000592 int flag = 0;
593 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000594 res = getsockopt(s->sock_fd, level, optname,
595 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000596 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000597 return PySocket_Err();
598 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000599 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000600 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000601 PyErr_SetString(PySocket_Error,
602 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000603 return NULL;
604 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000605 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000606 if (buf == NULL)
607 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000608 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000609 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000610 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000611 Py_DECREF(buf);
612 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000613 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000614 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000615 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000616}
617
618
Guido van Rossum30a685f1991-06-27 15:51:29 +0000619/* s.bind(sockaddr) method */
620
Guido van Rossum73624e91994-10-10 17:59:00 +0000621static PyObject *
622BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000623{
624 struct sockaddr *addr;
625 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000626 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000627 if (!getsockaddrarg(s, args, &addr, &addrlen))
628 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000629 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000630 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000631 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000632 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000633 return PySocket_Err();
634 Py_INCREF(Py_None);
635 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000636}
637
Guido van Rossum30a685f1991-06-27 15:51:29 +0000638
639/* s.close() method.
640 Set the file descriptor to -1 so operations tried subsequently
641 will surely fail. */
642
Guido van Rossum73624e91994-10-10 17:59:00 +0000643static PyObject *
644BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000645{
Guido van Rossum73624e91994-10-10 17:59:00 +0000646 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000647 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000648 if (s->sock_fd != -1) {
649 Py_BEGIN_ALLOW_THREADS
650 (void) close(s->sock_fd);
651 Py_END_ALLOW_THREADS
652 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000653 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000654 Py_INCREF(Py_None);
655 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000656}
657
Guido van Rossum30a685f1991-06-27 15:51:29 +0000658
659/* s.connect(sockaddr) method */
660
Guido van Rossum73624e91994-10-10 17:59:00 +0000661static PyObject *
662BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000663{
664 struct sockaddr *addr;
665 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000666 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000667 if (!getsockaddrarg(s, args, &addr, &addrlen))
668 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000669 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000670 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000671 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000672 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000673 return PySocket_Err();
674 Py_INCREF(Py_None);
675 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000676}
677
Guido van Rossum30a685f1991-06-27 15:51:29 +0000678
Guido van Rossumed233a51992-06-23 09:07:03 +0000679/* s.fileno() method */
680
Guido van Rossum73624e91994-10-10 17:59:00 +0000681static PyObject *
682BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000683{
Guido van Rossum73624e91994-10-10 17:59:00 +0000684 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000685 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000686 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000687}
688
689
Guido van Rossumbe32c891996-06-20 16:25:29 +0000690#ifndef NO_DUP
691/* s.dup() method */
692
693static PyObject *
694BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
695{
696 int newfd;
697 PyObject *sock;
698 if (!PyArg_NoArgs(args))
699 return NULL;
700 newfd = dup(s->sock_fd);
701 if (newfd < 0)
702 return PySocket_Err();
703 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +0000704 s->sock_family,
705 s->sock_type,
706 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +0000707 if (sock == NULL)
708 close(newfd);
709 return sock;
710}
711#endif
712
713
Guido van Rossumc89705d1992-11-26 08:54:07 +0000714/* s.getsockname() method */
715
Guido van Rossum73624e91994-10-10 17:59:00 +0000716static PyObject *
717BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000718{
719 char addrbuf[256];
720 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000721 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000722 return NULL;
723 if (!getsockaddrlen(s, &addrlen))
724 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +0000725 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000726 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000727 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000728 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000729 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000730 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000731 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
732}
733
734
Guido van Rossumb6775db1994-08-01 11:34:53 +0000735#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000736/* s.getpeername() method */
737
Guido van Rossum73624e91994-10-10 17:59:00 +0000738static PyObject *
739BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000740{
741 char addrbuf[256];
742 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000743 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000744 return NULL;
745 if (!getsockaddrlen(s, &addrlen))
746 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000747 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000748 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000749 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000750 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000751 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000752 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
753}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000754#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000755
756
Guido van Rossum30a685f1991-06-27 15:51:29 +0000757/* s.listen(n) method */
758
Guido van Rossum73624e91994-10-10 17:59:00 +0000759static PyObject *
760BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000761{
762 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000763 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000764 if (!PyArg_GetInt(args, &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000765 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000766 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000767 if (backlog < 1)
768 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000769 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +0000770 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000771 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000772 return PySocket_Err();
773 Py_INCREF(Py_None);
774 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000775}
776
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000777#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +0000778/* s.makefile(mode) method.
779 Create a new open file object referring to a dupped version of
780 the socket's file descriptor. (The dup() call is necessary so
781 that the open file and socket objects may be closed independent
782 of each other.)
783 The mode argument specifies 'r' or 'w' passed to fdopen(). */
784
Guido van Rossum73624e91994-10-10 17:59:00 +0000785static PyObject *
786BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000787{
Guido van Rossuma597dde1995-01-10 20:56:29 +0000788 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +0000789 char *mode = "r";
790 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000791 int fd;
792 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +0000793 PyObject *f;
794
795 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000796 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +0000797#ifdef MS_WIN32
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000798 if ( ((fd = _open_osfhandle( s->sock_fd, _O_BINARY )) < 0) ||
799 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL)) {
800#else
Guido van Rossum30a685f1991-06-27 15:51:29 +0000801 if ((fd = dup(s->sock_fd)) < 0 ||
Guido van Rossum6b144911995-03-14 15:05:13 +0000802 (fp = fdopen(fd, mode)) == NULL) {
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000803#endif
Guido van Rossum6b144911995-03-14 15:05:13 +0000804 if (fd >= 0)
805 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000806 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +0000807 }
808 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
809 if (f != NULL)
810 PyFile_SetBufSize(f, bufsize);
811 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000812}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000813#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000814
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000815/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000816
Guido van Rossum73624e91994-10-10 17:59:00 +0000817static PyObject *
818BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000819{
Guido van Rossumbe32c891996-06-20 16:25:29 +0000820 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000821 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000822 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
823 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000824 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000825 if (buf == NULL)
826 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000827 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +0000828 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000829 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +0000830 if (n < 0) {
831 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +0000832 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +0000833 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +0000834 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000835 return NULL;
836 return buf;
837}
838
Guido van Rossum30a685f1991-06-27 15:51:29 +0000839
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000840/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000841
Guido van Rossum73624e91994-10-10 17:59:00 +0000842static PyObject *
843BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000844{
845 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +0000846 PyObject *buf = NULL;
847 PyObject *addr = NULL;
848 PyObject *ret = NULL;
849
Guido van Rossumbe32c891996-06-20 16:25:29 +0000850 int addrlen, len, n, flags = 0;
851 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
852 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000853 if (!getsockaddrlen(s, &addrlen))
854 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000855 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000856 if (buf == NULL)
857 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000858 Py_BEGIN_ALLOW_THREADS
859 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +0000860#ifndef MS_WINDOWS
Barry Warsaw752300b1997-01-03 17:18:10 +0000861 (ANY *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000862#else
Barry Warsaw752300b1997-01-03 17:18:10 +0000863 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000864#endif
Barry Warsaw752300b1997-01-03 17:18:10 +0000865 );
Guido van Rossum73624e91994-10-10 17:59:00 +0000866 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +0000867 if (n < 0) {
868 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +0000869 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +0000870 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +0000871 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000872 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +0000873
874 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
875 goto finally;
876
Guido van Rossum73624e91994-10-10 17:59:00 +0000877 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000878 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000879 Py_XDECREF(addr);
880 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000881 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000882}
883
Guido van Rossum30a685f1991-06-27 15:51:29 +0000884
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000885/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000886
Guido van Rossum73624e91994-10-10 17:59:00 +0000887static PyObject *
888BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000889{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000890 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000891 int len, n, flags = 0;
892 if (!PyArg_ParseTuple(args, "s#|i", &buf, &len, &flags))
893 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000894 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000895 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000896 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +0000897 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000898 return PySocket_Err();
899 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000900}
901
902
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000903/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000904
Guido van Rossum73624e91994-10-10 17:59:00 +0000905static PyObject *
906BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000907{
Guido van Rossum73624e91994-10-10 17:59:00 +0000908 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000909 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000910 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000911 int addrlen, len, n, flags;
912 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000913 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
914 PyErr_Clear();
915 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000916 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000917 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000918 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000919 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000920 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000921 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000922 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000923 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000924 return PySocket_Err();
925 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000926}
927
Guido van Rossum30a685f1991-06-27 15:51:29 +0000928
929/* s.shutdown(how) method */
930
Guido van Rossum73624e91994-10-10 17:59:00 +0000931static PyObject *
932BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000933{
934 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000935 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000936 if (!PyArg_GetInt(args, &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000937 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000938 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000939 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +0000940 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000941 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000942 return PySocket_Err();
943 Py_INCREF(Py_None);
944 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000945}
946
Guido van Rossum30a685f1991-06-27 15:51:29 +0000947
948/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000949
Guido van Rossum73624e91994-10-10 17:59:00 +0000950static PyMethodDef PySocketSock_methods[] = {
951 {"accept", (PyCFunction)PySocketSock_accept},
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000952 {"setblocking", (PyCFunction)PySocketSock_setblocking},
Guido van Rossum73624e91994-10-10 17:59:00 +0000953 {"setsockopt", (PyCFunction)PySocketSock_setsockopt},
Guido van Rossumbe32c891996-06-20 16:25:29 +0000954 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1},
Guido van Rossum73624e91994-10-10 17:59:00 +0000955 {"bind", (PyCFunction)PySocketSock_bind},
956 {"close", (PyCFunction)PySocketSock_close},
957 {"connect", (PyCFunction)PySocketSock_connect},
958 {"fileno", (PyCFunction)PySocketSock_fileno},
Guido van Rossumbe32c891996-06-20 16:25:29 +0000959#ifndef NO_DUP
960 {"dup", (PyCFunction)PySocketSock_dup},
961#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000962 {"getsockname", (PyCFunction)PySocketSock_getsockname},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000963#ifdef HAVE_GETPEERNAME
Guido van Rossum73624e91994-10-10 17:59:00 +0000964 {"getpeername", (PyCFunction)PySocketSock_getpeername},
Guido van Rossum9575a441993-04-07 14:06:14 +0000965#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000966 {"listen", (PyCFunction)PySocketSock_listen},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000967#ifndef NO_DUP
Guido van Rossum6b144911995-03-14 15:05:13 +0000968 {"makefile", (PyCFunction)PySocketSock_makefile, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000969#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +0000970 {"recv", (PyCFunction)PySocketSock_recv, 1},
971 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1},
972 {"send", (PyCFunction)PySocketSock_send, 1},
Guido van Rossum73624e91994-10-10 17:59:00 +0000973 {"sendto", (PyCFunction)PySocketSock_sendto},
974 {"shutdown", (PyCFunction)PySocketSock_shutdown},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000975 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000976};
977
Guido van Rossum30a685f1991-06-27 15:51:29 +0000978
Guido van Rossum73624e91994-10-10 17:59:00 +0000979/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +0000980 First close the file description. */
981
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000982static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000983BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000984{
985 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000986 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000987}
988
Guido van Rossum30a685f1991-06-27 15:51:29 +0000989
990/* Return a socket object's named attribute. */
991
Guido van Rossum73624e91994-10-10 17:59:00 +0000992static PyObject *
993BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000994{
Guido van Rossum73624e91994-10-10 17:59:00 +0000995 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000996}
997
Guido van Rossum30a685f1991-06-27 15:51:29 +0000998
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000999static PyObject *
1000BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
1001{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001002 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001003 sprintf(buf,
1004 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
1005 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001006 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001007}
1008
1009
Guido van Rossumb6775db1994-08-01 11:34:53 +00001010/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001011
Guido van Rossum73624e91994-10-10 17:59:00 +00001012static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001013 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001014 0,
1015 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001016 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001017 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001018 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001019 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001020 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001021 0, /*tp_setattr*/
1022 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001023 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001024 0, /*tp_as_number*/
1025 0, /*tp_as_sequence*/
1026 0, /*tp_as_mapping*/
1027};
1028
Guido van Rossum30a685f1991-06-27 15:51:29 +00001029
Guido van Rossum81194471991-07-27 21:42:02 +00001030/* Python interface to gethostname(). */
1031
1032/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001033static PyObject *
1034BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001035{
1036 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001037 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001038 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +00001039 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001040 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001041 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001042 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001043 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001044 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001045 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001046 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001047}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001048
1049
Guido van Rossum30a685f1991-06-27 15:51:29 +00001050/* Python interface to gethostbyname(name). */
1051
1052/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001053static PyObject *
1054BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001055{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001056 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001057 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +00001058 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001059 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001060 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001061 return NULL;
1062 return makeipaddr(&addrbuf);
1063}
1064
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001065/* Python interface to gethostbyaddr(IP). */
1066
1067/*ARGSUSED*/
1068static PyObject *
1069BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1070{
1071 struct sockaddr_in addr;
1072 char *ip_num;
1073 struct hostent *h;
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001074 char **pch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001075 PyObject *rtn_tuple = (PyObject *)NULL;
1076 PyObject *name_list = (PyObject *)NULL;
1077 PyObject *addr_list = (PyObject *)NULL;
1078 PyObject *tmp;
1079
1080 if (!PyArg_Parse(args, "s", &ip_num))
1081 return NULL;
1082 if (setipaddr(ip_num, &addr) < 0)
1083 return NULL;
1084 h = gethostbyaddr((char *)&addr.sin_addr,
1085 sizeof(addr.sin_addr),
1086 AF_INET);
1087 if (h == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +00001088#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001089 /* Let's get real error message to return */
1090 extern int h_errno;
1091 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1092#else
1093 PyErr_SetString(PySocket_Error, "host not found");
1094#endif
1095 return NULL;
1096 }
1097 if ((name_list = PyList_New(0)) == NULL)
1098 goto err;
1099 if ((addr_list = PyList_New(0)) == NULL)
1100 goto err;
1101 for (pch = h->h_aliases; *pch != NULL; pch++) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001102 int status;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001103 tmp = PyString_FromString(*pch);
1104 if (tmp == NULL)
1105 goto err;
Barry Warsaw752300b1997-01-03 17:18:10 +00001106 status = PyList_Append(name_list, tmp);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001107 Py_DECREF(tmp);
Barry Warsaw752300b1997-01-03 17:18:10 +00001108 if (status)
1109 goto err;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001110 }
1111 for (pch = h->h_addr_list; *pch != NULL; pch++) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001112 int status;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001113 memcpy((char *) &addr.sin_addr, *pch, h->h_length);
1114 tmp = makeipaddr(&addr);
1115 if (tmp == NULL)
1116 goto err;
Barry Warsaw752300b1997-01-03 17:18:10 +00001117 status = PyList_Append(addr_list, tmp);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001118 Py_DECREF(tmp);
Barry Warsaw752300b1997-01-03 17:18:10 +00001119 if (status)
1120 goto err;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001121 }
1122 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1123 err:
1124 Py_XDECREF(name_list);
1125 Py_XDECREF(addr_list);
1126 return rtn_tuple;
1127}
1128
Guido van Rossum30a685f1991-06-27 15:51:29 +00001129
1130/* Python interface to getservbyname(name).
1131 This only returns the port number, since the other info is already
1132 known or not useful (like the list of aliases). */
1133
1134/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001135static PyObject *
1136BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001137{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001138 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001139 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001140 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001141 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001142 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001143 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001144 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001145 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001146 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001147 return NULL;
1148 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001149 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001150}
1151
1152
Guido van Rossum3901d851996-12-19 16:35:04 +00001153/* Python interface to getprotobyname(name).
1154 This only returns the protocol number, since the other info is
1155 already known or not useful (like the list of aliases). */
1156
1157/*ARGSUSED*/
1158static PyObject *
1159BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1160{
1161 char *name;
1162 struct protoent *sp;
1163 if (!PyArg_Parse(args, "s", &name))
1164 return NULL;
1165 Py_BEGIN_ALLOW_THREADS
1166 sp = getprotobyname(name);
1167 Py_END_ALLOW_THREADS
1168 if (sp == NULL) {
1169 PyErr_SetString(PySocket_Error, "protocol not found");
1170 return NULL;
1171 }
1172 return PyInt_FromLong((long) sp->p_proto);
1173}
1174
1175
Guido van Rossum30a685f1991-06-27 15:51:29 +00001176/* Python interface to socket(family, type, proto).
1177 The third (protocol) argument is optional.
1178 Return a new socket object. */
1179
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001180/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001181static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001182BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001183{
Guido van Rossum73624e91994-10-10 17:59:00 +00001184 PySocketSockObject *s;
Guido van Rossum6f489d91996-06-28 20:15:15 +00001185#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001186 SOCKET fd;
1187#else
1188 int fd;
1189#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001190 int family, type, proto = 0;
1191 if (!PyArg_ParseTuple(args, "ii|i", &family, &type, &proto))
1192 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001193 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001194 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001195 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001196#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001197 if (fd == INVALID_SOCKET)
1198#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001199 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001200#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001201 return PySocket_Err();
1202 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001203 /* If the object can't be created, don't forget to close the
1204 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001205 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001206 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001207 /* From now on, ignore SIGPIPE and let the error checking
1208 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001209#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001210 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001211#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001212 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001213}
1214
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001215#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001216/* Create a socket object from a numeric file description.
1217 Useful e.g. if stdin is a socket.
1218 Additional arguments as for socket(). */
1219
1220/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001221static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001222BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001223{
Guido van Rossum73624e91994-10-10 17:59:00 +00001224 PySocketSockObject *s;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001225 int fd, family, type, proto = 0;
1226 if (!PyArg_ParseTuple(args, "iii|i", &fd, &family, &type, &proto))
1227 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001228 /* Dup the fd so it and the socket can be closed independently */
1229 fd = dup(fd);
1230 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001231 return PySocket_Err();
1232 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001233 /* From now on, ignore SIGPIPE and let the error checking
1234 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001235#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001236 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001237#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001238 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001239}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001240#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001241
Guido van Rossum006bf911996-06-12 04:04:55 +00001242static PyObject *
1243BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1244{
1245 int x1, x2;
1246
1247 if (!PyArg_Parse(args, "i", &x1)) {
1248 return NULL;
1249 }
1250 x2 = (int)ntohs((short)x1);
1251 return PyInt_FromLong(x2);
1252}
1253
1254static PyObject *
1255BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1256{
1257 int x1, x2;
1258
1259 if (!PyArg_Parse(args, "i", &x1)) {
1260 return NULL;
1261 }
1262 x2 = ntohl(x1);
1263 return PyInt_FromLong(x2);
1264}
1265
1266static PyObject *
1267BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1268{
1269 int x1, x2;
1270
1271 if (!PyArg_Parse(args, "i", &x1)) {
1272 return NULL;
1273 }
1274 x2 = (int)htons((short)x1);
1275 return PyInt_FromLong(x2);
1276}
1277
1278static PyObject *
1279BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1280{
1281 int x1, x2;
1282
1283 if (!PyArg_Parse(args, "i", &x1)) {
1284 return NULL;
1285 }
1286 x2 = htonl(x1);
1287 return PyInt_FromLong(x2);
1288}
1289
Guido van Rossum30a685f1991-06-27 15:51:29 +00001290/* List of functions exported by this module. */
1291
Guido van Rossum73624e91994-10-10 17:59:00 +00001292static PyMethodDef PySocket_methods[] = {
1293 {"gethostbyname", PySocket_gethostbyname},
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001294 {"gethostbyaddr", PySocket_gethostbyaddr},
Guido van Rossum73624e91994-10-10 17:59:00 +00001295 {"gethostname", PySocket_gethostname},
1296 {"getservbyname", PySocket_getservbyname},
Guido van Rossum3901d851996-12-19 16:35:04 +00001297 {"getprotobyname", PySocket_getprotobyname},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001298 {"socket", PySocket_socket, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001299#ifndef NO_DUP
Guido van Rossumbe32c891996-06-20 16:25:29 +00001300 {"fromfd", PySocket_fromfd, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001301#endif
Guido van Rossum006bf911996-06-12 04:04:55 +00001302 {"ntohs", PySocket_ntohs},
1303 {"ntohl", PySocket_ntohl},
1304 {"htons", PySocket_htons},
1305 {"htonl", PySocket_htonl},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001306 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001307};
1308
Guido van Rossum30a685f1991-06-27 15:51:29 +00001309
1310/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00001311 *
1312 * Since this function is called only from initsocket/init_socket(), any
1313 * errors trigger a fatal exception.
1314 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001315static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001316BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001317{
Guido van Rossum73624e91994-10-10 17:59:00 +00001318 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00001319 if (!v || PyDict_SetItemString(d, name, v))
1320 Py_FatalError("can't initialize socket module");
1321
1322 Py_DECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001323}
1324
Guido van Rossum30a685f1991-06-27 15:51:29 +00001325
Guido van Rossum8d665e61996-06-26 18:22:49 +00001326#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001327
1328/* Additional initialization and cleanup for NT/Windows */
1329
1330static void
1331NTcleanup()
1332{
1333 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00001334}
1335
1336static int
1337NTinit()
1338{
1339 WSADATA WSAData;
1340 int ret;
1341 char buf[100];
1342 ret = WSAStartup(0x0101, &WSAData);
1343 switch (ret) {
1344 case 0: /* no error */
1345 atexit(NTcleanup);
1346 return 1;
1347 case WSASYSNOTREADY:
1348 PyErr_SetString(PyExc_ImportError,
1349 "WSAStartup failed: network not ready");
1350 break;
1351 case WSAVERNOTSUPPORTED:
1352 case WSAEINVAL:
1353 PyErr_SetString(PyExc_ImportError,
1354 "WSAStartup failed: requested version not supported");
1355 break;
1356 default:
1357 sprintf(buf, "WSAStartup failed: error code %d", ret);
1358 PyErr_SetString(PyExc_ImportError, buf);
1359 break;
1360 }
1361 return 0;
1362}
1363
Guido van Rossum8d665e61996-06-26 18:22:49 +00001364#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00001365
1366
Guido van Rossum30a685f1991-06-27 15:51:29 +00001367/* Initialize this module.
1368 This is called when the first 'import socket' is done,
1369 via a table in config.c, if config.c is compiled with USE_SOCKET
Guido van Rossumbe32c891996-06-20 16:25:29 +00001370 defined.
1371
Guido van Rossum8d665e61996-06-26 18:22:49 +00001372 For MS_WINDOWS (which means any Windows variant), this module
Guido van Rossumbe32c891996-06-20 16:25:29 +00001373 is actually called "_socket", and there's a wrapper "socket.py"
1374 which implements some missing functionality (such as makefile(),
1375 dup() and fromfd()). The import of "_socket" may fail with an
1376 ImportError exception if initialization of WINSOCK fails. When
1377 WINSOCK is initialized succesfully, a call to WSACleanup() is
1378 scheduled to be made at exit time. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001379
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001380void
Guido van Rossum8d665e61996-06-26 18:22:49 +00001381#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001382init_socket()
1383#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001384initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00001385#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001386{
Guido van Rossum73624e91994-10-10 17:59:00 +00001387 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001388#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001389 if (!NTinit())
1390 return;
1391 m = Py_InitModule("_socket", PySocket_methods);
1392#else
Guido van Rossum73624e91994-10-10 17:59:00 +00001393 m = Py_InitModule("socket", PySocket_methods);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001394#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001395 d = PyModule_GetDict(m);
1396 PySocket_Error = PyString_FromString("socket.error");
1397 if (PySocket_Error == NULL ||
1398 PyDict_SetItemString(d, "error", PySocket_Error) != 0)
1399 Py_FatalError("can't define socket.error");
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001400 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001401#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001402 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001403#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001404 insint(d, "SOCK_STREAM", SOCK_STREAM);
1405 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
1406 insint(d, "SOCK_RAW", SOCK_RAW);
1407 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1408 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001409
1410#ifdef SO_DEBUG
1411 insint(d, "SO_DEBUG", SO_DEBUG);
1412#endif
1413#ifdef SO_ACCEPTCONN
1414 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
1415#endif
1416#ifdef SO_REUSEADDR
1417 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
1418#endif
1419#ifdef SO_KEEPALIVE
1420 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
1421#endif
1422#ifdef SO_DONTROUTE
1423 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
1424#endif
1425#ifdef SO_BROADCAST
1426 insint(d, "SO_BROADCAST", SO_BROADCAST);
1427#endif
1428#ifdef SO_USELOOPBACK
1429 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
1430#endif
1431#ifdef SO_LINGER
1432 insint(d, "SO_LINGER", SO_LINGER);
1433#endif
1434#ifdef SO_OOBINLINE
1435 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
1436#endif
1437#ifdef SO_REUSEPORT
1438 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
1439#endif
1440
1441#ifdef SO_SNDBUF
1442 insint(d, "SO_SNDBUF", SO_SNDBUF);
1443#endif
1444#ifdef SO_RCVBUF
1445 insint(d, "SO_RCVBUF", SO_RCVBUF);
1446#endif
1447#ifdef SO_SNDLOWAT
1448 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
1449#endif
1450#ifdef SO_RCVLOWAT
1451 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
1452#endif
1453#ifdef SO_SNDTIMEO
1454 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
1455#endif
1456#ifdef SO_RCVTIMEO
1457 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
1458#endif
1459#ifdef SO_ERROR
1460 insint(d, "SO_ERROR", SO_ERROR);
1461#endif
1462#ifdef SO_TYPE
1463 insint(d, "SO_TYPE", SO_TYPE);
1464#endif
1465
1466 /* Maximum number of connections for "listen" */
1467#ifdef SOMAXCONN
1468 insint(d, "SOMAXCONN", SOMAXCONN);
1469#else
1470 insint(d, "SOMAXCONN", 5); /* Common value */
1471#endif
1472
1473 /* Flags for send, recv */
1474#ifdef MSG_OOB
1475 insint(d, "MSG_OOB", MSG_OOB);
1476#endif
1477#ifdef MSG_PEEK
1478 insint(d, "MSG_PEEK", MSG_PEEK);
1479#endif
1480#ifdef MSG_DONTROUTE
1481 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
1482#endif
1483#ifdef MSG_EOR
1484 insint(d, "MSG_EOR", MSG_EOR);
1485#endif
1486#ifdef MSG_TRUNC
1487 insint(d, "MSG_TRUNC", MSG_TRUNC);
1488#endif
1489#ifdef MSG_CTRUNC
1490 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
1491#endif
1492#ifdef MSG_WAITALL
1493 insint(d, "MSG_WAITALL", MSG_WAITALL);
1494#endif
1495#ifdef MSG_BTAG
1496 insint(d, "MSG_BTAG", MSG_BTAG);
1497#endif
1498#ifdef MSG_ETAG
1499 insint(d, "MSG_ETAG", MSG_ETAG);
1500#endif
1501
1502 /* Protocol level and numbers, usable for [gs]etsockopt */
1503#ifdef SOL_SOCKET
1504 insint(d, "SOL_SOCKET", SOL_SOCKET);
1505#endif
1506#ifdef IPPROTO_IP
1507 insint(d, "IPPROTO_IP", IPPROTO_IP);
1508#endif
1509#ifdef IPPROTO_ICMP
1510 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
1511#endif
1512#ifdef IPPROTO_IGMP
1513 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
1514#endif
1515#ifdef IPPROTO_GGP
1516 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
1517#endif
1518#ifdef IPPROTO_TCP
1519 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
1520#endif
1521#ifdef IPPROTO_EGP
1522 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
1523#endif
1524#ifdef IPPROTO_PUP
1525 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
1526#endif
1527#ifdef IPPROTO_UDP
1528 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
1529#endif
1530#ifdef IPPROTO_IDP
1531 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
1532#endif
1533#ifdef IPPROTO_HELLO
1534 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
1535#endif
1536#ifdef IPPROTO_ND
1537 insint(d, "IPPROTO_ND", IPPROTO_ND);
1538#endif
1539#ifdef IPPROTO_TP
1540 insint(d, "IPPROTO_TP", IPPROTO_TP);
1541#endif
1542#ifdef IPPROTO_XTP
1543 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
1544#endif
1545#ifdef IPPROTO_EON
1546 insint(d, "IPPROTO_EON", IPPROTO_EON);
1547#endif
1548#ifdef IPPROTO_BIP
1549 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
1550#endif
1551/**/
1552#ifdef IPPROTO_RAW
1553 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
1554#endif
1555#ifdef IPPROTO_MAX
1556 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
1557#endif
1558
1559 /* Some port configuration */
1560#ifdef IPPORT_RESERVED
1561 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
1562#else
1563 insint(d, "IPPORT_RESERVED", 1024);
1564#endif
1565#ifdef IPPORT_USERRESERVED
1566 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
1567#else
1568 insint(d, "IPPORT_USERRESERVED", 5000);
1569#endif
1570
Guido van Rossum5f05eb41995-02-17 15:11:07 +00001571 /* Some reserved IP v.4 addresses */
1572#ifdef INADDR_ANY
1573 insint(d, "INADDR_ANY", INADDR_ANY);
1574#else
1575 insint(d, "INADDR_ANY", 0x00000000);
1576#endif
1577#ifdef INADDR_BROADCAST
1578 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
1579#else
1580 insint(d, "INADDR_BROADCAST", 0xffffffff);
1581#endif
1582#ifdef INADDR_LOOPBACK
1583 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
1584#else
1585 insint(d, "INADDR_LOOPBACK", 0x7F000001);
1586#endif
1587#ifdef INADDR_UNSPEC_GROUP
1588 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
1589#else
1590 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
1591#endif
1592#ifdef INADDR_ALLHOSTS_GROUP
1593 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
1594#else
1595 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
1596#endif
1597#ifdef INADDR_MAX_LOCAL_GROUP
1598 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
1599#else
1600 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
1601#endif
1602#ifdef INADDR_NONE
1603 insint(d, "INADDR_NONE", INADDR_NONE);
1604#else
1605 insint(d, "INADDR_NONE", 0xffffffff);
1606#endif
1607
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001608 /* IP [gs]etsockopt options */
1609#ifdef IP_OPTIONS
1610 insint(d, "IP_OPTIONS", IP_OPTIONS);
1611#endif
1612#ifdef IP_HDRINCL
1613 insint(d, "IP_HDRINCL", IP_HDRINCL);
1614#endif
1615#ifdef IP_TOS
1616 insint(d, "IP_TOS", IP_TOS);
1617#endif
1618#ifdef IP_TTL
1619 insint(d, "IP_TTL", IP_TTL);
1620#endif
1621#ifdef IP_RECVOPTS
1622 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
1623#endif
1624#ifdef IP_RECVRETOPTS
1625 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
1626#endif
1627#ifdef IP_RECVDSTADDR
1628 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
1629#endif
1630#ifdef IP_RETOPTS
1631 insint(d, "IP_RETOPTS", IP_RETOPTS);
1632#endif
1633#ifdef IP_MULTICAST_IF
1634 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
1635#endif
1636#ifdef IP_MULTICAST_TTL
1637 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
1638#endif
1639#ifdef IP_MULTICAST_LOOP
1640 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
1641#endif
1642#ifdef IP_ADD_MEMBERSHIP
1643 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
1644#endif
1645#ifdef IP_DROP_MEMBERSHIP
1646 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
1647#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001648}