blob: 7b73b632e1b1630e37534f5ee4a1427bf1093d02 [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;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000420 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000421 *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;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000519#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000520 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000521#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000522 if (!PyArg_GetInt(args, &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000523 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000524 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +0000525#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000526 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
527 if (block)
528 delay_flag &= (~O_NDELAY);
529 else
530 delay_flag |= O_NDELAY;
531 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000532#else
533 block = !block;
534 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
535#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000536 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000537
Guido van Rossum73624e91994-10-10 17:59:00 +0000538 Py_INCREF(Py_None);
539 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000540}
Guido van Rossume4485b01994-09-07 14:32:49 +0000541
542
Guido van Rossumaee08791992-09-08 09:05:33 +0000543/* s.setsockopt() method.
544 With an integer third argument, sets an integer option.
545 With a string third argument, sets an option from a buffer;
546 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000547
Guido van Rossum73624e91994-10-10 17:59:00 +0000548static PyObject *
549BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000550{
551 int level;
552 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000553 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000554 char *buf;
555 int buflen;
556 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000557
Guido van Rossum73624e91994-10-10 17:59:00 +0000558 if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000559 buf = (char *) &flag;
560 buflen = sizeof flag;
561 }
562 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000563 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +0000564 if (!PyArg_Parse(args, "(iis#)", &level, &optname,
565 &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000566 return NULL;
567 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000568 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000569 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000570 return PySocket_Err();
571 Py_INCREF(Py_None);
572 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000573}
574
575
Guido van Rossumaee08791992-09-08 09:05:33 +0000576/* s.getsockopt() method.
577 With two arguments, retrieves an integer option.
578 With a third integer argument, retrieves a string buffer of that size;
579 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000580
Guido van Rossum73624e91994-10-10 17:59:00 +0000581static PyObject *
582BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000583{
584 int level;
585 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000586 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000587 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000588 int buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000589
Guido van Rossumbe32c891996-06-20 16:25:29 +0000590 if (!PyArg_ParseTuple(args, "ii|i", &level, &optname, &buflen))
591 return NULL;
592
593 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000594 int flag = 0;
595 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000596 res = getsockopt(s->sock_fd, level, optname,
597 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000598 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000599 return PySocket_Err();
600 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000601 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000602 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000603 PyErr_SetString(PySocket_Error,
604 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000605 return NULL;
606 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000607 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000608 if (buf == NULL)
609 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000610 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000611 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000612 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000613 Py_DECREF(buf);
614 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000615 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000616 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000617 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000618}
619
620
Guido van Rossum30a685f1991-06-27 15:51:29 +0000621/* s.bind(sockaddr) method */
622
Guido van Rossum73624e91994-10-10 17:59:00 +0000623static PyObject *
624BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000625{
626 struct sockaddr *addr;
627 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000628 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000629 if (!getsockaddrarg(s, args, &addr, &addrlen))
630 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000631 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000632 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000633 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000634 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000635 return PySocket_Err();
636 Py_INCREF(Py_None);
637 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000638}
639
Guido van Rossum30a685f1991-06-27 15:51:29 +0000640
641/* s.close() method.
642 Set the file descriptor to -1 so operations tried subsequently
643 will surely fail. */
644
Guido van Rossum73624e91994-10-10 17:59:00 +0000645static PyObject *
646BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000647{
Guido van Rossum73624e91994-10-10 17:59:00 +0000648 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000649 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000650 if (s->sock_fd != -1) {
651 Py_BEGIN_ALLOW_THREADS
652 (void) close(s->sock_fd);
653 Py_END_ALLOW_THREADS
654 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000655 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000656 Py_INCREF(Py_None);
657 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000658}
659
Guido van Rossum30a685f1991-06-27 15:51:29 +0000660
661/* s.connect(sockaddr) method */
662
Guido van Rossum73624e91994-10-10 17:59:00 +0000663static PyObject *
664BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000665{
666 struct sockaddr *addr;
667 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000668 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000669 if (!getsockaddrarg(s, args, &addr, &addrlen))
670 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000671 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000672 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000673 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000674 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000675 return PySocket_Err();
676 Py_INCREF(Py_None);
677 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000678}
679
Guido van Rossum30a685f1991-06-27 15:51:29 +0000680
Guido van Rossumed233a51992-06-23 09:07:03 +0000681/* s.fileno() method */
682
Guido van Rossum73624e91994-10-10 17:59:00 +0000683static PyObject *
684BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000685{
Guido van Rossum73624e91994-10-10 17:59:00 +0000686 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000687 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000688 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000689}
690
691
Guido van Rossumbe32c891996-06-20 16:25:29 +0000692#ifndef NO_DUP
693/* s.dup() method */
694
695static PyObject *
696BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
697{
698 int newfd;
699 PyObject *sock;
700 if (!PyArg_NoArgs(args))
701 return NULL;
702 newfd = dup(s->sock_fd);
703 if (newfd < 0)
704 return PySocket_Err();
705 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +0000706 s->sock_family,
707 s->sock_type,
708 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +0000709 if (sock == NULL)
710 close(newfd);
711 return sock;
712}
713#endif
714
715
Guido van Rossumc89705d1992-11-26 08:54:07 +0000716/* s.getsockname() method */
717
Guido van Rossum73624e91994-10-10 17:59:00 +0000718static PyObject *
719BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000720{
721 char addrbuf[256];
722 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000723 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000724 return NULL;
725 if (!getsockaddrlen(s, &addrlen))
726 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +0000727 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000728 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000729 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000730 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000731 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000732 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000733 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
734}
735
736
Guido van Rossumb6775db1994-08-01 11:34:53 +0000737#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000738/* s.getpeername() method */
739
Guido van Rossum73624e91994-10-10 17:59:00 +0000740static PyObject *
741BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000742{
743 char addrbuf[256];
744 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000745 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000746 return NULL;
747 if (!getsockaddrlen(s, &addrlen))
748 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000749 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000750 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000751 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000752 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000753 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000754 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
755}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000756#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000757
758
Guido van Rossum30a685f1991-06-27 15:51:29 +0000759/* s.listen(n) method */
760
Guido van Rossum73624e91994-10-10 17:59:00 +0000761static PyObject *
762BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000763{
764 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000765 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000766 if (!PyArg_GetInt(args, &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000767 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000768 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000769 if (backlog < 1)
770 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000771 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +0000772 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000773 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000774 return PySocket_Err();
775 Py_INCREF(Py_None);
776 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000777}
778
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000779#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +0000780/* s.makefile(mode) method.
781 Create a new open file object referring to a dupped version of
782 the socket's file descriptor. (The dup() call is necessary so
783 that the open file and socket objects may be closed independent
784 of each other.)
785 The mode argument specifies 'r' or 'w' passed to fdopen(). */
786
Guido van Rossum73624e91994-10-10 17:59:00 +0000787static PyObject *
788BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000789{
Guido van Rossuma597dde1995-01-10 20:56:29 +0000790 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +0000791 char *mode = "r";
792 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000793 int fd;
794 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +0000795 PyObject *f;
796
797 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000798 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +0000799#ifdef MS_WIN32
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000800 if ( ((fd = _open_osfhandle( s->sock_fd, _O_BINARY )) < 0) ||
801 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL)) {
802#else
Guido van Rossum30a685f1991-06-27 15:51:29 +0000803 if ((fd = dup(s->sock_fd)) < 0 ||
Guido van Rossum6b144911995-03-14 15:05:13 +0000804 (fp = fdopen(fd, mode)) == NULL) {
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000805#endif
Guido van Rossum6b144911995-03-14 15:05:13 +0000806 if (fd >= 0)
807 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000808 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +0000809 }
810 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
811 if (f != NULL)
812 PyFile_SetBufSize(f, bufsize);
813 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000814}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000815#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000816
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000817/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000818
Guido van Rossum73624e91994-10-10 17:59:00 +0000819static PyObject *
820BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000821{
Guido van Rossumbe32c891996-06-20 16:25:29 +0000822 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000823 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000824 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
825 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000826 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000827 if (buf == NULL)
828 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000829 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +0000830 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000831 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +0000832 if (n < 0) {
833 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +0000834 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +0000835 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +0000836 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000837 return NULL;
838 return buf;
839}
840
Guido van Rossum30a685f1991-06-27 15:51:29 +0000841
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000842/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000843
Guido van Rossum73624e91994-10-10 17:59:00 +0000844static PyObject *
845BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000846{
847 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +0000848 PyObject *buf = NULL;
849 PyObject *addr = NULL;
850 PyObject *ret = NULL;
851
Guido van Rossumbe32c891996-06-20 16:25:29 +0000852 int addrlen, len, n, flags = 0;
853 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
854 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000855 if (!getsockaddrlen(s, &addrlen))
856 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000857 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000858 if (buf == NULL)
859 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000860 Py_BEGIN_ALLOW_THREADS
861 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +0000862#ifndef MS_WINDOWS
Barry Warsaw752300b1997-01-03 17:18:10 +0000863 (ANY *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000864#else
Barry Warsaw752300b1997-01-03 17:18:10 +0000865 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000866#endif
Barry Warsaw752300b1997-01-03 17:18:10 +0000867 );
Guido van Rossum73624e91994-10-10 17:59:00 +0000868 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +0000869 if (n < 0) {
870 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +0000871 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +0000872 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +0000873 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000874 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +0000875
876 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
877 goto finally;
878
Guido van Rossum73624e91994-10-10 17:59:00 +0000879 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000880 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000881 Py_XDECREF(addr);
882 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000883 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000884}
885
Guido van Rossum30a685f1991-06-27 15:51:29 +0000886
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000887/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000888
Guido van Rossum73624e91994-10-10 17:59:00 +0000889static PyObject *
890BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000891{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000892 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000893 int len, n, flags = 0;
894 if (!PyArg_ParseTuple(args, "s#|i", &buf, &len, &flags))
895 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000896 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000897 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000898 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +0000899 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000900 return PySocket_Err();
901 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000902}
903
904
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000905/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000906
Guido van Rossum73624e91994-10-10 17:59:00 +0000907static PyObject *
908BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000909{
Guido van Rossum73624e91994-10-10 17:59:00 +0000910 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000911 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000912 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000913 int addrlen, len, n, flags;
914 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000915 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
916 PyErr_Clear();
917 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000918 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000919 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000920 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000921 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000922 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000923 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000924 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000925 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000926 return PySocket_Err();
927 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000928}
929
Guido van Rossum30a685f1991-06-27 15:51:29 +0000930
931/* s.shutdown(how) method */
932
Guido van Rossum73624e91994-10-10 17:59:00 +0000933static PyObject *
934BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000935{
936 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000937 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000938 if (!PyArg_GetInt(args, &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000939 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000940 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000941 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +0000942 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000943 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000944 return PySocket_Err();
945 Py_INCREF(Py_None);
946 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000947}
948
Guido van Rossum30a685f1991-06-27 15:51:29 +0000949
950/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000951
Guido van Rossum73624e91994-10-10 17:59:00 +0000952static PyMethodDef PySocketSock_methods[] = {
953 {"accept", (PyCFunction)PySocketSock_accept},
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000954 {"setblocking", (PyCFunction)PySocketSock_setblocking},
Guido van Rossum73624e91994-10-10 17:59:00 +0000955 {"setsockopt", (PyCFunction)PySocketSock_setsockopt},
Guido van Rossumbe32c891996-06-20 16:25:29 +0000956 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1},
Guido van Rossum73624e91994-10-10 17:59:00 +0000957 {"bind", (PyCFunction)PySocketSock_bind},
958 {"close", (PyCFunction)PySocketSock_close},
959 {"connect", (PyCFunction)PySocketSock_connect},
960 {"fileno", (PyCFunction)PySocketSock_fileno},
Guido van Rossumbe32c891996-06-20 16:25:29 +0000961#ifndef NO_DUP
962 {"dup", (PyCFunction)PySocketSock_dup},
963#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000964 {"getsockname", (PyCFunction)PySocketSock_getsockname},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000965#ifdef HAVE_GETPEERNAME
Guido van Rossum73624e91994-10-10 17:59:00 +0000966 {"getpeername", (PyCFunction)PySocketSock_getpeername},
Guido van Rossum9575a441993-04-07 14:06:14 +0000967#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000968 {"listen", (PyCFunction)PySocketSock_listen},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000969#ifndef NO_DUP
Guido van Rossum6b144911995-03-14 15:05:13 +0000970 {"makefile", (PyCFunction)PySocketSock_makefile, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000971#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +0000972 {"recv", (PyCFunction)PySocketSock_recv, 1},
973 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1},
974 {"send", (PyCFunction)PySocketSock_send, 1},
Guido van Rossum73624e91994-10-10 17:59:00 +0000975 {"sendto", (PyCFunction)PySocketSock_sendto},
976 {"shutdown", (PyCFunction)PySocketSock_shutdown},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000977 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000978};
979
Guido van Rossum30a685f1991-06-27 15:51:29 +0000980
Guido van Rossum73624e91994-10-10 17:59:00 +0000981/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +0000982 First close the file description. */
983
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000984static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000985BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000986{
987 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000988 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000989}
990
Guido van Rossum30a685f1991-06-27 15:51:29 +0000991
992/* Return a socket object's named attribute. */
993
Guido van Rossum73624e91994-10-10 17:59:00 +0000994static PyObject *
995BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000996{
Guido van Rossum73624e91994-10-10 17:59:00 +0000997 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000998}
999
Guido van Rossum30a685f1991-06-27 15:51:29 +00001000
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001001static PyObject *
1002BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
1003{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001004 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001005 sprintf(buf,
1006 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
1007 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001008 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001009}
1010
1011
Guido van Rossumb6775db1994-08-01 11:34:53 +00001012/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001013
Guido van Rossum73624e91994-10-10 17:59:00 +00001014static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001015 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001016 0,
1017 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001018 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001019 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001020 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001021 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001022 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001023 0, /*tp_setattr*/
1024 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001025 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001026 0, /*tp_as_number*/
1027 0, /*tp_as_sequence*/
1028 0, /*tp_as_mapping*/
1029};
1030
Guido van Rossum30a685f1991-06-27 15:51:29 +00001031
Guido van Rossum81194471991-07-27 21:42:02 +00001032/* Python interface to gethostname(). */
1033
1034/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001035static PyObject *
1036BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001037{
1038 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001039 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001040 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +00001041 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001042 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001043 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001044 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001045 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001046 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001047 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001048 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001049}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001050
1051
Guido van Rossum30a685f1991-06-27 15:51:29 +00001052/* Python interface to gethostbyname(name). */
1053
1054/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001055static PyObject *
1056BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001057{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001058 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001059 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +00001060 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001061 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001062 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001063 return NULL;
1064 return makeipaddr(&addrbuf);
1065}
1066
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001067/* Python interface to gethostbyaddr(IP). */
1068
1069/*ARGSUSED*/
1070static PyObject *
1071BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1072{
1073 struct sockaddr_in addr;
1074 char *ip_num;
1075 struct hostent *h;
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001076 char **pch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001077 PyObject *rtn_tuple = (PyObject *)NULL;
1078 PyObject *name_list = (PyObject *)NULL;
1079 PyObject *addr_list = (PyObject *)NULL;
1080 PyObject *tmp;
1081
1082 if (!PyArg_Parse(args, "s", &ip_num))
1083 return NULL;
1084 if (setipaddr(ip_num, &addr) < 0)
1085 return NULL;
1086 h = gethostbyaddr((char *)&addr.sin_addr,
1087 sizeof(addr.sin_addr),
1088 AF_INET);
1089 if (h == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +00001090#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001091 /* Let's get real error message to return */
1092 extern int h_errno;
1093 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1094#else
1095 PyErr_SetString(PySocket_Error, "host not found");
1096#endif
1097 return NULL;
1098 }
1099 if ((name_list = PyList_New(0)) == NULL)
1100 goto err;
1101 if ((addr_list = PyList_New(0)) == NULL)
1102 goto err;
1103 for (pch = h->h_aliases; *pch != NULL; pch++) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001104 int status;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001105 tmp = PyString_FromString(*pch);
1106 if (tmp == NULL)
1107 goto err;
Barry Warsaw752300b1997-01-03 17:18:10 +00001108 status = PyList_Append(name_list, tmp);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001109 Py_DECREF(tmp);
Barry Warsaw752300b1997-01-03 17:18:10 +00001110 if (status)
1111 goto err;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001112 }
1113 for (pch = h->h_addr_list; *pch != NULL; pch++) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001114 int status;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001115 memcpy((char *) &addr.sin_addr, *pch, h->h_length);
1116 tmp = makeipaddr(&addr);
1117 if (tmp == NULL)
1118 goto err;
Barry Warsaw752300b1997-01-03 17:18:10 +00001119 status = PyList_Append(addr_list, tmp);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001120 Py_DECREF(tmp);
Barry Warsaw752300b1997-01-03 17:18:10 +00001121 if (status)
1122 goto err;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001123 }
1124 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1125 err:
1126 Py_XDECREF(name_list);
1127 Py_XDECREF(addr_list);
1128 return rtn_tuple;
1129}
1130
Guido van Rossum30a685f1991-06-27 15:51:29 +00001131
1132/* Python interface to getservbyname(name).
1133 This only returns the port number, since the other info is already
1134 known or not useful (like the list of aliases). */
1135
1136/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001137static PyObject *
1138BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001139{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001140 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001141 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001142 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001143 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001144 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001145 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001146 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001147 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001148 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001149 return NULL;
1150 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001151 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001152}
1153
1154
Guido van Rossum3901d851996-12-19 16:35:04 +00001155/* Python interface to getprotobyname(name).
1156 This only returns the protocol number, since the other info is
1157 already known or not useful (like the list of aliases). */
1158
1159/*ARGSUSED*/
1160static PyObject *
1161BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1162{
1163 char *name;
1164 struct protoent *sp;
1165 if (!PyArg_Parse(args, "s", &name))
1166 return NULL;
1167 Py_BEGIN_ALLOW_THREADS
1168 sp = getprotobyname(name);
1169 Py_END_ALLOW_THREADS
1170 if (sp == NULL) {
1171 PyErr_SetString(PySocket_Error, "protocol not found");
1172 return NULL;
1173 }
1174 return PyInt_FromLong((long) sp->p_proto);
1175}
1176
1177
Guido van Rossum30a685f1991-06-27 15:51:29 +00001178/* Python interface to socket(family, type, proto).
1179 The third (protocol) argument is optional.
1180 Return a new socket object. */
1181
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001182/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001183static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001184BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001185{
Guido van Rossum73624e91994-10-10 17:59:00 +00001186 PySocketSockObject *s;
Guido van Rossum6f489d91996-06-28 20:15:15 +00001187#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001188 SOCKET fd;
1189#else
1190 int fd;
1191#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001192 int family, type, proto = 0;
1193 if (!PyArg_ParseTuple(args, "ii|i", &family, &type, &proto))
1194 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001195 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001196 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001197 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001198#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001199 if (fd == INVALID_SOCKET)
1200#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001201 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001202#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001203 return PySocket_Err();
1204 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001205 /* If the object can't be created, don't forget to close the
1206 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001207 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001208 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001209 /* From now on, ignore SIGPIPE and let the error checking
1210 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001211#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001212 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001213#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001214 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001215}
1216
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001217#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001218/* Create a socket object from a numeric file description.
1219 Useful e.g. if stdin is a socket.
1220 Additional arguments as for socket(). */
1221
1222/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001223static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001224BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001225{
Guido van Rossum73624e91994-10-10 17:59:00 +00001226 PySocketSockObject *s;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001227 int fd, family, type, proto = 0;
1228 if (!PyArg_ParseTuple(args, "iii|i", &fd, &family, &type, &proto))
1229 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001230 /* Dup the fd so it and the socket can be closed independently */
1231 fd = dup(fd);
1232 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001233 return PySocket_Err();
1234 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001235 /* From now on, ignore SIGPIPE and let the error checking
1236 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001237#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001238 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001239#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001240 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001241}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001242#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001243
Guido van Rossum006bf911996-06-12 04:04:55 +00001244static PyObject *
1245BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1246{
1247 int x1, x2;
1248
1249 if (!PyArg_Parse(args, "i", &x1)) {
1250 return NULL;
1251 }
1252 x2 = (int)ntohs((short)x1);
1253 return PyInt_FromLong(x2);
1254}
1255
1256static PyObject *
1257BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1258{
1259 int x1, x2;
1260
1261 if (!PyArg_Parse(args, "i", &x1)) {
1262 return NULL;
1263 }
1264 x2 = ntohl(x1);
1265 return PyInt_FromLong(x2);
1266}
1267
1268static PyObject *
1269BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1270{
1271 int x1, x2;
1272
1273 if (!PyArg_Parse(args, "i", &x1)) {
1274 return NULL;
1275 }
1276 x2 = (int)htons((short)x1);
1277 return PyInt_FromLong(x2);
1278}
1279
1280static PyObject *
1281BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1282{
1283 int x1, x2;
1284
1285 if (!PyArg_Parse(args, "i", &x1)) {
1286 return NULL;
1287 }
1288 x2 = htonl(x1);
1289 return PyInt_FromLong(x2);
1290}
1291
Guido van Rossum30a685f1991-06-27 15:51:29 +00001292/* List of functions exported by this module. */
1293
Guido van Rossum73624e91994-10-10 17:59:00 +00001294static PyMethodDef PySocket_methods[] = {
1295 {"gethostbyname", PySocket_gethostbyname},
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001296 {"gethostbyaddr", PySocket_gethostbyaddr},
Guido van Rossum73624e91994-10-10 17:59:00 +00001297 {"gethostname", PySocket_gethostname},
1298 {"getservbyname", PySocket_getservbyname},
Guido van Rossum3901d851996-12-19 16:35:04 +00001299 {"getprotobyname", PySocket_getprotobyname},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001300 {"socket", PySocket_socket, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001301#ifndef NO_DUP
Guido van Rossumbe32c891996-06-20 16:25:29 +00001302 {"fromfd", PySocket_fromfd, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001303#endif
Guido van Rossum006bf911996-06-12 04:04:55 +00001304 {"ntohs", PySocket_ntohs},
1305 {"ntohl", PySocket_ntohl},
1306 {"htons", PySocket_htons},
1307 {"htonl", PySocket_htonl},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001308 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001309};
1310
Guido van Rossum30a685f1991-06-27 15:51:29 +00001311
1312/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00001313 *
1314 * Since this function is called only from initsocket/init_socket(), any
1315 * errors trigger a fatal exception.
1316 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001317static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001318BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001319{
Guido van Rossum73624e91994-10-10 17:59:00 +00001320 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00001321 if (!v || PyDict_SetItemString(d, name, v))
1322 Py_FatalError("can't initialize socket module");
1323
1324 Py_DECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001325}
1326
Guido van Rossum30a685f1991-06-27 15:51:29 +00001327
Guido van Rossum8d665e61996-06-26 18:22:49 +00001328#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001329
1330/* Additional initialization and cleanup for NT/Windows */
1331
1332static void
1333NTcleanup()
1334{
1335 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00001336}
1337
1338static int
1339NTinit()
1340{
1341 WSADATA WSAData;
1342 int ret;
1343 char buf[100];
1344 ret = WSAStartup(0x0101, &WSAData);
1345 switch (ret) {
1346 case 0: /* no error */
1347 atexit(NTcleanup);
1348 return 1;
1349 case WSASYSNOTREADY:
1350 PyErr_SetString(PyExc_ImportError,
1351 "WSAStartup failed: network not ready");
1352 break;
1353 case WSAVERNOTSUPPORTED:
1354 case WSAEINVAL:
1355 PyErr_SetString(PyExc_ImportError,
1356 "WSAStartup failed: requested version not supported");
1357 break;
1358 default:
1359 sprintf(buf, "WSAStartup failed: error code %d", ret);
1360 PyErr_SetString(PyExc_ImportError, buf);
1361 break;
1362 }
1363 return 0;
1364}
1365
Guido van Rossum8d665e61996-06-26 18:22:49 +00001366#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00001367
1368
Guido van Rossum30a685f1991-06-27 15:51:29 +00001369/* Initialize this module.
1370 This is called when the first 'import socket' is done,
1371 via a table in config.c, if config.c is compiled with USE_SOCKET
Guido van Rossumbe32c891996-06-20 16:25:29 +00001372 defined.
1373
Guido van Rossum8d665e61996-06-26 18:22:49 +00001374 For MS_WINDOWS (which means any Windows variant), this module
Guido van Rossumbe32c891996-06-20 16:25:29 +00001375 is actually called "_socket", and there's a wrapper "socket.py"
1376 which implements some missing functionality (such as makefile(),
1377 dup() and fromfd()). The import of "_socket" may fail with an
1378 ImportError exception if initialization of WINSOCK fails. When
1379 WINSOCK is initialized succesfully, a call to WSACleanup() is
1380 scheduled to be made at exit time. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001381
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001382void
Guido van Rossum8d665e61996-06-26 18:22:49 +00001383#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001384init_socket()
1385#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001386initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00001387#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001388{
Guido van Rossum73624e91994-10-10 17:59:00 +00001389 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001390#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001391 if (!NTinit())
1392 return;
1393 m = Py_InitModule("_socket", PySocket_methods);
1394#else
Guido van Rossum73624e91994-10-10 17:59:00 +00001395 m = Py_InitModule("socket", PySocket_methods);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001396#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001397 d = PyModule_GetDict(m);
1398 PySocket_Error = PyString_FromString("socket.error");
1399 if (PySocket_Error == NULL ||
1400 PyDict_SetItemString(d, "error", PySocket_Error) != 0)
1401 Py_FatalError("can't define socket.error");
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001402 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001403#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001404 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001405#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001406 insint(d, "SOCK_STREAM", SOCK_STREAM);
1407 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
1408 insint(d, "SOCK_RAW", SOCK_RAW);
1409 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1410 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001411
1412#ifdef SO_DEBUG
1413 insint(d, "SO_DEBUG", SO_DEBUG);
1414#endif
1415#ifdef SO_ACCEPTCONN
1416 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
1417#endif
1418#ifdef SO_REUSEADDR
1419 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
1420#endif
1421#ifdef SO_KEEPALIVE
1422 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
1423#endif
1424#ifdef SO_DONTROUTE
1425 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
1426#endif
1427#ifdef SO_BROADCAST
1428 insint(d, "SO_BROADCAST", SO_BROADCAST);
1429#endif
1430#ifdef SO_USELOOPBACK
1431 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
1432#endif
1433#ifdef SO_LINGER
1434 insint(d, "SO_LINGER", SO_LINGER);
1435#endif
1436#ifdef SO_OOBINLINE
1437 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
1438#endif
1439#ifdef SO_REUSEPORT
1440 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
1441#endif
1442
1443#ifdef SO_SNDBUF
1444 insint(d, "SO_SNDBUF", SO_SNDBUF);
1445#endif
1446#ifdef SO_RCVBUF
1447 insint(d, "SO_RCVBUF", SO_RCVBUF);
1448#endif
1449#ifdef SO_SNDLOWAT
1450 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
1451#endif
1452#ifdef SO_RCVLOWAT
1453 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
1454#endif
1455#ifdef SO_SNDTIMEO
1456 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
1457#endif
1458#ifdef SO_RCVTIMEO
1459 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
1460#endif
1461#ifdef SO_ERROR
1462 insint(d, "SO_ERROR", SO_ERROR);
1463#endif
1464#ifdef SO_TYPE
1465 insint(d, "SO_TYPE", SO_TYPE);
1466#endif
1467
1468 /* Maximum number of connections for "listen" */
1469#ifdef SOMAXCONN
1470 insint(d, "SOMAXCONN", SOMAXCONN);
1471#else
1472 insint(d, "SOMAXCONN", 5); /* Common value */
1473#endif
1474
1475 /* Flags for send, recv */
1476#ifdef MSG_OOB
1477 insint(d, "MSG_OOB", MSG_OOB);
1478#endif
1479#ifdef MSG_PEEK
1480 insint(d, "MSG_PEEK", MSG_PEEK);
1481#endif
1482#ifdef MSG_DONTROUTE
1483 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
1484#endif
1485#ifdef MSG_EOR
1486 insint(d, "MSG_EOR", MSG_EOR);
1487#endif
1488#ifdef MSG_TRUNC
1489 insint(d, "MSG_TRUNC", MSG_TRUNC);
1490#endif
1491#ifdef MSG_CTRUNC
1492 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
1493#endif
1494#ifdef MSG_WAITALL
1495 insint(d, "MSG_WAITALL", MSG_WAITALL);
1496#endif
1497#ifdef MSG_BTAG
1498 insint(d, "MSG_BTAG", MSG_BTAG);
1499#endif
1500#ifdef MSG_ETAG
1501 insint(d, "MSG_ETAG", MSG_ETAG);
1502#endif
1503
1504 /* Protocol level and numbers, usable for [gs]etsockopt */
1505#ifdef SOL_SOCKET
1506 insint(d, "SOL_SOCKET", SOL_SOCKET);
1507#endif
1508#ifdef IPPROTO_IP
1509 insint(d, "IPPROTO_IP", IPPROTO_IP);
1510#endif
1511#ifdef IPPROTO_ICMP
1512 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
1513#endif
1514#ifdef IPPROTO_IGMP
1515 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
1516#endif
1517#ifdef IPPROTO_GGP
1518 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
1519#endif
1520#ifdef IPPROTO_TCP
1521 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
1522#endif
1523#ifdef IPPROTO_EGP
1524 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
1525#endif
1526#ifdef IPPROTO_PUP
1527 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
1528#endif
1529#ifdef IPPROTO_UDP
1530 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
1531#endif
1532#ifdef IPPROTO_IDP
1533 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
1534#endif
1535#ifdef IPPROTO_HELLO
1536 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
1537#endif
1538#ifdef IPPROTO_ND
1539 insint(d, "IPPROTO_ND", IPPROTO_ND);
1540#endif
1541#ifdef IPPROTO_TP
1542 insint(d, "IPPROTO_TP", IPPROTO_TP);
1543#endif
1544#ifdef IPPROTO_XTP
1545 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
1546#endif
1547#ifdef IPPROTO_EON
1548 insint(d, "IPPROTO_EON", IPPROTO_EON);
1549#endif
1550#ifdef IPPROTO_BIP
1551 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
1552#endif
1553/**/
1554#ifdef IPPROTO_RAW
1555 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
1556#endif
1557#ifdef IPPROTO_MAX
1558 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
1559#endif
1560
1561 /* Some port configuration */
1562#ifdef IPPORT_RESERVED
1563 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
1564#else
1565 insint(d, "IPPORT_RESERVED", 1024);
1566#endif
1567#ifdef IPPORT_USERRESERVED
1568 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
1569#else
1570 insint(d, "IPPORT_USERRESERVED", 5000);
1571#endif
1572
Guido van Rossum5f05eb41995-02-17 15:11:07 +00001573 /* Some reserved IP v.4 addresses */
1574#ifdef INADDR_ANY
1575 insint(d, "INADDR_ANY", INADDR_ANY);
1576#else
1577 insint(d, "INADDR_ANY", 0x00000000);
1578#endif
1579#ifdef INADDR_BROADCAST
1580 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
1581#else
1582 insint(d, "INADDR_BROADCAST", 0xffffffff);
1583#endif
1584#ifdef INADDR_LOOPBACK
1585 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
1586#else
1587 insint(d, "INADDR_LOOPBACK", 0x7F000001);
1588#endif
1589#ifdef INADDR_UNSPEC_GROUP
1590 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
1591#else
1592 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
1593#endif
1594#ifdef INADDR_ALLHOSTS_GROUP
1595 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
1596#else
1597 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
1598#endif
1599#ifdef INADDR_MAX_LOCAL_GROUP
1600 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
1601#else
1602 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
1603#endif
1604#ifdef INADDR_NONE
1605 insint(d, "INADDR_NONE", INADDR_NONE);
1606#else
1607 insint(d, "INADDR_NONE", 0xffffffff);
1608#endif
1609
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001610 /* IP [gs]etsockopt options */
1611#ifdef IP_OPTIONS
1612 insint(d, "IP_OPTIONS", IP_OPTIONS);
1613#endif
1614#ifdef IP_HDRINCL
1615 insint(d, "IP_HDRINCL", IP_HDRINCL);
1616#endif
1617#ifdef IP_TOS
1618 insint(d, "IP_TOS", IP_TOS);
1619#endif
1620#ifdef IP_TTL
1621 insint(d, "IP_TTL", IP_TTL);
1622#endif
1623#ifdef IP_RECVOPTS
1624 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
1625#endif
1626#ifdef IP_RECVRETOPTS
1627 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
1628#endif
1629#ifdef IP_RECVDSTADDR
1630 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
1631#endif
1632#ifdef IP_RETOPTS
1633 insint(d, "IP_RETOPTS", IP_RETOPTS);
1634#endif
1635#ifdef IP_MULTICAST_IF
1636 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
1637#endif
1638#ifdef IP_MULTICAST_TTL
1639 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
1640#endif
1641#ifdef IP_MULTICAST_LOOP
1642 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
1643#endif
1644#ifdef IP_ADD_MEMBERSHIP
1645 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
1646#endif
1647#ifdef IP_DROP_MEMBERSHIP
1648 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
1649#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001650}