blob: 3e510fe5659b35a9d390771709d0c63de86d896a [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')
49- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000050- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum006bf911996-06-12 04:04:55 +000051- socket.ntohs(16 bit value) --> new int object
52- socket.ntohl(32 bit value) --> new int object
53- socket.htons(16 bit value) --> new int object
54- socket.htonl(32 bit value) --> new int object
Guido van Rossum27e177d1995-03-16 15:43:47 +000055- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +000056- an Internet socket address is a pair (hostname, port)
57 where hostname can be anything recognized by gethostbyname()
58 (including the dd.dd.dd.dd notation) and port is in host byte order
59- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000060- a UNIX domain socket address is a string specifying the pathname
Guido van Rossum6574b3e1991-06-25 21:36:08 +000061
Guido van Rossum30a685f1991-06-27 15:51:29 +000062Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000063
Guido van Rossum81194471991-07-27 21:42:02 +000064- s.accept() --> new socket object, sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000065- s.bind(sockaddr) --> None
66- s.close() --> None
67- s.connect(sockaddr) --> None
68- s.fileno() --> file descriptor
Guido van Rossumbe32c891996-06-20 16:25:29 +000069- s.dup() --> same as socket.fromfd(os.dup(s.fileno(), ...)
Guido van Rossumc89705d1992-11-26 08:54:07 +000070- s.getpeername() --> sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000071- s.getsockname() --> sockaddr
72- s.getsockopt(level, optname[, buflen]) --> int or string
73- s.listen(backlog) --> None
Guido van Rossum6b144911995-03-14 15:05:13 +000074- s.makefile([mode[, bufsize]]) --> file object
Guido van Rossum27e177d1995-03-16 15:43:47 +000075- s.recv(buflen [,flags]) --> string
76- s.recvfrom(buflen [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000077- s.send(string [,flags]) --> nbytes
78- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum27e177d1995-03-16 15:43:47 +000079- s.setblocking(0 | 1) --> None
80- s.setsockopt(level, optname, value) --> None
81- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000082- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000083
Guido van Rossum6574b3e1991-06-25 21:36:08 +000084*/
85
Guido van Rossum73624e91994-10-10 17:59:00 +000086#include "Python.h"
Guido van Rossum6574b3e1991-06-25 21:36:08 +000087
Guido van Rossuma376cc51996-12-05 23:43:35 +000088#ifdef HAVE_UNISTD_H
89#include <unistd.h>
90#endif
91
Guido van Rossumb6775db1994-08-01 11:34:53 +000092#include <sys/types.h>
93#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +000094
Guido van Rossum81194471991-07-27 21:42:02 +000095#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +000096#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +000097#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +000098#include <sys/socket.h>
99#include <netinet/in.h>
Guido van Rossume4485b01994-09-07 14:32:49 +0000100#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000101#else
102#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000103#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000104#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000105#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000106#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000107#else
108#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000109#endif
110
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000111#ifndef O_NDELAY
112#define O_NDELAY O_NONBLOCK /* For QNX only? */
113#endif
114
Jack Jansen508537b1996-02-14 15:57:45 +0000115#ifdef USE_GUSI
116/* fdopen() isn't declared in stdio.h (sigh) */
117#include <GUSI.h>
118#endif
119
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000120
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000121/* Here we have some hacks to choose between K&R or ANSI style function
122 definitions. For NT to build this as an extension module (ie, DLL)
123 it must be compiled by the C++ compiler, as it takes the address of
124 a static data item exported from the main Python DLL.
125*/
Guido van Rossum8d665e61996-06-26 18:22:49 +0000126#ifdef MS_WINDOWS
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000127/* seem to be a few differences in the API */
128#define close closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000129#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000130#define FORCE_ANSI_FUNC_DEFS
131#endif
132
133#ifdef FORCE_ANSI_FUNC_DEFS
134#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
135fnname( arg1type arg1name )
136
137#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
138fnname( arg1type arg1name, arg2type arg2name )
139
140#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
141fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
142
143#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
144fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
145
146#else /* !FORCE_ANSI_FN_DEFS */
147#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
148fnname( arg1name ) \
149 arg1type arg1name;
150
151#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
152fnname( arg1name, arg2name ) \
153 arg1type arg1name; \
154 arg2type arg2name;
155
156#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
157fnname( arg1name, arg2name, arg3name ) \
158 arg1type arg1name; \
159 arg2type arg2name; \
160 arg3type arg3name;
161
162#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
163fnname( arg1name, arg2name, arg3name, arg4name ) \
164 arg1type arg1name; \
165 arg2type arg2name; \
166 arg3type arg3name; \
167 arg4type arg4name;
168
169#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000170
171/* Global variable holding the exception type for errors detected
172 by this module (but not argument type or memory errors, etc.). */
173
Guido van Rossum73624e91994-10-10 17:59:00 +0000174static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000175
176
177/* Convenience function to raise an error according to errno
178 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000179
Guido van Rossum73624e91994-10-10 17:59:00 +0000180static PyObject *
181PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000182{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000183#ifdef MS_WINDOWS
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000184 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000185 PyObject *v;
186 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000187 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000188 PyErr_SetObject(PySocket_Error, v);
189 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000190 }
191 return NULL;
192 }
193 else
194#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000195 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000196}
197
Guido van Rossum30a685f1991-06-27 15:51:29 +0000198
199/* The object holding a socket. It holds some extra information,
200 like the address family, which is used to decode socket address
201 arguments properly. */
202
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000203typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000204 PyObject_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000205 int sock_fd; /* Socket file descriptor */
206 int sock_family; /* Address family, e.g., AF_INET */
207 int sock_type; /* Socket type, e.g., SOCK_STREAM */
208 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000209 union sock_addr {
210 struct sockaddr_in in;
211#ifdef AF_UNIX
212 struct sockaddr_un un;
213#endif
214 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000215} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000216
Guido van Rossum30a685f1991-06-27 15:51:29 +0000217
218/* A forward reference to the Socktype type object.
219 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000220 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000221 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000222
Guido van Rossum73624e91994-10-10 17:59:00 +0000223staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000224
Guido van Rossum30a685f1991-06-27 15:51:29 +0000225
226/* Create a new socket object.
227 This just creates the object and initializes it.
228 If the creation fails, return NULL and set an exception (implicit
229 in NEWOBJ()). */
230
Guido van Rossum73624e91994-10-10 17:59:00 +0000231static PySocketSockObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000232BUILD_FUNC_DEF_4(PySocketSock_New,int,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000233{
Guido van Rossum73624e91994-10-10 17:59:00 +0000234 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000235 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum73624e91994-10-10 17:59:00 +0000236 s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000237 if (s != NULL) {
238 s->sock_fd = fd;
239 s->sock_family = family;
240 s->sock_type = type;
241 s->sock_proto = proto;
242 }
243 return s;
244}
245
Guido van Rossum30a685f1991-06-27 15:51:29 +0000246
247/* Convert a string specifying a host name or one of a few symbolic
248 names to a numeric IP address. This usually calls gethostbyname()
249 to do the work; the names "" and "<broadcast>" are special.
250 Return the length (should always be 4 bytes), or negative if
251 an error occurred; then an exception is raised. */
252
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000253static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000254BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000255{
256 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000257 int d1, d2, d3, d4;
258 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000259#ifdef HAVE_GETHOSTBYNAME_R
260 struct hostent hp_allocated;
261 char buf[1001];
262 int buf_len = (sizeof buf) - 1;
263 int errnop;
264#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000265
Guido van Rossuma376cc51996-12-05 23:43:35 +0000266 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000267 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000268 addr_ret->sin_addr.s_addr = INADDR_ANY;
269 return 4;
270 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000271 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000272 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
273 return 4;
274 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000275 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
276 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
277 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
278 addr_ret->sin_addr.s_addr = htonl(
279 ((long) d1 << 24) | ((long) d2 << 16) |
280 ((long) d3 << 8) | ((long) d4 << 0));
281 return 4;
282 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000283#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum73624e91994-10-10 17:59:00 +0000284 Py_BEGIN_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000285 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum73624e91994-10-10 17:59:00 +0000286 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000287#else /* not HAVE_GETHOSTBYNAME_R */
288 hp = gethostbyname(name);
289#endif /* HAVE_GETHOSTBYNAME_R */
290
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000291 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000292#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000293 /* Let's get real error message to return */
294 extern int h_errno;
295 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
296#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000297 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000298#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000299 return -1;
300 }
301 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
302 return hp->h_length;
303}
304
Guido van Rossum30a685f1991-06-27 15:51:29 +0000305
Guido van Rossum30a685f1991-06-27 15:51:29 +0000306/* Create a string object representing an IP address.
307 This is always a string of the form 'dd.dd.dd.dd' (with variable
308 size numbers). */
309
Guido van Rossum73624e91994-10-10 17:59:00 +0000310static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000311BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000312{
313 long x = ntohl(addr->sin_addr.s_addr);
314 char buf[100];
315 sprintf(buf, "%d.%d.%d.%d",
316 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
317 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000318 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000319}
320
321
322/* Create an object representing the given socket address,
323 suitable for passing it back to bind(), connect() etc.
324 The family field of the sockaddr structure is inspected
325 to determine what kind of address it really is. */
326
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000327/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000328static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000329BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000330{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000331 if (addrlen == 0) {
332 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000333 Py_INCREF(Py_None);
334 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000335 }
336
Guido van Rossum30a685f1991-06-27 15:51:29 +0000337 switch (addr->sa_family) {
338
339 case AF_INET:
340 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000341 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000342 PyObject *addr = makeipaddr(a);
343 PyObject *ret = Py_BuildValue("Oi", addr, ntohs(a->sin_port));
344 Py_XDECREF(addr);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000345 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000346 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000347
Guido van Rossumb6775db1994-08-01 11:34:53 +0000348#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000349 case AF_UNIX:
350 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000351 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000352 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000353 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000354#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000355
356 /* More cases here... */
357
358 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000359 PyErr_SetString(PySocket_Error, "return unknown socket address type");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000360 return NULL;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000361
Guido van Rossum30a685f1991-06-27 15:51:29 +0000362 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000363}
364
Guido van Rossum30a685f1991-06-27 15:51:29 +0000365
366/* Parse a socket address argument according to the socket object's
367 address family. Return 1 if the address was in the proper format,
368 0 of not. The address is returned through addr_ret, its length
369 through len_ret. */
370
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000371static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000372BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000373getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000374{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000375 switch (s->sock_family) {
376
Guido van Rossumb6775db1994-08-01 11:34:53 +0000377#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000378 case AF_UNIX:
379 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000380 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000381 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000382 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000383 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum73624e91994-10-10 17:59:00 +0000384 if (!PyArg_Parse(args, "s#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000385 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000386 if (len > sizeof addr->sun_path) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000387 PyErr_SetString(PySocket_Error, "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000388 return 0;
389 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000390 addr->sun_family = AF_UNIX;
391 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000392 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000393 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000394 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000395 return 1;
396 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000397#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000398
Guido van Rossum30a685f1991-06-27 15:51:29 +0000399 case AF_INET:
400 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000401 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000402 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000403 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000404 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000405 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000406 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000407 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000408 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000409 addr->sin_family = AF_INET;
410 addr->sin_port = htons(port);
411 *addr_ret = (struct sockaddr *) addr;
412 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000413 return 1;
414 }
415
Guido van Rossum30a685f1991-06-27 15:51:29 +0000416 /* More cases here... */
417
418 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000419 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000420 return 0;
421
422 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000423}
424
Guido van Rossum30a685f1991-06-27 15:51:29 +0000425
Guido van Rossum710e1df1992-06-12 10:39:36 +0000426/* Get the address length according to the socket object's address family.
427 Return 1 if the family is known, 0 otherwise. The length is returned
428 through len_ret. */
429
430static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000431BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000432{
433 switch (s->sock_family) {
434
Guido van Rossumb6775db1994-08-01 11:34:53 +0000435#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000436 case AF_UNIX:
437 {
438 *len_ret = sizeof (struct sockaddr_un);
439 return 1;
440 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000441#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000442
443 case AF_INET:
444 {
445 *len_ret = sizeof (struct sockaddr_in);
446 return 1;
447 }
448
449 /* More cases here... */
450
451 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000452 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000453 return 0;
454
455 }
456}
457
458
Guido van Rossum30a685f1991-06-27 15:51:29 +0000459/* s.accept() method */
460
Guido van Rossum73624e91994-10-10 17:59:00 +0000461static PyObject *
462BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000463{
464 char addrbuf[256];
465 int addrlen, newfd;
Guido van Rossum73624e91994-10-10 17:59:00 +0000466 PyObject *sock, *addr, *res;
467 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000468 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000469 if (!getsockaddrlen(s, &addrlen))
470 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000471 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000472 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000473 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000474 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000475 return PySocket_Err();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000476 /* Create the new object with unspecified family,
477 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000478 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000479 s->sock_family,
480 s->sock_type,
481 s->sock_proto);
482 if (sock == NULL)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000483 close(newfd);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000484 addr = makesockaddr((struct sockaddr *) addrbuf, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000485 res = Py_BuildValue("OO", sock, addr);
486 Py_XDECREF(sock);
487 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000488 return res;
489}
490
Guido van Rossum30a685f1991-06-27 15:51:29 +0000491
Guido van Rossume4485b01994-09-07 14:32:49 +0000492/* s.setblocking(1 | 0) method */
493
Guido van Rossum73624e91994-10-10 17:59:00 +0000494static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000495BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000496{
497 int block;
498 int delay_flag;
Guido van Rossum73624e91994-10-10 17:59:00 +0000499 if (!PyArg_GetInt(args, &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000500 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000501 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +0000502#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000503 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
504 if (block)
505 delay_flag &= (~O_NDELAY);
506 else
507 delay_flag |= O_NDELAY;
508 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000509#else
510 block = !block;
511 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
512#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000513 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000514
Guido van Rossum73624e91994-10-10 17:59:00 +0000515 Py_INCREF(Py_None);
516 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000517}
Guido van Rossume4485b01994-09-07 14:32:49 +0000518
519
Guido van Rossumaee08791992-09-08 09:05:33 +0000520/* s.setsockopt() method.
521 With an integer third argument, sets an integer option.
522 With a string third argument, sets an option from a buffer;
523 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000524
Guido van Rossum73624e91994-10-10 17:59:00 +0000525static PyObject *
526BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000527{
528 int level;
529 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000530 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000531 char *buf;
532 int buflen;
533 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000534
Guido van Rossum73624e91994-10-10 17:59:00 +0000535 if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000536 buf = (char *) &flag;
537 buflen = sizeof flag;
538 }
539 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000540 PyErr_Clear();
541 if (!PyArg_Parse(args, "(iis#)", &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000542 return NULL;
543 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000544 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000545 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000546 return PySocket_Err();
547 Py_INCREF(Py_None);
548 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000549}
550
551
Guido van Rossumaee08791992-09-08 09:05:33 +0000552/* s.getsockopt() method.
553 With two arguments, retrieves an integer option.
554 With a third integer argument, retrieves a string buffer of that size;
555 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000556
Guido van Rossum73624e91994-10-10 17:59:00 +0000557static PyObject *
558BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000559{
560 int level;
561 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000562 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000563 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000564 int buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000565
Guido van Rossumbe32c891996-06-20 16:25:29 +0000566 if (!PyArg_ParseTuple(args, "ii|i", &level, &optname, &buflen))
567 return NULL;
568
569 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000570 int flag = 0;
571 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000572 res = getsockopt(s->sock_fd, level, optname,
573 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000574 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000575 return PySocket_Err();
576 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000577 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000578 if (buflen <= 0 || buflen > 1024) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000579 PyErr_SetString(PySocket_Error, "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000580 return NULL;
581 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000582 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000583 if (buf == NULL)
584 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000585 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000586 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000587 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000588 Py_DECREF(buf);
589 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000590 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000591 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000592 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000593}
594
595
Guido van Rossum30a685f1991-06-27 15:51:29 +0000596/* s.bind(sockaddr) method */
597
Guido van Rossum73624e91994-10-10 17:59:00 +0000598static PyObject *
599BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000600{
601 struct sockaddr *addr;
602 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000603 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000604 if (!getsockaddrarg(s, args, &addr, &addrlen))
605 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000606 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000607 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000608 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000609 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000610 return PySocket_Err();
611 Py_INCREF(Py_None);
612 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000613}
614
Guido van Rossum30a685f1991-06-27 15:51:29 +0000615
616/* s.close() method.
617 Set the file descriptor to -1 so operations tried subsequently
618 will surely fail. */
619
Guido van Rossum73624e91994-10-10 17:59:00 +0000620static PyObject *
621BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000622{
Guido van Rossum73624e91994-10-10 17:59:00 +0000623 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000624 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000625 if (s->sock_fd != -1) {
626 Py_BEGIN_ALLOW_THREADS
627 (void) close(s->sock_fd);
628 Py_END_ALLOW_THREADS
629 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000630 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000631 Py_INCREF(Py_None);
632 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000633}
634
Guido van Rossum30a685f1991-06-27 15:51:29 +0000635
636/* s.connect(sockaddr) method */
637
Guido van Rossum73624e91994-10-10 17:59:00 +0000638static PyObject *
639BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000640{
641 struct sockaddr *addr;
642 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000643 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000644 if (!getsockaddrarg(s, args, &addr, &addrlen))
645 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000646 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000647 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000648 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000649 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000650 return PySocket_Err();
651 Py_INCREF(Py_None);
652 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000653}
654
Guido van Rossum30a685f1991-06-27 15:51:29 +0000655
Guido van Rossumed233a51992-06-23 09:07:03 +0000656/* s.fileno() method */
657
Guido van Rossum73624e91994-10-10 17:59:00 +0000658static PyObject *
659BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000660{
Guido van Rossum73624e91994-10-10 17:59:00 +0000661 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000662 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000663 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000664}
665
666
Guido van Rossumbe32c891996-06-20 16:25:29 +0000667#ifndef NO_DUP
668/* s.dup() method */
669
670static PyObject *
671BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
672{
673 int newfd;
674 PyObject *sock;
675 if (!PyArg_NoArgs(args))
676 return NULL;
677 newfd = dup(s->sock_fd);
678 if (newfd < 0)
679 return PySocket_Err();
680 sock = (PyObject *) PySocketSock_New(newfd,
681 s->sock_family,
682 s->sock_type,
683 s->sock_proto);
684 if (sock == NULL)
685 close(newfd);
686 return sock;
687}
688#endif
689
690
Guido van Rossumc89705d1992-11-26 08:54:07 +0000691/* s.getsockname() method */
692
Guido van Rossum73624e91994-10-10 17:59:00 +0000693static PyObject *
694BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000695{
696 char addrbuf[256];
697 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000698 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000699 return NULL;
700 if (!getsockaddrlen(s, &addrlen))
701 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +0000702 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000703 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000704 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000705 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000706 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000707 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000708 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
709}
710
711
Guido van Rossumb6775db1994-08-01 11:34:53 +0000712#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000713/* s.getpeername() method */
714
Guido van Rossum73624e91994-10-10 17:59:00 +0000715static PyObject *
716BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000717{
718 char addrbuf[256];
719 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000720 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000721 return NULL;
722 if (!getsockaddrlen(s, &addrlen))
723 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000724 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000725 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000726 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000727 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000728 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000729 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
730}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000731#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000732
733
Guido van Rossum30a685f1991-06-27 15:51:29 +0000734/* s.listen(n) method */
735
Guido van Rossum73624e91994-10-10 17:59:00 +0000736static PyObject *
737BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000738{
739 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000740 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000741 if (!PyArg_GetInt(args, &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000742 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000743 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000744 if (backlog < 1)
745 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000746 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +0000747 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000748 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000749 return PySocket_Err();
750 Py_INCREF(Py_None);
751 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000752}
753
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000754#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +0000755/* s.makefile(mode) method.
756 Create a new open file object referring to a dupped version of
757 the socket's file descriptor. (The dup() call is necessary so
758 that the open file and socket objects may be closed independent
759 of each other.)
760 The mode argument specifies 'r' or 'w' passed to fdopen(). */
761
Guido van Rossum73624e91994-10-10 17:59:00 +0000762static PyObject *
763BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000764{
Guido van Rossuma597dde1995-01-10 20:56:29 +0000765 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +0000766 char *mode = "r";
767 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000768 int fd;
769 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +0000770 PyObject *f;
771
772 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000773 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +0000774#ifdef MS_WIN32
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000775 if ( ((fd = _open_osfhandle( s->sock_fd, _O_BINARY )) < 0) ||
776 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL)) {
777#else
Guido van Rossum30a685f1991-06-27 15:51:29 +0000778 if ((fd = dup(s->sock_fd)) < 0 ||
Guido van Rossum6b144911995-03-14 15:05:13 +0000779 (fp = fdopen(fd, mode)) == NULL) {
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000780#endif
Guido van Rossum6b144911995-03-14 15:05:13 +0000781 if (fd >= 0)
782 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000783 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +0000784 }
785 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
786 if (f != NULL)
787 PyFile_SetBufSize(f, bufsize);
788 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000789}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000790#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000791
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000792/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000793
Guido van Rossum73624e91994-10-10 17:59:00 +0000794static PyObject *
795BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000796{
Guido van Rossumbe32c891996-06-20 16:25:29 +0000797 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000798 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000799 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
800 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000801 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000802 if (buf == NULL)
803 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000804 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +0000805 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000806 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +0000807 if (n < 0) {
808 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +0000809 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +0000810 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +0000811 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000812 return NULL;
813 return buf;
814}
815
Guido van Rossum30a685f1991-06-27 15:51:29 +0000816
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000817/* s.recvfrom(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_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000821{
822 char addrbuf[256];
Guido van Rossum73624e91994-10-10 17:59:00 +0000823 PyObject *buf, *addr, *ret;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000824 int addrlen, len, n, flags = 0;
825 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
826 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000827 if (!getsockaddrlen(s, &addrlen))
828 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000829 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000830 if (buf == NULL)
831 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000832 Py_BEGIN_ALLOW_THREADS
833 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +0000834#ifndef MS_WINDOWS
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000835 (ANY *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000836#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000837 (struct sockaddr *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000838#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000839 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +0000840 if (n < 0) {
841 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +0000842 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +0000843 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +0000844 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000845 return NULL;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000846 addr = makesockaddr((struct sockaddr *)addrbuf, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000847 ret = Py_BuildValue("OO", buf, addr);
848 Py_XDECREF(addr);
849 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000850 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000851}
852
Guido van Rossum30a685f1991-06-27 15:51:29 +0000853
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000854/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000855
Guido van Rossum73624e91994-10-10 17:59:00 +0000856static PyObject *
857BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000858{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000859 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000860 int len, n, flags = 0;
861 if (!PyArg_ParseTuple(args, "s#|i", &buf, &len, &flags))
862 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000863 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000864 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000865 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +0000866 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000867 return PySocket_Err();
868 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000869}
870
871
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000872/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000873
Guido van Rossum73624e91994-10-10 17:59:00 +0000874static PyObject *
875BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000876{
Guido van Rossum73624e91994-10-10 17:59:00 +0000877 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000878 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000879 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000880 int addrlen, len, n, flags;
881 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000882 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
883 PyErr_Clear();
884 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000885 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000886 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000887 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000888 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000889 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000890 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000891 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000892 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000893 return PySocket_Err();
894 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000895}
896
Guido van Rossum30a685f1991-06-27 15:51:29 +0000897
898/* s.shutdown(how) method */
899
Guido van Rossum73624e91994-10-10 17:59:00 +0000900static PyObject *
901BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000902{
903 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000904 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000905 if (!PyArg_GetInt(args, &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000906 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000907 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000908 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +0000909 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000910 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000911 return PySocket_Err();
912 Py_INCREF(Py_None);
913 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000914}
915
Guido van Rossum30a685f1991-06-27 15:51:29 +0000916
917/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000918
Guido van Rossum73624e91994-10-10 17:59:00 +0000919static PyMethodDef PySocketSock_methods[] = {
920 {"accept", (PyCFunction)PySocketSock_accept},
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000921 {"setblocking", (PyCFunction)PySocketSock_setblocking},
Guido van Rossum73624e91994-10-10 17:59:00 +0000922 {"setsockopt", (PyCFunction)PySocketSock_setsockopt},
Guido van Rossumbe32c891996-06-20 16:25:29 +0000923 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1},
Guido van Rossum73624e91994-10-10 17:59:00 +0000924 {"bind", (PyCFunction)PySocketSock_bind},
925 {"close", (PyCFunction)PySocketSock_close},
926 {"connect", (PyCFunction)PySocketSock_connect},
927 {"fileno", (PyCFunction)PySocketSock_fileno},
Guido van Rossumbe32c891996-06-20 16:25:29 +0000928#ifndef NO_DUP
929 {"dup", (PyCFunction)PySocketSock_dup},
930#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000931 {"getsockname", (PyCFunction)PySocketSock_getsockname},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000932#ifdef HAVE_GETPEERNAME
Guido van Rossum73624e91994-10-10 17:59:00 +0000933 {"getpeername", (PyCFunction)PySocketSock_getpeername},
Guido van Rossum9575a441993-04-07 14:06:14 +0000934#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000935 {"listen", (PyCFunction)PySocketSock_listen},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000936#ifndef NO_DUP
Guido van Rossum6b144911995-03-14 15:05:13 +0000937 {"makefile", (PyCFunction)PySocketSock_makefile, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000938#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +0000939 {"recv", (PyCFunction)PySocketSock_recv, 1},
940 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1},
941 {"send", (PyCFunction)PySocketSock_send, 1},
Guido van Rossum73624e91994-10-10 17:59:00 +0000942 {"sendto", (PyCFunction)PySocketSock_sendto},
943 {"shutdown", (PyCFunction)PySocketSock_shutdown},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000944 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000945};
946
Guido van Rossum30a685f1991-06-27 15:51:29 +0000947
Guido van Rossum73624e91994-10-10 17:59:00 +0000948/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +0000949 First close the file description. */
950
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000951static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000952BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000953{
954 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000955 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000956}
957
Guido van Rossum30a685f1991-06-27 15:51:29 +0000958
959/* Return a socket object's named attribute. */
960
Guido van Rossum73624e91994-10-10 17:59:00 +0000961static PyObject *
962BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000963{
Guido van Rossum73624e91994-10-10 17:59:00 +0000964 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000965}
966
Guido van Rossum30a685f1991-06-27 15:51:29 +0000967
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000968static PyObject *
969BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
970{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000971 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000972 sprintf(buf,
973 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
974 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +0000975 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000976}
977
978
Guido van Rossumb6775db1994-08-01 11:34:53 +0000979/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000980
Guido van Rossum73624e91994-10-10 17:59:00 +0000981static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +0000982 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000983 0,
984 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +0000985 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000986 0,
Guido van Rossum73624e91994-10-10 17:59:00 +0000987 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000988 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000989 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000990 0, /*tp_setattr*/
991 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000992 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000993 0, /*tp_as_number*/
994 0, /*tp_as_sequence*/
995 0, /*tp_as_mapping*/
996};
997
Guido van Rossum30a685f1991-06-27 15:51:29 +0000998
Guido van Rossum81194471991-07-27 21:42:02 +0000999/* Python interface to gethostname(). */
1000
1001/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001002static PyObject *
1003BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001004{
1005 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001006 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001007 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +00001008 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001009 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001010 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001011 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001012 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001013 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001014 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001015 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001016}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001017
1018
Guido van Rossum30a685f1991-06-27 15:51:29 +00001019/* Python interface to gethostbyname(name). */
1020
1021/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001022static PyObject *
1023BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001024{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001025 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001026 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +00001027 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001028 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001029 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001030 return NULL;
1031 return makeipaddr(&addrbuf);
1032}
1033
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001034/* Python interface to gethostbyaddr(IP). */
1035
1036/*ARGSUSED*/
1037static PyObject *
1038BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1039{
1040 struct sockaddr_in addr;
1041 char *ip_num;
1042 struct hostent *h;
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001043 char **pch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001044 PyObject *rtn_tuple = (PyObject *)NULL;
1045 PyObject *name_list = (PyObject *)NULL;
1046 PyObject *addr_list = (PyObject *)NULL;
1047 PyObject *tmp;
1048
1049 if (!PyArg_Parse(args, "s", &ip_num))
1050 return NULL;
1051 if (setipaddr(ip_num, &addr) < 0)
1052 return NULL;
1053 h = gethostbyaddr((char *)&addr.sin_addr,
1054 sizeof(addr.sin_addr),
1055 AF_INET);
1056 if (h == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +00001057#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001058 /* Let's get real error message to return */
1059 extern int h_errno;
1060 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1061#else
1062 PyErr_SetString(PySocket_Error, "host not found");
1063#endif
1064 return NULL;
1065 }
1066 if ((name_list = PyList_New(0)) == NULL)
1067 goto err;
1068 if ((addr_list = PyList_New(0)) == NULL)
1069 goto err;
1070 for (pch = h->h_aliases; *pch != NULL; pch++) {
1071 tmp = PyString_FromString(*pch);
1072 if (tmp == NULL)
1073 goto err;
1074 PyList_Append(name_list, tmp);
1075 Py_DECREF(tmp);
1076 }
1077 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1078 memcpy((char *) &addr.sin_addr, *pch, h->h_length);
1079 tmp = makeipaddr(&addr);
1080 if (tmp == NULL)
1081 goto err;
1082 PyList_Append(addr_list, tmp);
1083 Py_DECREF(tmp);
1084 }
1085 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1086 err:
1087 Py_XDECREF(name_list);
1088 Py_XDECREF(addr_list);
1089 return rtn_tuple;
1090}
1091
Guido van Rossum30a685f1991-06-27 15:51:29 +00001092
1093/* Python interface to getservbyname(name).
1094 This only returns the port number, since the other info is already
1095 known or not useful (like the list of aliases). */
1096
1097/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001098static PyObject *
1099BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001100{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001101 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001102 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001103 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001104 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001105 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001106 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001107 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001108 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001109 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001110 return NULL;
1111 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001112 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001113}
1114
1115
1116/* Python interface to socket(family, type, proto).
1117 The third (protocol) argument is optional.
1118 Return a new socket object. */
1119
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001120/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001121static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001122BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001123{
Guido van Rossum73624e91994-10-10 17:59:00 +00001124 PySocketSockObject *s;
Guido van Rossum6f489d91996-06-28 20:15:15 +00001125#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001126 SOCKET fd;
1127#else
1128 int fd;
1129#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001130 int family, type, proto = 0;
1131 if (!PyArg_ParseTuple(args, "ii|i", &family, &type, &proto))
1132 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001133 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001134 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001135 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001136#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001137 if (fd == INVALID_SOCKET)
1138#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001139 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001140#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001141 return PySocket_Err();
1142 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001143 /* If the object can't be created, don't forget to close the
1144 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001145 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001146 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001147 /* From now on, ignore SIGPIPE and let the error checking
1148 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001149#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001150 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001151#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001152 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001153}
1154
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001155#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001156/* Create a socket object from a numeric file description.
1157 Useful e.g. if stdin is a socket.
1158 Additional arguments as for socket(). */
1159
1160/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001161static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001162BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001163{
Guido van Rossum73624e91994-10-10 17:59:00 +00001164 PySocketSockObject *s;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001165 int fd, family, type, proto = 0;
1166 if (!PyArg_ParseTuple(args, "iii|i", &fd, &family, &type, &proto))
1167 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001168 /* Dup the fd so it and the socket can be closed independently */
1169 fd = dup(fd);
1170 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001171 return PySocket_Err();
1172 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001173 /* From now on, ignore SIGPIPE and let the error checking
1174 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001175#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001176 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001177#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001178 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001179}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001180#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001181
Guido van Rossum006bf911996-06-12 04:04:55 +00001182static PyObject *
1183BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1184{
1185 int x1, x2;
1186
1187 if (!PyArg_Parse(args, "i", &x1)) {
1188 return NULL;
1189 }
1190 x2 = (int)ntohs((short)x1);
1191 return PyInt_FromLong(x2);
1192}
1193
1194static PyObject *
1195BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1196{
1197 int x1, x2;
1198
1199 if (!PyArg_Parse(args, "i", &x1)) {
1200 return NULL;
1201 }
1202 x2 = ntohl(x1);
1203 return PyInt_FromLong(x2);
1204}
1205
1206static PyObject *
1207BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1208{
1209 int x1, x2;
1210
1211 if (!PyArg_Parse(args, "i", &x1)) {
1212 return NULL;
1213 }
1214 x2 = (int)htons((short)x1);
1215 return PyInt_FromLong(x2);
1216}
1217
1218static PyObject *
1219BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1220{
1221 int x1, x2;
1222
1223 if (!PyArg_Parse(args, "i", &x1)) {
1224 return NULL;
1225 }
1226 x2 = htonl(x1);
1227 return PyInt_FromLong(x2);
1228}
1229
Guido van Rossum30a685f1991-06-27 15:51:29 +00001230/* List of functions exported by this module. */
1231
Guido van Rossum73624e91994-10-10 17:59:00 +00001232static PyMethodDef PySocket_methods[] = {
1233 {"gethostbyname", PySocket_gethostbyname},
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001234 {"gethostbyaddr", PySocket_gethostbyaddr},
Guido van Rossum73624e91994-10-10 17:59:00 +00001235 {"gethostname", PySocket_gethostname},
1236 {"getservbyname", PySocket_getservbyname},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001237 {"socket", PySocket_socket, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001238#ifndef NO_DUP
Guido van Rossumbe32c891996-06-20 16:25:29 +00001239 {"fromfd", PySocket_fromfd, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001240#endif
Guido van Rossum006bf911996-06-12 04:04:55 +00001241 {"ntohs", PySocket_ntohs},
1242 {"ntohl", PySocket_ntohl},
1243 {"htons", PySocket_htons},
1244 {"htonl", PySocket_htonl},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001245 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001246};
1247
Guido van Rossum30a685f1991-06-27 15:51:29 +00001248
1249/* Convenience routine to export an integer value.
1250 For simplicity, errors (which are unlikely anyway) are ignored. */
1251
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001252static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001253BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001254{
Guido van Rossum73624e91994-10-10 17:59:00 +00001255 PyObject *v = PyInt_FromLong((long) value);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001256 if (v == NULL) {
1257 /* Don't bother reporting this error */
Guido van Rossum73624e91994-10-10 17:59:00 +00001258 PyErr_Clear();
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001259 }
1260 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001261 PyDict_SetItemString(d, name, v);
1262 Py_DECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001263 }
1264}
1265
Guido van Rossum30a685f1991-06-27 15:51:29 +00001266
Guido van Rossum8d665e61996-06-26 18:22:49 +00001267#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001268
1269/* Additional initialization and cleanup for NT/Windows */
1270
1271static void
1272NTcleanup()
1273{
1274 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00001275}
1276
1277static int
1278NTinit()
1279{
1280 WSADATA WSAData;
1281 int ret;
1282 char buf[100];
1283 ret = WSAStartup(0x0101, &WSAData);
1284 switch (ret) {
1285 case 0: /* no error */
1286 atexit(NTcleanup);
1287 return 1;
1288 case WSASYSNOTREADY:
1289 PyErr_SetString(PyExc_ImportError,
1290 "WSAStartup failed: network not ready");
1291 break;
1292 case WSAVERNOTSUPPORTED:
1293 case WSAEINVAL:
1294 PyErr_SetString(PyExc_ImportError,
1295 "WSAStartup failed: requested version not supported");
1296 break;
1297 default:
1298 sprintf(buf, "WSAStartup failed: error code %d", ret);
1299 PyErr_SetString(PyExc_ImportError, buf);
1300 break;
1301 }
1302 return 0;
1303}
1304
Guido van Rossum8d665e61996-06-26 18:22:49 +00001305#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00001306
1307
Guido van Rossum30a685f1991-06-27 15:51:29 +00001308/* Initialize this module.
1309 This is called when the first 'import socket' is done,
1310 via a table in config.c, if config.c is compiled with USE_SOCKET
Guido van Rossumbe32c891996-06-20 16:25:29 +00001311 defined.
1312
Guido van Rossum8d665e61996-06-26 18:22:49 +00001313 For MS_WINDOWS (which means any Windows variant), this module
Guido van Rossumbe32c891996-06-20 16:25:29 +00001314 is actually called "_socket", and there's a wrapper "socket.py"
1315 which implements some missing functionality (such as makefile(),
1316 dup() and fromfd()). The import of "_socket" may fail with an
1317 ImportError exception if initialization of WINSOCK fails. When
1318 WINSOCK is initialized succesfully, a call to WSACleanup() is
1319 scheduled to be made at exit time. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001320
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001321void
Guido van Rossum8d665e61996-06-26 18:22:49 +00001322#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001323init_socket()
1324#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001325initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00001326#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001327{
Guido van Rossum73624e91994-10-10 17:59:00 +00001328 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001329#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001330 if (!NTinit())
1331 return;
1332 m = Py_InitModule("_socket", PySocket_methods);
1333#else
Guido van Rossum73624e91994-10-10 17:59:00 +00001334 m = Py_InitModule("socket", PySocket_methods);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001335#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001336 d = PyModule_GetDict(m);
1337 PySocket_Error = PyString_FromString("socket.error");
1338 if (PySocket_Error == NULL ||
1339 PyDict_SetItemString(d, "error", PySocket_Error) != 0)
1340 Py_FatalError("can't define socket.error");
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001341 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001342#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001343 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001344#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001345 insint(d, "SOCK_STREAM", SOCK_STREAM);
1346 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
1347 insint(d, "SOCK_RAW", SOCK_RAW);
1348 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1349 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001350
1351#ifdef SO_DEBUG
1352 insint(d, "SO_DEBUG", SO_DEBUG);
1353#endif
1354#ifdef SO_ACCEPTCONN
1355 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
1356#endif
1357#ifdef SO_REUSEADDR
1358 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
1359#endif
1360#ifdef SO_KEEPALIVE
1361 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
1362#endif
1363#ifdef SO_DONTROUTE
1364 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
1365#endif
1366#ifdef SO_BROADCAST
1367 insint(d, "SO_BROADCAST", SO_BROADCAST);
1368#endif
1369#ifdef SO_USELOOPBACK
1370 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
1371#endif
1372#ifdef SO_LINGER
1373 insint(d, "SO_LINGER", SO_LINGER);
1374#endif
1375#ifdef SO_OOBINLINE
1376 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
1377#endif
1378#ifdef SO_REUSEPORT
1379 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
1380#endif
1381
1382#ifdef SO_SNDBUF
1383 insint(d, "SO_SNDBUF", SO_SNDBUF);
1384#endif
1385#ifdef SO_RCVBUF
1386 insint(d, "SO_RCVBUF", SO_RCVBUF);
1387#endif
1388#ifdef SO_SNDLOWAT
1389 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
1390#endif
1391#ifdef SO_RCVLOWAT
1392 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
1393#endif
1394#ifdef SO_SNDTIMEO
1395 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
1396#endif
1397#ifdef SO_RCVTIMEO
1398 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
1399#endif
1400#ifdef SO_ERROR
1401 insint(d, "SO_ERROR", SO_ERROR);
1402#endif
1403#ifdef SO_TYPE
1404 insint(d, "SO_TYPE", SO_TYPE);
1405#endif
1406
1407 /* Maximum number of connections for "listen" */
1408#ifdef SOMAXCONN
1409 insint(d, "SOMAXCONN", SOMAXCONN);
1410#else
1411 insint(d, "SOMAXCONN", 5); /* Common value */
1412#endif
1413
1414 /* Flags for send, recv */
1415#ifdef MSG_OOB
1416 insint(d, "MSG_OOB", MSG_OOB);
1417#endif
1418#ifdef MSG_PEEK
1419 insint(d, "MSG_PEEK", MSG_PEEK);
1420#endif
1421#ifdef MSG_DONTROUTE
1422 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
1423#endif
1424#ifdef MSG_EOR
1425 insint(d, "MSG_EOR", MSG_EOR);
1426#endif
1427#ifdef MSG_TRUNC
1428 insint(d, "MSG_TRUNC", MSG_TRUNC);
1429#endif
1430#ifdef MSG_CTRUNC
1431 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
1432#endif
1433#ifdef MSG_WAITALL
1434 insint(d, "MSG_WAITALL", MSG_WAITALL);
1435#endif
1436#ifdef MSG_BTAG
1437 insint(d, "MSG_BTAG", MSG_BTAG);
1438#endif
1439#ifdef MSG_ETAG
1440 insint(d, "MSG_ETAG", MSG_ETAG);
1441#endif
1442
1443 /* Protocol level and numbers, usable for [gs]etsockopt */
1444#ifdef SOL_SOCKET
1445 insint(d, "SOL_SOCKET", SOL_SOCKET);
1446#endif
1447#ifdef IPPROTO_IP
1448 insint(d, "IPPROTO_IP", IPPROTO_IP);
1449#endif
1450#ifdef IPPROTO_ICMP
1451 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
1452#endif
1453#ifdef IPPROTO_IGMP
1454 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
1455#endif
1456#ifdef IPPROTO_GGP
1457 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
1458#endif
1459#ifdef IPPROTO_TCP
1460 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
1461#endif
1462#ifdef IPPROTO_EGP
1463 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
1464#endif
1465#ifdef IPPROTO_PUP
1466 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
1467#endif
1468#ifdef IPPROTO_UDP
1469 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
1470#endif
1471#ifdef IPPROTO_IDP
1472 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
1473#endif
1474#ifdef IPPROTO_HELLO
1475 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
1476#endif
1477#ifdef IPPROTO_ND
1478 insint(d, "IPPROTO_ND", IPPROTO_ND);
1479#endif
1480#ifdef IPPROTO_TP
1481 insint(d, "IPPROTO_TP", IPPROTO_TP);
1482#endif
1483#ifdef IPPROTO_XTP
1484 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
1485#endif
1486#ifdef IPPROTO_EON
1487 insint(d, "IPPROTO_EON", IPPROTO_EON);
1488#endif
1489#ifdef IPPROTO_BIP
1490 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
1491#endif
1492/**/
1493#ifdef IPPROTO_RAW
1494 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
1495#endif
1496#ifdef IPPROTO_MAX
1497 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
1498#endif
1499
1500 /* Some port configuration */
1501#ifdef IPPORT_RESERVED
1502 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
1503#else
1504 insint(d, "IPPORT_RESERVED", 1024);
1505#endif
1506#ifdef IPPORT_USERRESERVED
1507 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
1508#else
1509 insint(d, "IPPORT_USERRESERVED", 5000);
1510#endif
1511
Guido van Rossum5f05eb41995-02-17 15:11:07 +00001512 /* Some reserved IP v.4 addresses */
1513#ifdef INADDR_ANY
1514 insint(d, "INADDR_ANY", INADDR_ANY);
1515#else
1516 insint(d, "INADDR_ANY", 0x00000000);
1517#endif
1518#ifdef INADDR_BROADCAST
1519 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
1520#else
1521 insint(d, "INADDR_BROADCAST", 0xffffffff);
1522#endif
1523#ifdef INADDR_LOOPBACK
1524 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
1525#else
1526 insint(d, "INADDR_LOOPBACK", 0x7F000001);
1527#endif
1528#ifdef INADDR_UNSPEC_GROUP
1529 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
1530#else
1531 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
1532#endif
1533#ifdef INADDR_ALLHOSTS_GROUP
1534 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
1535#else
1536 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
1537#endif
1538#ifdef INADDR_MAX_LOCAL_GROUP
1539 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
1540#else
1541 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
1542#endif
1543#ifdef INADDR_NONE
1544 insint(d, "INADDR_NONE", INADDR_NONE);
1545#else
1546 insint(d, "INADDR_NONE", 0xffffffff);
1547#endif
1548
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001549 /* IP [gs]etsockopt options */
1550#ifdef IP_OPTIONS
1551 insint(d, "IP_OPTIONS", IP_OPTIONS);
1552#endif
1553#ifdef IP_HDRINCL
1554 insint(d, "IP_HDRINCL", IP_HDRINCL);
1555#endif
1556#ifdef IP_TOS
1557 insint(d, "IP_TOS", IP_TOS);
1558#endif
1559#ifdef IP_TTL
1560 insint(d, "IP_TTL", IP_TTL);
1561#endif
1562#ifdef IP_RECVOPTS
1563 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
1564#endif
1565#ifdef IP_RECVRETOPTS
1566 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
1567#endif
1568#ifdef IP_RECVDSTADDR
1569 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
1570#endif
1571#ifdef IP_RETOPTS
1572 insint(d, "IP_RETOPTS", IP_RETOPTS);
1573#endif
1574#ifdef IP_MULTICAST_IF
1575 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
1576#endif
1577#ifdef IP_MULTICAST_TTL
1578 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
1579#endif
1580#ifdef IP_MULTICAST_LOOP
1581 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
1582#endif
1583#ifdef IP_ADD_MEMBERSHIP
1584 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
1585#endif
1586#ifdef IP_DROP_MEMBERSHIP
1587 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
1588#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001589}