blob: a2250478d87d88a8d35df5df80aa343eb60ad837 [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
Guido van Rossumfc4255d1997-11-19 18:57:13 +000069- s.connect_ex(sockaddr) --> 0 or errno (handy for e.g. async connect)
Guido van Rossum27e177d1995-03-16 15:43:47 +000070- s.fileno() --> file descriptor
Guido van Rossumbe32c891996-06-20 16:25:29 +000071- s.dup() --> same as socket.fromfd(os.dup(s.fileno(), ...)
Guido van Rossumc89705d1992-11-26 08:54:07 +000072- s.getpeername() --> sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000073- s.getsockname() --> sockaddr
74- s.getsockopt(level, optname[, buflen]) --> int or string
75- s.listen(backlog) --> None
Guido van Rossum6b144911995-03-14 15:05:13 +000076- s.makefile([mode[, bufsize]]) --> file object
Guido van Rossum27e177d1995-03-16 15:43:47 +000077- s.recv(buflen [,flags]) --> string
78- s.recvfrom(buflen [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000079- s.send(string [,flags]) --> nbytes
80- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum27e177d1995-03-16 15:43:47 +000081- s.setblocking(0 | 1) --> None
82- s.setsockopt(level, optname, value) --> None
83- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000084- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000085
Guido van Rossum6574b3e1991-06-25 21:36:08 +000086*/
87
Guido van Rossum73624e91994-10-10 17:59:00 +000088#include "Python.h"
Guido van Rossum6574b3e1991-06-25 21:36:08 +000089
Guido van Rossuma376cc51996-12-05 23:43:35 +000090#ifdef HAVE_UNISTD_H
91#include <unistd.h>
92#endif
93
Guido van Rossumfb4130d1996-12-10 15:17:08 +000094#ifndef MS_WINDOWS
95extern int gethostname(); /* For Solaris, at least */
96#endif
97
Guido van Rossumb6775db1994-08-01 11:34:53 +000098#include <sys/types.h>
99#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +0000100
Guido van Rossum81194471991-07-27 21:42:02 +0000101#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000102#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000103#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000104#include <sys/socket.h>
105#include <netinet/in.h>
Guido van Rossume4485b01994-09-07 14:32:49 +0000106#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000107#else
108#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000109#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000110#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000111#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000112#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000113#else
114#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000115#endif
116
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000117#ifndef O_NDELAY
118#define O_NDELAY O_NONBLOCK /* For QNX only? */
119#endif
120
Jack Jansen508537b1996-02-14 15:57:45 +0000121#ifdef USE_GUSI
122/* fdopen() isn't declared in stdio.h (sigh) */
123#include <GUSI.h>
124#endif
125
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000126
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000127/* Here we have some hacks to choose between K&R or ANSI style function
128 definitions. For NT to build this as an extension module (ie, DLL)
129 it must be compiled by the C++ compiler, as it takes the address of
130 a static data item exported from the main Python DLL.
131*/
Guido van Rossum8d665e61996-06-26 18:22:49 +0000132#ifdef MS_WINDOWS
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000133/* seem to be a few differences in the API */
134#define close closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000135#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000136#define FORCE_ANSI_FUNC_DEFS
137#endif
138
139#ifdef FORCE_ANSI_FUNC_DEFS
140#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
141fnname( arg1type arg1name )
142
143#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
144fnname( arg1type arg1name, arg2type arg2name )
145
146#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
147fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
148
149#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
150fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
151
152#else /* !FORCE_ANSI_FN_DEFS */
153#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
154fnname( arg1name ) \
155 arg1type arg1name;
156
157#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
158fnname( arg1name, arg2name ) \
159 arg1type arg1name; \
160 arg2type arg2name;
161
162#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
163fnname( arg1name, arg2name, arg3name ) \
164 arg1type arg1name; \
165 arg2type arg2name; \
166 arg3type arg3name;
167
168#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
169fnname( arg1name, arg2name, arg3name, arg4name ) \
170 arg1type arg1name; \
171 arg2type arg2name; \
172 arg3type arg3name; \
173 arg4type arg4name;
174
175#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000176
177/* Global variable holding the exception type for errors detected
178 by this module (but not argument type or memory errors, etc.). */
179
Guido van Rossum73624e91994-10-10 17:59:00 +0000180static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000181
182
183/* Convenience function to raise an error according to errno
184 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000185
Guido van Rossum73624e91994-10-10 17:59:00 +0000186static PyObject *
187PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000188{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000189#ifdef MS_WINDOWS
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000190 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000191 PyObject *v;
192 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000193 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000194 PyErr_SetObject(PySocket_Error, v);
195 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000196 }
197 return NULL;
198 }
199 else
200#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000201 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000202}
203
Guido van Rossum30a685f1991-06-27 15:51:29 +0000204
205/* The object holding a socket. It holds some extra information,
206 like the address family, which is used to decode socket address
207 arguments properly. */
208
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000209typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000210 PyObject_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000211 int sock_fd; /* Socket file descriptor */
212 int sock_family; /* Address family, e.g., AF_INET */
213 int sock_type; /* Socket type, e.g., SOCK_STREAM */
214 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000215 union sock_addr {
216 struct sockaddr_in in;
217#ifdef AF_UNIX
218 struct sockaddr_un un;
219#endif
220 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000221} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000222
Guido van Rossum30a685f1991-06-27 15:51:29 +0000223
224/* A forward reference to the Socktype type object.
225 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000226 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000227 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000228
Guido van Rossum73624e91994-10-10 17:59:00 +0000229staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000230
Guido van Rossum30a685f1991-06-27 15:51:29 +0000231
232/* Create a new socket object.
233 This just creates the object and initializes it.
234 If the creation fails, return NULL and set an exception (implicit
235 in NEWOBJ()). */
236
Guido van Rossum73624e91994-10-10 17:59:00 +0000237static PySocketSockObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000238BUILD_FUNC_DEF_4(PySocketSock_New,int,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000239{
Guido van Rossum73624e91994-10-10 17:59:00 +0000240 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000241 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum73624e91994-10-10 17:59:00 +0000242 s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000243 if (s != NULL) {
244 s->sock_fd = fd;
245 s->sock_family = family;
246 s->sock_type = type;
247 s->sock_proto = proto;
248 }
249 return s;
250}
251
Guido van Rossum30a685f1991-06-27 15:51:29 +0000252
253/* Convert a string specifying a host name or one of a few symbolic
254 names to a numeric IP address. This usually calls gethostbyname()
255 to do the work; the names "" and "<broadcast>" are special.
256 Return the length (should always be 4 bytes), or negative if
257 an error occurred; then an exception is raised. */
258
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000259static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000260BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000261{
262 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000263 int d1, d2, d3, d4;
264 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000265#ifdef HAVE_GETHOSTBYNAME_R
266 struct hostent hp_allocated;
267 char buf[1001];
268 int buf_len = (sizeof buf) - 1;
269 int errnop;
270#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000271
Guido van Rossuma376cc51996-12-05 23:43:35 +0000272 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000273 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000274 addr_ret->sin_addr.s_addr = INADDR_ANY;
275 return 4;
276 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000277 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000278 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
279 return 4;
280 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000281 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
282 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
283 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
284 addr_ret->sin_addr.s_addr = htonl(
285 ((long) d1 << 24) | ((long) d2 << 16) |
286 ((long) d3 << 8) | ((long) d4 << 0));
287 return 4;
288 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000289#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum73624e91994-10-10 17:59:00 +0000290 Py_BEGIN_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000291 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum73624e91994-10-10 17:59:00 +0000292 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000293#else /* not HAVE_GETHOSTBYNAME_R */
294 hp = gethostbyname(name);
295#endif /* HAVE_GETHOSTBYNAME_R */
296
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000297 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000298#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000299 /* Let's get real error message to return */
300 extern int h_errno;
301 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
302#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000303 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000304#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000305 return -1;
306 }
307 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
308 return hp->h_length;
309}
310
Guido van Rossum30a685f1991-06-27 15:51:29 +0000311
Guido van Rossum30a685f1991-06-27 15:51:29 +0000312/* Create a string object representing an IP address.
313 This is always a string of the form 'dd.dd.dd.dd' (with variable
314 size numbers). */
315
Guido van Rossum73624e91994-10-10 17:59:00 +0000316static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000317BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000318{
319 long x = ntohl(addr->sin_addr.s_addr);
320 char buf[100];
321 sprintf(buf, "%d.%d.%d.%d",
322 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
323 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000324 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000325}
326
327
328/* Create an object representing the given socket address,
329 suitable for passing it back to bind(), connect() etc.
330 The family field of the sockaddr structure is inspected
331 to determine what kind of address it really is. */
332
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000333/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000334static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000335BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000336{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000337 if (addrlen == 0) {
338 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000339 Py_INCREF(Py_None);
340 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000341 }
342
Guido van Rossum30a685f1991-06-27 15:51:29 +0000343 switch (addr->sa_family) {
344
345 case AF_INET:
346 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000347 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000348 PyObject *addrobj = makeipaddr(a);
349 PyObject *ret = NULL;
350 if (addrobj) {
351 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
352 Py_DECREF(addrobj);
353 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000354 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000355 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000356
Guido van Rossumb6775db1994-08-01 11:34:53 +0000357#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000358 case AF_UNIX:
359 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000360 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000361 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000362 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000363#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000364
365 /* More cases here... */
366
367 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000368 /* If we don't know the address family, don't raise an
369 exception -- return it as a tuple. */
370 return Py_BuildValue("is#",
371 addr->sa_family,
372 addr->sa_data,
373 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000374
Guido van Rossum30a685f1991-06-27 15:51:29 +0000375 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000376}
377
Guido van Rossum30a685f1991-06-27 15:51:29 +0000378
379/* Parse a socket address argument according to the socket object's
380 address family. Return 1 if the address was in the proper format,
381 0 of not. The address is returned through addr_ret, its length
382 through len_ret. */
383
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000384static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000385BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000386getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000387{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000388 switch (s->sock_family) {
389
Guido van Rossumb6775db1994-08-01 11:34:53 +0000390#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000391 case AF_UNIX:
392 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000393 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000394 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000395 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000396 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum73624e91994-10-10 17:59:00 +0000397 if (!PyArg_Parse(args, "s#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000398 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000399 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000400 PyErr_SetString(PySocket_Error,
401 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000402 return 0;
403 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000404 addr->sun_family = AF_UNIX;
405 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000406 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000407 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000408 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000409 return 1;
410 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000411#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000412
Guido van Rossum30a685f1991-06-27 15:51:29 +0000413 case AF_INET:
414 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000415 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000416 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000417 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000418 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000419 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000420 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000421 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000422 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000423 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000424 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000425 *addr_ret = (struct sockaddr *) addr;
426 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000427 return 1;
428 }
429
Guido van Rossum30a685f1991-06-27 15:51:29 +0000430 /* More cases here... */
431
432 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000433 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000434 return 0;
435
436 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000437}
438
Guido van Rossum30a685f1991-06-27 15:51:29 +0000439
Guido van Rossum710e1df1992-06-12 10:39:36 +0000440/* Get the address length according to the socket object's address family.
441 Return 1 if the family is known, 0 otherwise. The length is returned
442 through len_ret. */
443
444static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000445BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000446{
447 switch (s->sock_family) {
448
Guido van Rossumb6775db1994-08-01 11:34:53 +0000449#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000450 case AF_UNIX:
451 {
452 *len_ret = sizeof (struct sockaddr_un);
453 return 1;
454 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000455#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000456
457 case AF_INET:
458 {
459 *len_ret = sizeof (struct sockaddr_in);
460 return 1;
461 }
462
463 /* More cases here... */
464
465 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000466 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000467 return 0;
468
469 }
470}
471
472
Guido van Rossum30a685f1991-06-27 15:51:29 +0000473/* s.accept() method */
474
Guido van Rossum73624e91994-10-10 17:59:00 +0000475static PyObject *
476BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000477{
478 char addrbuf[256];
479 int addrlen, newfd;
Barry Warsaw752300b1997-01-03 17:18:10 +0000480 PyObject *sock = NULL;
481 PyObject *addr = NULL;
482 PyObject *res = NULL;
483
Guido van Rossum73624e91994-10-10 17:59:00 +0000484 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000485 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000486 if (!getsockaddrlen(s, &addrlen))
487 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000488 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000489 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000490 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000491 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000492 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000493
Guido van Rossum30a685f1991-06-27 15:51:29 +0000494 /* Create the new object with unspecified family,
495 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000496 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000497 s->sock_family,
498 s->sock_type,
499 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000500 if (sock == NULL) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000501 close(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000502 goto finally;
503 }
504 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
505 goto finally;
506
507 if (!(res = Py_BuildValue("OO", sock, addr)))
508 goto finally;
509
510 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000511 Py_XDECREF(sock);
512 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000513 return res;
514}
515
Guido van Rossum30a685f1991-06-27 15:51:29 +0000516
Guido van Rossume4485b01994-09-07 14:32:49 +0000517/* s.setblocking(1 | 0) method */
518
Guido van Rossum73624e91994-10-10 17:59:00 +0000519static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000520BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000521{
522 int block;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000523#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000524 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000525#endif
Guido van Rossumfe28fa01997-05-15 19:09:26 +0000526 if (!PyArg_Parse(args, "i", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000527 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000528 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +0000529#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000530 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
531 if (block)
532 delay_flag &= (~O_NDELAY);
533 else
534 delay_flag |= O_NDELAY;
535 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000536#else
537 block = !block;
538 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
539#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000540 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000541
Guido van Rossum73624e91994-10-10 17:59:00 +0000542 Py_INCREF(Py_None);
543 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000544}
Guido van Rossume4485b01994-09-07 14:32:49 +0000545
546
Guido van Rossumaee08791992-09-08 09:05:33 +0000547/* s.setsockopt() method.
548 With an integer third argument, sets an integer option.
549 With a string third argument, sets an option from a buffer;
550 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000551
Guido van Rossum73624e91994-10-10 17:59:00 +0000552static PyObject *
553BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000554{
555 int level;
556 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000557 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000558 char *buf;
559 int buflen;
560 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000561
Guido van Rossum73624e91994-10-10 17:59:00 +0000562 if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000563 buf = (char *) &flag;
564 buflen = sizeof flag;
565 }
566 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000567 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +0000568 if (!PyArg_Parse(args, "(iis#)", &level, &optname,
569 &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000570 return NULL;
571 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000572 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000573 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000574 return PySocket_Err();
575 Py_INCREF(Py_None);
576 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000577}
578
579
Guido van Rossumaee08791992-09-08 09:05:33 +0000580/* s.getsockopt() method.
581 With two arguments, retrieves an integer option.
582 With a third integer argument, retrieves a string buffer of that size;
583 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000584
Guido van Rossum73624e91994-10-10 17:59:00 +0000585static PyObject *
586BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000587{
588 int level;
589 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000590 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000591 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000592 int buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000593
Guido van Rossumbe32c891996-06-20 16:25:29 +0000594 if (!PyArg_ParseTuple(args, "ii|i", &level, &optname, &buflen))
595 return NULL;
596
597 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000598 int flag = 0;
599 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000600 res = getsockopt(s->sock_fd, level, optname,
601 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000602 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000603 return PySocket_Err();
604 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000605 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000606 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000607 PyErr_SetString(PySocket_Error,
608 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000609 return NULL;
610 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000611 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000612 if (buf == NULL)
613 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000614 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000615 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000616 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000617 Py_DECREF(buf);
618 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000619 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000620 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000621 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000622}
623
624
Guido van Rossum30a685f1991-06-27 15:51:29 +0000625/* s.bind(sockaddr) method */
626
Guido van Rossum73624e91994-10-10 17:59:00 +0000627static PyObject *
628BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000629{
630 struct sockaddr *addr;
631 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000632 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000633 if (!getsockaddrarg(s, args, &addr, &addrlen))
634 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000635 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000636 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000637 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000638 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000639 return PySocket_Err();
640 Py_INCREF(Py_None);
641 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000642}
643
Guido van Rossum30a685f1991-06-27 15:51:29 +0000644
645/* s.close() method.
646 Set the file descriptor to -1 so operations tried subsequently
647 will surely fail. */
648
Guido van Rossum73624e91994-10-10 17:59:00 +0000649static PyObject *
650BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000651{
Guido van Rossum73624e91994-10-10 17:59:00 +0000652 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000653 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000654 if (s->sock_fd != -1) {
655 Py_BEGIN_ALLOW_THREADS
656 (void) close(s->sock_fd);
657 Py_END_ALLOW_THREADS
658 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000659 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000660 Py_INCREF(Py_None);
661 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000662}
663
Guido van Rossum30a685f1991-06-27 15:51:29 +0000664
665/* s.connect(sockaddr) method */
666
Guido van Rossum73624e91994-10-10 17:59:00 +0000667static PyObject *
668BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000669{
670 struct sockaddr *addr;
671 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000672 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000673 if (!getsockaddrarg(s, args, &addr, &addrlen))
674 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000675 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000676 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000677 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000678 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000679 return PySocket_Err();
680 Py_INCREF(Py_None);
681 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000682}
683
Guido van Rossum30a685f1991-06-27 15:51:29 +0000684
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000685/* s.connect_ex(sockaddr) method */
686
687static PyObject *
688BUILD_FUNC_DEF_2(PySocketSock_connect_ex,PySocketSockObject *,s, PyObject *,args)
689{
690 struct sockaddr *addr;
691 int addrlen;
692 int res;
693 if (!getsockaddrarg(s, args, &addr, &addrlen))
694 return NULL;
695 Py_BEGIN_ALLOW_THREADS
696 res = connect(s->sock_fd, addr, addrlen);
697 Py_END_ALLOW_THREADS
698 if (res != 0)
699 res = errno;
700 return PyInt_FromLong((long) res);
701}
702
703
Guido van Rossumed233a51992-06-23 09:07:03 +0000704/* s.fileno() method */
705
Guido van Rossum73624e91994-10-10 17:59:00 +0000706static PyObject *
707BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000708{
Guido van Rossum73624e91994-10-10 17:59:00 +0000709 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000710 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000711 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000712}
713
714
Guido van Rossumbe32c891996-06-20 16:25:29 +0000715#ifndef NO_DUP
716/* s.dup() method */
717
718static PyObject *
719BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
720{
721 int newfd;
722 PyObject *sock;
723 if (!PyArg_NoArgs(args))
724 return NULL;
725 newfd = dup(s->sock_fd);
726 if (newfd < 0)
727 return PySocket_Err();
728 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +0000729 s->sock_family,
730 s->sock_type,
731 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +0000732 if (sock == NULL)
733 close(newfd);
734 return sock;
735}
736#endif
737
738
Guido van Rossumc89705d1992-11-26 08:54:07 +0000739/* s.getsockname() method */
740
Guido van Rossum73624e91994-10-10 17:59:00 +0000741static PyObject *
742BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000743{
744 char addrbuf[256];
745 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000746 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000747 return NULL;
748 if (!getsockaddrlen(s, &addrlen))
749 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +0000750 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000751 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000752 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000753 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000754 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000755 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000756 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
757}
758
759
Guido van Rossumb6775db1994-08-01 11:34:53 +0000760#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000761/* s.getpeername() method */
762
Guido van Rossum73624e91994-10-10 17:59:00 +0000763static PyObject *
764BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000765{
766 char addrbuf[256];
767 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000768 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000769 return NULL;
770 if (!getsockaddrlen(s, &addrlen))
771 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000772 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000773 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000774 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000775 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000776 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000777 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
778}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000779#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000780
781
Guido van Rossum30a685f1991-06-27 15:51:29 +0000782/* s.listen(n) method */
783
Guido van Rossum73624e91994-10-10 17:59:00 +0000784static PyObject *
785BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000786{
787 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000788 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +0000789 if (!PyArg_Parse(args, "i", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000790 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000791 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000792 if (backlog < 1)
793 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000794 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +0000795 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000796 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000797 return PySocket_Err();
798 Py_INCREF(Py_None);
799 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000800}
801
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000802#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +0000803/* s.makefile(mode) method.
804 Create a new open file object referring to a dupped version of
805 the socket's file descriptor. (The dup() call is necessary so
806 that the open file and socket objects may be closed independent
807 of each other.)
808 The mode argument specifies 'r' or 'w' passed to fdopen(). */
809
Guido van Rossum73624e91994-10-10 17:59:00 +0000810static PyObject *
811BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000812{
Guido van Rossuma597dde1995-01-10 20:56:29 +0000813 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +0000814 char *mode = "r";
815 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000816 int fd;
817 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +0000818 PyObject *f;
819
820 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000821 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +0000822#ifdef MS_WIN32
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000823 if ( ((fd = _open_osfhandle( s->sock_fd, _O_BINARY )) < 0) ||
824 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL)) {
825#else
Guido van Rossum30a685f1991-06-27 15:51:29 +0000826 if ((fd = dup(s->sock_fd)) < 0 ||
Guido van Rossum6b144911995-03-14 15:05:13 +0000827 (fp = fdopen(fd, mode)) == NULL) {
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000828#endif
Guido van Rossum6b144911995-03-14 15:05:13 +0000829 if (fd >= 0)
830 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000831 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +0000832 }
833 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
834 if (f != NULL)
835 PyFile_SetBufSize(f, bufsize);
836 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000837}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000838#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000839
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000840/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000841
Guido van Rossum73624e91994-10-10 17:59:00 +0000842static PyObject *
843BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000844{
Guido van Rossumbe32c891996-06-20 16:25:29 +0000845 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000846 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000847 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
848 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000849 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000850 if (buf == NULL)
851 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000852 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +0000853 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000854 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +0000855 if (n < 0) {
856 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +0000857 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +0000858 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +0000859 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000860 return NULL;
861 return buf;
862}
863
Guido van Rossum30a685f1991-06-27 15:51:29 +0000864
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000865/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000866
Guido van Rossum73624e91994-10-10 17:59:00 +0000867static PyObject *
868BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000869{
870 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +0000871 PyObject *buf = NULL;
872 PyObject *addr = NULL;
873 PyObject *ret = NULL;
874
Guido van Rossumbe32c891996-06-20 16:25:29 +0000875 int addrlen, len, n, flags = 0;
876 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
877 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000878 if (!getsockaddrlen(s, &addrlen))
879 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000880 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000881 if (buf == NULL)
882 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000883 Py_BEGIN_ALLOW_THREADS
884 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +0000885#ifndef MS_WINDOWS
Barry Warsaw752300b1997-01-03 17:18:10 +0000886 (ANY *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000887#else
Barry Warsaw752300b1997-01-03 17:18:10 +0000888 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000889#endif
Barry Warsaw752300b1997-01-03 17:18:10 +0000890 );
Guido van Rossum73624e91994-10-10 17:59:00 +0000891 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +0000892 if (n < 0) {
893 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +0000894 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +0000895 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +0000896 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000897 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +0000898
899 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
900 goto finally;
901
Guido van Rossum73624e91994-10-10 17:59:00 +0000902 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000903 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000904 Py_XDECREF(addr);
905 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000906 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000907}
908
Guido van Rossum30a685f1991-06-27 15:51:29 +0000909
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000910/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000911
Guido van Rossum73624e91994-10-10 17:59:00 +0000912static PyObject *
913BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000914{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000915 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000916 int len, n, flags = 0;
917 if (!PyArg_ParseTuple(args, "s#|i", &buf, &len, &flags))
918 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000919 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000920 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000921 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +0000922 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000923 return PySocket_Err();
924 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000925}
926
927
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000928/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000929
Guido van Rossum73624e91994-10-10 17:59:00 +0000930static PyObject *
931BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000932{
Guido van Rossum73624e91994-10-10 17:59:00 +0000933 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000934 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000935 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000936 int addrlen, len, n, flags;
937 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000938 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
939 PyErr_Clear();
940 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000941 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000942 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000943 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000944 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000945 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000946 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000947 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000948 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000949 return PySocket_Err();
950 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000951}
952
Guido van Rossum30a685f1991-06-27 15:51:29 +0000953
954/* s.shutdown(how) method */
955
Guido van Rossum73624e91994-10-10 17:59:00 +0000956static PyObject *
957BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000958{
959 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000960 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +0000961 if (!PyArg_Parse(args, "i", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000962 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000963 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000964 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +0000965 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000966 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000967 return PySocket_Err();
968 Py_INCREF(Py_None);
969 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000970}
971
Guido van Rossum30a685f1991-06-27 15:51:29 +0000972
973/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000974
Guido van Rossum73624e91994-10-10 17:59:00 +0000975static PyMethodDef PySocketSock_methods[] = {
976 {"accept", (PyCFunction)PySocketSock_accept},
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000977 {"setblocking", (PyCFunction)PySocketSock_setblocking},
Guido van Rossum73624e91994-10-10 17:59:00 +0000978 {"setsockopt", (PyCFunction)PySocketSock_setsockopt},
Guido van Rossumbe32c891996-06-20 16:25:29 +0000979 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1},
Guido van Rossum73624e91994-10-10 17:59:00 +0000980 {"bind", (PyCFunction)PySocketSock_bind},
981 {"close", (PyCFunction)PySocketSock_close},
982 {"connect", (PyCFunction)PySocketSock_connect},
983 {"fileno", (PyCFunction)PySocketSock_fileno},
Guido van Rossumbe32c891996-06-20 16:25:29 +0000984#ifndef NO_DUP
985 {"dup", (PyCFunction)PySocketSock_dup},
986#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000987 {"getsockname", (PyCFunction)PySocketSock_getsockname},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000988#ifdef HAVE_GETPEERNAME
Guido van Rossum73624e91994-10-10 17:59:00 +0000989 {"getpeername", (PyCFunction)PySocketSock_getpeername},
Guido van Rossum9575a441993-04-07 14:06:14 +0000990#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000991 {"listen", (PyCFunction)PySocketSock_listen},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000992#ifndef NO_DUP
Guido van Rossum6b144911995-03-14 15:05:13 +0000993 {"makefile", (PyCFunction)PySocketSock_makefile, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000994#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +0000995 {"recv", (PyCFunction)PySocketSock_recv, 1},
996 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1},
997 {"send", (PyCFunction)PySocketSock_send, 1},
Guido van Rossum73624e91994-10-10 17:59:00 +0000998 {"sendto", (PyCFunction)PySocketSock_sendto},
999 {"shutdown", (PyCFunction)PySocketSock_shutdown},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001000 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001001};
1002
Guido van Rossum30a685f1991-06-27 15:51:29 +00001003
Guido van Rossum73624e91994-10-10 17:59:00 +00001004/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001005 First close the file description. */
1006
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001007static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001008BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001009{
1010 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001011 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001012}
1013
Guido van Rossum30a685f1991-06-27 15:51:29 +00001014
1015/* Return a socket object's named attribute. */
1016
Guido van Rossum73624e91994-10-10 17:59:00 +00001017static PyObject *
1018BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001019{
Guido van Rossum73624e91994-10-10 17:59:00 +00001020 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001021}
1022
Guido van Rossum30a685f1991-06-27 15:51:29 +00001023
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001024static PyObject *
1025BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
1026{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001027 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001028 sprintf(buf,
1029 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
1030 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001031 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001032}
1033
1034
Guido van Rossumb6775db1994-08-01 11:34:53 +00001035/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001036
Guido van Rossum73624e91994-10-10 17:59:00 +00001037static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001038 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001039 0,
1040 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001041 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001042 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001043 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001044 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001045 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001046 0, /*tp_setattr*/
1047 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001048 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001049 0, /*tp_as_number*/
1050 0, /*tp_as_sequence*/
1051 0, /*tp_as_mapping*/
1052};
1053
Guido van Rossum30a685f1991-06-27 15:51:29 +00001054
Guido van Rossum81194471991-07-27 21:42:02 +00001055/* Python interface to gethostname(). */
1056
1057/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001058static PyObject *
1059BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001060{
1061 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001062 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001063 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +00001064 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001065 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001066 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001067 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001068 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001069 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001070 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001071 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001072}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001073
1074
Guido van Rossum30a685f1991-06-27 15:51:29 +00001075/* Python interface to gethostbyname(name). */
1076
1077/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001078static PyObject *
1079BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001080{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001081 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001082 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +00001083 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001084 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001085 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001086 return NULL;
1087 return makeipaddr(&addrbuf);
1088}
1089
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001090/* Python interface to gethostbyaddr(IP). */
1091
1092/*ARGSUSED*/
1093static PyObject *
1094BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1095{
1096 struct sockaddr_in addr;
1097 char *ip_num;
1098 struct hostent *h;
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001099 char **pch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001100 PyObject *rtn_tuple = (PyObject *)NULL;
1101 PyObject *name_list = (PyObject *)NULL;
1102 PyObject *addr_list = (PyObject *)NULL;
1103 PyObject *tmp;
1104
1105 if (!PyArg_Parse(args, "s", &ip_num))
1106 return NULL;
1107 if (setipaddr(ip_num, &addr) < 0)
1108 return NULL;
1109 h = gethostbyaddr((char *)&addr.sin_addr,
1110 sizeof(addr.sin_addr),
1111 AF_INET);
1112 if (h == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +00001113#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001114 /* Let's get real error message to return */
1115 extern int h_errno;
1116 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1117#else
1118 PyErr_SetString(PySocket_Error, "host not found");
1119#endif
1120 return NULL;
1121 }
1122 if ((name_list = PyList_New(0)) == NULL)
1123 goto err;
1124 if ((addr_list = PyList_New(0)) == NULL)
1125 goto err;
1126 for (pch = h->h_aliases; *pch != NULL; pch++) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001127 int status;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001128 tmp = PyString_FromString(*pch);
1129 if (tmp == NULL)
1130 goto err;
Barry Warsaw752300b1997-01-03 17:18:10 +00001131 status = PyList_Append(name_list, tmp);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001132 Py_DECREF(tmp);
Barry Warsaw752300b1997-01-03 17:18:10 +00001133 if (status)
1134 goto err;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001135 }
1136 for (pch = h->h_addr_list; *pch != NULL; pch++) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001137 int status;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001138 memcpy((char *) &addr.sin_addr, *pch, h->h_length);
1139 tmp = makeipaddr(&addr);
1140 if (tmp == NULL)
1141 goto err;
Barry Warsaw752300b1997-01-03 17:18:10 +00001142 status = PyList_Append(addr_list, tmp);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001143 Py_DECREF(tmp);
Barry Warsaw752300b1997-01-03 17:18:10 +00001144 if (status)
1145 goto err;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001146 }
1147 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1148 err:
1149 Py_XDECREF(name_list);
1150 Py_XDECREF(addr_list);
1151 return rtn_tuple;
1152}
1153
Guido van Rossum30a685f1991-06-27 15:51:29 +00001154
1155/* Python interface to getservbyname(name).
1156 This only returns the port number, since the other info is already
1157 known or not useful (like the list of aliases). */
1158
1159/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001160static PyObject *
1161BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001162{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001163 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001164 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001165 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001166 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001167 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001168 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001169 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001170 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001171 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001172 return NULL;
1173 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001174 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001175}
1176
1177
Guido van Rossum3901d851996-12-19 16:35:04 +00001178/* Python interface to getprotobyname(name).
1179 This only returns the protocol number, since the other info is
1180 already known or not useful (like the list of aliases). */
1181
1182/*ARGSUSED*/
1183static PyObject *
1184BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1185{
1186 char *name;
1187 struct protoent *sp;
1188 if (!PyArg_Parse(args, "s", &name))
1189 return NULL;
1190 Py_BEGIN_ALLOW_THREADS
1191 sp = getprotobyname(name);
1192 Py_END_ALLOW_THREADS
1193 if (sp == NULL) {
1194 PyErr_SetString(PySocket_Error, "protocol not found");
1195 return NULL;
1196 }
1197 return PyInt_FromLong((long) sp->p_proto);
1198}
1199
1200
Guido van Rossum30a685f1991-06-27 15:51:29 +00001201/* Python interface to socket(family, type, proto).
1202 The third (protocol) argument is optional.
1203 Return a new socket object. */
1204
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001205/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001206static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001207BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001208{
Guido van Rossum73624e91994-10-10 17:59:00 +00001209 PySocketSockObject *s;
Guido van Rossum6f489d91996-06-28 20:15:15 +00001210#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001211 SOCKET fd;
1212#else
1213 int fd;
1214#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001215 int family, type, proto = 0;
1216 if (!PyArg_ParseTuple(args, "ii|i", &family, &type, &proto))
1217 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001218 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001219 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001220 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001221#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001222 if (fd == INVALID_SOCKET)
1223#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001224 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001225#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001226 return PySocket_Err();
1227 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001228 /* If the object can't be created, don't forget to close the
1229 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001230 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001231 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001232 /* From now on, ignore SIGPIPE and let the error checking
1233 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001234#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001235 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001236#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001237 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001238}
1239
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001240#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001241/* Create a socket object from a numeric file description.
1242 Useful e.g. if stdin is a socket.
1243 Additional arguments as for socket(). */
1244
1245/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001246static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001247BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001248{
Guido van Rossum73624e91994-10-10 17:59:00 +00001249 PySocketSockObject *s;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001250 int fd, family, type, proto = 0;
1251 if (!PyArg_ParseTuple(args, "iii|i", &fd, &family, &type, &proto))
1252 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001253 /* Dup the fd so it and the socket can be closed independently */
1254 fd = dup(fd);
1255 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001256 return PySocket_Err();
1257 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001258 /* From now on, ignore SIGPIPE and let the error checking
1259 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001260#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001261 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001262#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001263 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001264}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001265#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001266
Guido van Rossum006bf911996-06-12 04:04:55 +00001267static PyObject *
1268BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1269{
1270 int x1, x2;
1271
1272 if (!PyArg_Parse(args, "i", &x1)) {
1273 return NULL;
1274 }
1275 x2 = (int)ntohs((short)x1);
1276 return PyInt_FromLong(x2);
1277}
1278
1279static PyObject *
1280BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1281{
1282 int x1, x2;
1283
1284 if (!PyArg_Parse(args, "i", &x1)) {
1285 return NULL;
1286 }
1287 x2 = ntohl(x1);
1288 return PyInt_FromLong(x2);
1289}
1290
1291static PyObject *
1292BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1293{
1294 int x1, x2;
1295
1296 if (!PyArg_Parse(args, "i", &x1)) {
1297 return NULL;
1298 }
1299 x2 = (int)htons((short)x1);
1300 return PyInt_FromLong(x2);
1301}
1302
1303static PyObject *
1304BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1305{
1306 int x1, x2;
1307
1308 if (!PyArg_Parse(args, "i", &x1)) {
1309 return NULL;
1310 }
1311 x2 = htonl(x1);
1312 return PyInt_FromLong(x2);
1313}
1314
Guido van Rossum30a685f1991-06-27 15:51:29 +00001315/* List of functions exported by this module. */
1316
Guido van Rossum73624e91994-10-10 17:59:00 +00001317static PyMethodDef PySocket_methods[] = {
1318 {"gethostbyname", PySocket_gethostbyname},
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001319 {"gethostbyaddr", PySocket_gethostbyaddr},
Guido van Rossum73624e91994-10-10 17:59:00 +00001320 {"gethostname", PySocket_gethostname},
1321 {"getservbyname", PySocket_getservbyname},
Guido van Rossum3901d851996-12-19 16:35:04 +00001322 {"getprotobyname", PySocket_getprotobyname},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001323 {"socket", PySocket_socket, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001324#ifndef NO_DUP
Guido van Rossumbe32c891996-06-20 16:25:29 +00001325 {"fromfd", PySocket_fromfd, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001326#endif
Guido van Rossum006bf911996-06-12 04:04:55 +00001327 {"ntohs", PySocket_ntohs},
1328 {"ntohl", PySocket_ntohl},
1329 {"htons", PySocket_htons},
1330 {"htonl", PySocket_htonl},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001331 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001332};
1333
Guido van Rossum30a685f1991-06-27 15:51:29 +00001334
1335/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00001336 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001337 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00001338 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001339static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001340BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001341{
Guido van Rossum73624e91994-10-10 17:59:00 +00001342 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00001343 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001344 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00001345
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001346 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001347}
1348
Guido van Rossum30a685f1991-06-27 15:51:29 +00001349
Guido van Rossum8d665e61996-06-26 18:22:49 +00001350#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001351
1352/* Additional initialization and cleanup for NT/Windows */
1353
1354static void
1355NTcleanup()
1356{
1357 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00001358}
1359
1360static int
1361NTinit()
1362{
1363 WSADATA WSAData;
1364 int ret;
1365 char buf[100];
1366 ret = WSAStartup(0x0101, &WSAData);
1367 switch (ret) {
1368 case 0: /* no error */
1369 atexit(NTcleanup);
1370 return 1;
1371 case WSASYSNOTREADY:
1372 PyErr_SetString(PyExc_ImportError,
1373 "WSAStartup failed: network not ready");
1374 break;
1375 case WSAVERNOTSUPPORTED:
1376 case WSAEINVAL:
1377 PyErr_SetString(PyExc_ImportError,
1378 "WSAStartup failed: requested version not supported");
1379 break;
1380 default:
1381 sprintf(buf, "WSAStartup failed: error code %d", ret);
1382 PyErr_SetString(PyExc_ImportError, buf);
1383 break;
1384 }
1385 return 0;
1386}
1387
Guido van Rossum8d665e61996-06-26 18:22:49 +00001388#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00001389
1390
Guido van Rossum30a685f1991-06-27 15:51:29 +00001391/* Initialize this module.
1392 This is called when the first 'import socket' is done,
1393 via a table in config.c, if config.c is compiled with USE_SOCKET
Guido van Rossumbe32c891996-06-20 16:25:29 +00001394 defined.
1395
Guido van Rossum8d665e61996-06-26 18:22:49 +00001396 For MS_WINDOWS (which means any Windows variant), this module
Guido van Rossumbe32c891996-06-20 16:25:29 +00001397 is actually called "_socket", and there's a wrapper "socket.py"
1398 which implements some missing functionality (such as makefile(),
1399 dup() and fromfd()). The import of "_socket" may fail with an
1400 ImportError exception if initialization of WINSOCK fails. When
1401 WINSOCK is initialized succesfully, a call to WSACleanup() is
1402 scheduled to be made at exit time. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001403
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001404void
Guido van Rossum8d665e61996-06-26 18:22:49 +00001405#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001406init_socket()
1407#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001408initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00001409#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001410{
Guido van Rossum73624e91994-10-10 17:59:00 +00001411 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001412#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001413 if (!NTinit())
1414 return;
1415 m = Py_InitModule("_socket", PySocket_methods);
1416#else
Guido van Rossum73624e91994-10-10 17:59:00 +00001417 m = Py_InitModule("socket", PySocket_methods);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001418#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001419 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001420 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
1421 if (PySocket_Error == NULL)
1422 return;
1423 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00001424 PySocketSock_Type.ob_type = &PyType_Type;
1425 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00001426 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00001427 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001428 return;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001429 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001430#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001431 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001432#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001433 insint(d, "SOCK_STREAM", SOCK_STREAM);
1434 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
1435 insint(d, "SOCK_RAW", SOCK_RAW);
1436 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1437 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001438
1439#ifdef SO_DEBUG
1440 insint(d, "SO_DEBUG", SO_DEBUG);
1441#endif
1442#ifdef SO_ACCEPTCONN
1443 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
1444#endif
1445#ifdef SO_REUSEADDR
1446 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
1447#endif
1448#ifdef SO_KEEPALIVE
1449 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
1450#endif
1451#ifdef SO_DONTROUTE
1452 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
1453#endif
1454#ifdef SO_BROADCAST
1455 insint(d, "SO_BROADCAST", SO_BROADCAST);
1456#endif
1457#ifdef SO_USELOOPBACK
1458 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
1459#endif
1460#ifdef SO_LINGER
1461 insint(d, "SO_LINGER", SO_LINGER);
1462#endif
1463#ifdef SO_OOBINLINE
1464 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
1465#endif
1466#ifdef SO_REUSEPORT
1467 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
1468#endif
1469
1470#ifdef SO_SNDBUF
1471 insint(d, "SO_SNDBUF", SO_SNDBUF);
1472#endif
1473#ifdef SO_RCVBUF
1474 insint(d, "SO_RCVBUF", SO_RCVBUF);
1475#endif
1476#ifdef SO_SNDLOWAT
1477 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
1478#endif
1479#ifdef SO_RCVLOWAT
1480 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
1481#endif
1482#ifdef SO_SNDTIMEO
1483 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
1484#endif
1485#ifdef SO_RCVTIMEO
1486 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
1487#endif
1488#ifdef SO_ERROR
1489 insint(d, "SO_ERROR", SO_ERROR);
1490#endif
1491#ifdef SO_TYPE
1492 insint(d, "SO_TYPE", SO_TYPE);
1493#endif
1494
1495 /* Maximum number of connections for "listen" */
1496#ifdef SOMAXCONN
1497 insint(d, "SOMAXCONN", SOMAXCONN);
1498#else
1499 insint(d, "SOMAXCONN", 5); /* Common value */
1500#endif
1501
1502 /* Flags for send, recv */
1503#ifdef MSG_OOB
1504 insint(d, "MSG_OOB", MSG_OOB);
1505#endif
1506#ifdef MSG_PEEK
1507 insint(d, "MSG_PEEK", MSG_PEEK);
1508#endif
1509#ifdef MSG_DONTROUTE
1510 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
1511#endif
1512#ifdef MSG_EOR
1513 insint(d, "MSG_EOR", MSG_EOR);
1514#endif
1515#ifdef MSG_TRUNC
1516 insint(d, "MSG_TRUNC", MSG_TRUNC);
1517#endif
1518#ifdef MSG_CTRUNC
1519 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
1520#endif
1521#ifdef MSG_WAITALL
1522 insint(d, "MSG_WAITALL", MSG_WAITALL);
1523#endif
1524#ifdef MSG_BTAG
1525 insint(d, "MSG_BTAG", MSG_BTAG);
1526#endif
1527#ifdef MSG_ETAG
1528 insint(d, "MSG_ETAG", MSG_ETAG);
1529#endif
1530
1531 /* Protocol level and numbers, usable for [gs]etsockopt */
1532#ifdef SOL_SOCKET
1533 insint(d, "SOL_SOCKET", SOL_SOCKET);
1534#endif
1535#ifdef IPPROTO_IP
1536 insint(d, "IPPROTO_IP", IPPROTO_IP);
1537#endif
1538#ifdef IPPROTO_ICMP
1539 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
1540#endif
1541#ifdef IPPROTO_IGMP
1542 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
1543#endif
1544#ifdef IPPROTO_GGP
1545 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
1546#endif
1547#ifdef IPPROTO_TCP
1548 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
1549#endif
1550#ifdef IPPROTO_EGP
1551 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
1552#endif
1553#ifdef IPPROTO_PUP
1554 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
1555#endif
1556#ifdef IPPROTO_UDP
1557 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
1558#endif
1559#ifdef IPPROTO_IDP
1560 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
1561#endif
1562#ifdef IPPROTO_HELLO
1563 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
1564#endif
1565#ifdef IPPROTO_ND
1566 insint(d, "IPPROTO_ND", IPPROTO_ND);
1567#endif
1568#ifdef IPPROTO_TP
1569 insint(d, "IPPROTO_TP", IPPROTO_TP);
1570#endif
1571#ifdef IPPROTO_XTP
1572 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
1573#endif
1574#ifdef IPPROTO_EON
1575 insint(d, "IPPROTO_EON", IPPROTO_EON);
1576#endif
1577#ifdef IPPROTO_BIP
1578 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
1579#endif
1580/**/
1581#ifdef IPPROTO_RAW
1582 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
1583#endif
1584#ifdef IPPROTO_MAX
1585 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
1586#endif
1587
1588 /* Some port configuration */
1589#ifdef IPPORT_RESERVED
1590 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
1591#else
1592 insint(d, "IPPORT_RESERVED", 1024);
1593#endif
1594#ifdef IPPORT_USERRESERVED
1595 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
1596#else
1597 insint(d, "IPPORT_USERRESERVED", 5000);
1598#endif
1599
Guido van Rossum5f05eb41995-02-17 15:11:07 +00001600 /* Some reserved IP v.4 addresses */
1601#ifdef INADDR_ANY
1602 insint(d, "INADDR_ANY", INADDR_ANY);
1603#else
1604 insint(d, "INADDR_ANY", 0x00000000);
1605#endif
1606#ifdef INADDR_BROADCAST
1607 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
1608#else
1609 insint(d, "INADDR_BROADCAST", 0xffffffff);
1610#endif
1611#ifdef INADDR_LOOPBACK
1612 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
1613#else
1614 insint(d, "INADDR_LOOPBACK", 0x7F000001);
1615#endif
1616#ifdef INADDR_UNSPEC_GROUP
1617 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
1618#else
1619 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
1620#endif
1621#ifdef INADDR_ALLHOSTS_GROUP
1622 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
1623#else
1624 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
1625#endif
1626#ifdef INADDR_MAX_LOCAL_GROUP
1627 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
1628#else
1629 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
1630#endif
1631#ifdef INADDR_NONE
1632 insint(d, "INADDR_NONE", INADDR_NONE);
1633#else
1634 insint(d, "INADDR_NONE", 0xffffffff);
1635#endif
1636
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001637 /* IP [gs]etsockopt options */
1638#ifdef IP_OPTIONS
1639 insint(d, "IP_OPTIONS", IP_OPTIONS);
1640#endif
1641#ifdef IP_HDRINCL
1642 insint(d, "IP_HDRINCL", IP_HDRINCL);
1643#endif
1644#ifdef IP_TOS
1645 insint(d, "IP_TOS", IP_TOS);
1646#endif
1647#ifdef IP_TTL
1648 insint(d, "IP_TTL", IP_TTL);
1649#endif
1650#ifdef IP_RECVOPTS
1651 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
1652#endif
1653#ifdef IP_RECVRETOPTS
1654 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
1655#endif
1656#ifdef IP_RECVDSTADDR
1657 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
1658#endif
1659#ifdef IP_RETOPTS
1660 insint(d, "IP_RETOPTS", IP_RETOPTS);
1661#endif
1662#ifdef IP_MULTICAST_IF
1663 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
1664#endif
1665#ifdef IP_MULTICAST_TTL
1666 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
1667#endif
1668#ifdef IP_MULTICAST_LOOP
1669 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
1670#endif
1671#ifdef IP_ADD_MEMBERSHIP
1672 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
1673#endif
1674#ifdef IP_DROP_MEMBERSHIP
1675 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
1676#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001677}