blob: 98ca52bd76b432f96c5be1f1c69e16b8609f68b9 [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 Rossum8e9ebfd1997-11-22 21:53:48 +000094#if !defined(MS_WINDOWS) && !defined(PYOS_OS2)
Guido van Rossumfb4130d1996-12-10 15:17:08 +000095extern int gethostname(); /* For Solaris, at least */
96#endif
97
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000098#if defined(PYCC_VACPP)
99#include <types.h>
100#include <io.h>
101#include <sys/ioctl.h>
102#include <utils.h>
103#include <ctype.h>
104#endif
105
106#if defined(PYOS_OS2)
107#define INCL_DOS
108#define INCL_DOSERRORS
109#define INCL_NOPMAPI
110#include <os2.h>
111#endif
112
Guido van Rossumb6775db1994-08-01 11:34:53 +0000113#include <sys/types.h>
114#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +0000115
Guido van Rossum81194471991-07-27 21:42:02 +0000116#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000117#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000118#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000119#include <sys/socket.h>
120#include <netinet/in.h>
Guido van Rossume4485b01994-09-07 14:32:49 +0000121#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000122#else
123#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000124#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000125#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000126#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000127#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000128#else
129#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000130#endif
131
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000132#ifndef O_NDELAY
133#define O_NDELAY O_NONBLOCK /* For QNX only? */
134#endif
135
Jack Jansen508537b1996-02-14 15:57:45 +0000136#ifdef USE_GUSI
137/* fdopen() isn't declared in stdio.h (sigh) */
138#include <GUSI.h>
139#endif
140
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000141
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000142/* Here we have some hacks to choose between K&R or ANSI style function
143 definitions. For NT to build this as an extension module (ie, DLL)
144 it must be compiled by the C++ compiler, as it takes the address of
145 a static data item exported from the main Python DLL.
146*/
Guido van Rossum8d665e61996-06-26 18:22:49 +0000147#ifdef MS_WINDOWS
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000148/* seem to be a few differences in the API */
149#define close closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000150#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000151#define FORCE_ANSI_FUNC_DEFS
152#endif
153
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000154#if defined(PYOS_OS2)
155#define close soclose
156#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
157#define FORCE_ANSI_FUNC_DEFS
158#endif
159
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000160#ifdef FORCE_ANSI_FUNC_DEFS
161#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
162fnname( arg1type arg1name )
163
164#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
165fnname( arg1type arg1name, arg2type arg2name )
166
167#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
168fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
169
170#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
171fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
172
173#else /* !FORCE_ANSI_FN_DEFS */
174#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
175fnname( arg1name ) \
176 arg1type arg1name;
177
178#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
179fnname( arg1name, arg2name ) \
180 arg1type arg1name; \
181 arg2type arg2name;
182
183#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
184fnname( arg1name, arg2name, arg3name ) \
185 arg1type arg1name; \
186 arg2type arg2name; \
187 arg3type arg3name;
188
189#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
190fnname( arg1name, arg2name, arg3name, arg4name ) \
191 arg1type arg1name; \
192 arg2type arg2name; \
193 arg3type arg3name; \
194 arg4type arg4name;
195
196#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000197
198/* Global variable holding the exception type for errors detected
199 by this module (but not argument type or memory errors, etc.). */
200
Guido van Rossum73624e91994-10-10 17:59:00 +0000201static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000202
203
204/* Convenience function to raise an error according to errno
205 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000206
Guido van Rossum73624e91994-10-10 17:59:00 +0000207static PyObject *
208PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000209{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000210#ifdef MS_WINDOWS
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000211 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000212 PyObject *v;
213 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000214 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000215 PyErr_SetObject(PySocket_Error, v);
216 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000217 }
218 return NULL;
219 }
220 else
221#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000222
223#if defined(PYOS_OS2)
224 if (sock_errno() != NO_ERROR) {
225 APIRET rc;
226 ULONG msglen;
227 char outbuf[100];
228 int myerrorcode = sock_errno();
229
230 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
231 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
232 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
233 if (rc == NO_ERROR) {
234 PyObject *v;
235
236 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
237 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
238 char *lastc = &outbuf[ strlen(outbuf)-1 ];
239 while (lastc > outbuf && isspace(*lastc))
240 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
241 }
242 v = Py_BuildValue("(is)", myerrorcode, outbuf);
243 if (v != NULL) {
244 PyErr_SetObject(PySocket_Error, v);
245 Py_DECREF(v);
246 }
247 return NULL;
248 }
249 }
250#endif
251
Guido van Rossum73624e91994-10-10 17:59:00 +0000252 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000253}
254
Guido van Rossum30a685f1991-06-27 15:51:29 +0000255
256/* The object holding a socket. It holds some extra information,
257 like the address family, which is used to decode socket address
258 arguments properly. */
259
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000260typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000261 PyObject_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000262 int sock_fd; /* Socket file descriptor */
263 int sock_family; /* Address family, e.g., AF_INET */
264 int sock_type; /* Socket type, e.g., SOCK_STREAM */
265 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000266 union sock_addr {
267 struct sockaddr_in in;
268#ifdef AF_UNIX
269 struct sockaddr_un un;
270#endif
271 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000272} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000273
Guido van Rossum30a685f1991-06-27 15:51:29 +0000274
275/* A forward reference to the Socktype type object.
276 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000277 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000278 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000279
Guido van Rossum73624e91994-10-10 17:59:00 +0000280staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000281
Guido van Rossum30a685f1991-06-27 15:51:29 +0000282
283/* Create a new socket object.
284 This just creates the object and initializes it.
285 If the creation fails, return NULL and set an exception (implicit
286 in NEWOBJ()). */
287
Guido van Rossum73624e91994-10-10 17:59:00 +0000288static PySocketSockObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000289BUILD_FUNC_DEF_4(PySocketSock_New,int,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000290{
Guido van Rossum73624e91994-10-10 17:59:00 +0000291 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000292 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum73624e91994-10-10 17:59:00 +0000293 s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000294 if (s != NULL) {
295 s->sock_fd = fd;
296 s->sock_family = family;
297 s->sock_type = type;
298 s->sock_proto = proto;
299 }
300 return s;
301}
302
Guido van Rossum30a685f1991-06-27 15:51:29 +0000303
304/* Convert a string specifying a host name or one of a few symbolic
305 names to a numeric IP address. This usually calls gethostbyname()
306 to do the work; the names "" and "<broadcast>" are special.
307 Return the length (should always be 4 bytes), or negative if
308 an error occurred; then an exception is raised. */
309
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000310static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000311BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000312{
313 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000314 int d1, d2, d3, d4;
315 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000316#ifdef HAVE_GETHOSTBYNAME_R
317 struct hostent hp_allocated;
318 char buf[1001];
319 int buf_len = (sizeof buf) - 1;
320 int errnop;
321#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000322
Guido van Rossuma376cc51996-12-05 23:43:35 +0000323 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000324 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000325 addr_ret->sin_addr.s_addr = INADDR_ANY;
326 return 4;
327 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000328 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000329 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
330 return 4;
331 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000332 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
333 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
334 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
335 addr_ret->sin_addr.s_addr = htonl(
336 ((long) d1 << 24) | ((long) d2 << 16) |
337 ((long) d3 << 8) | ((long) d4 << 0));
338 return 4;
339 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000340#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum73624e91994-10-10 17:59:00 +0000341 Py_BEGIN_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000342 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum73624e91994-10-10 17:59:00 +0000343 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000344#else /* not HAVE_GETHOSTBYNAME_R */
345 hp = gethostbyname(name);
346#endif /* HAVE_GETHOSTBYNAME_R */
347
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000348 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000349#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000350 /* Let's get real error message to return */
351 extern int h_errno;
352 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
353#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000354 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000355#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000356 return -1;
357 }
358 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
359 return hp->h_length;
360}
361
Guido van Rossum30a685f1991-06-27 15:51:29 +0000362
Guido van Rossum30a685f1991-06-27 15:51:29 +0000363/* Create a string object representing an IP address.
364 This is always a string of the form 'dd.dd.dd.dd' (with variable
365 size numbers). */
366
Guido van Rossum73624e91994-10-10 17:59:00 +0000367static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000368BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000369{
370 long x = ntohl(addr->sin_addr.s_addr);
371 char buf[100];
372 sprintf(buf, "%d.%d.%d.%d",
373 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
374 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000375 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000376}
377
378
379/* Create an object representing the given socket address,
380 suitable for passing it back to bind(), connect() etc.
381 The family field of the sockaddr structure is inspected
382 to determine what kind of address it really is. */
383
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000384/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000385static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000386BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000387{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000388 if (addrlen == 0) {
389 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000390 Py_INCREF(Py_None);
391 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000392 }
393
Guido van Rossum30a685f1991-06-27 15:51:29 +0000394 switch (addr->sa_family) {
395
396 case AF_INET:
397 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000398 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000399 PyObject *addrobj = makeipaddr(a);
400 PyObject *ret = NULL;
401 if (addrobj) {
402 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
403 Py_DECREF(addrobj);
404 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000405 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000406 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000407
Guido van Rossumb6775db1994-08-01 11:34:53 +0000408#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000409 case AF_UNIX:
410 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000411 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000412 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000413 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000414#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000415
416 /* More cases here... */
417
418 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000419 /* If we don't know the address family, don't raise an
420 exception -- return it as a tuple. */
421 return Py_BuildValue("is#",
422 addr->sa_family,
423 addr->sa_data,
424 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000425
Guido van Rossum30a685f1991-06-27 15:51:29 +0000426 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000427}
428
Guido van Rossum30a685f1991-06-27 15:51:29 +0000429
430/* Parse a socket address argument according to the socket object's
431 address family. Return 1 if the address was in the proper format,
432 0 of not. The address is returned through addr_ret, its length
433 through len_ret. */
434
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000435static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000436BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000437getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000438{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000439 switch (s->sock_family) {
440
Guido van Rossumb6775db1994-08-01 11:34:53 +0000441#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000442 case AF_UNIX:
443 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000444 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000445 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000446 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000447 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum73624e91994-10-10 17:59:00 +0000448 if (!PyArg_Parse(args, "s#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000449 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000450 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000451 PyErr_SetString(PySocket_Error,
452 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000453 return 0;
454 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000455 addr->sun_family = AF_UNIX;
456 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000457 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000458 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000459 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000460 return 1;
461 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000462#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000463
Guido van Rossum30a685f1991-06-27 15:51:29 +0000464 case AF_INET:
465 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000466 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000467 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000468 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000469 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000470 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000471 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000472 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000473 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000474 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000475 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000476 *addr_ret = (struct sockaddr *) addr;
477 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000478 return 1;
479 }
480
Guido van Rossum30a685f1991-06-27 15:51:29 +0000481 /* More cases here... */
482
483 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000484 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000485 return 0;
486
487 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000488}
489
Guido van Rossum30a685f1991-06-27 15:51:29 +0000490
Guido van Rossum710e1df1992-06-12 10:39:36 +0000491/* Get the address length according to the socket object's address family.
492 Return 1 if the family is known, 0 otherwise. The length is returned
493 through len_ret. */
494
495static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000496BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000497{
498 switch (s->sock_family) {
499
Guido van Rossumb6775db1994-08-01 11:34:53 +0000500#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000501 case AF_UNIX:
502 {
503 *len_ret = sizeof (struct sockaddr_un);
504 return 1;
505 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000506#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000507
508 case AF_INET:
509 {
510 *len_ret = sizeof (struct sockaddr_in);
511 return 1;
512 }
513
514 /* More cases here... */
515
516 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000517 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000518 return 0;
519
520 }
521}
522
523
Guido van Rossum30a685f1991-06-27 15:51:29 +0000524/* s.accept() method */
525
Guido van Rossum73624e91994-10-10 17:59:00 +0000526static PyObject *
527BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000528{
529 char addrbuf[256];
530 int addrlen, newfd;
Barry Warsaw752300b1997-01-03 17:18:10 +0000531 PyObject *sock = NULL;
532 PyObject *addr = NULL;
533 PyObject *res = NULL;
534
Guido van Rossum73624e91994-10-10 17:59:00 +0000535 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000536 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000537 if (!getsockaddrlen(s, &addrlen))
538 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000539 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000540 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000541 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000542 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000543 return PySocket_Err();
Barry Warsaw752300b1997-01-03 17:18:10 +0000544
Guido van Rossum30a685f1991-06-27 15:51:29 +0000545 /* Create the new object with unspecified family,
546 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000547 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000548 s->sock_family,
549 s->sock_type,
550 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000551 if (sock == NULL) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000552 close(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000553 goto finally;
554 }
555 if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
556 goto finally;
557
558 if (!(res = Py_BuildValue("OO", sock, addr)))
559 goto finally;
560
561 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000562 Py_XDECREF(sock);
563 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000564 return res;
565}
566
Guido van Rossum30a685f1991-06-27 15:51:29 +0000567
Guido van Rossume4485b01994-09-07 14:32:49 +0000568/* s.setblocking(1 | 0) method */
569
Guido van Rossum73624e91994-10-10 17:59:00 +0000570static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000571BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000572{
573 int block;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000574#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000575 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000576#endif
Guido van Rossumfe28fa01997-05-15 19:09:26 +0000577 if (!PyArg_Parse(args, "i", &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000578 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000579 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +0000580#ifndef MS_WINDOWS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000581#ifdef PYOS_OS2
582 block = !block;
583 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
584#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000585 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
586 if (block)
587 delay_flag &= (~O_NDELAY);
588 else
589 delay_flag |= O_NDELAY;
590 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000591#endif /* !PYOS_OS2 */
592#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000593 block = !block;
594 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000595#endif /* MS_WINDOWS */
Guido van Rossum73624e91994-10-10 17:59:00 +0000596 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000597
Guido van Rossum73624e91994-10-10 17:59:00 +0000598 Py_INCREF(Py_None);
599 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000600}
Guido van Rossume4485b01994-09-07 14:32:49 +0000601
602
Guido van Rossumaee08791992-09-08 09:05:33 +0000603/* s.setsockopt() method.
604 With an integer third argument, sets an integer option.
605 With a string third argument, sets an option from a buffer;
606 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000607
Guido van Rossum73624e91994-10-10 17:59:00 +0000608static PyObject *
609BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000610{
611 int level;
612 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000613 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000614 char *buf;
615 int buflen;
616 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000617
Guido van Rossum73624e91994-10-10 17:59:00 +0000618 if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000619 buf = (char *) &flag;
620 buflen = sizeof flag;
621 }
622 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000623 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +0000624 if (!PyArg_Parse(args, "(iis#)", &level, &optname,
625 &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000626 return NULL;
627 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000628 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000629 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000630 return PySocket_Err();
631 Py_INCREF(Py_None);
632 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000633}
634
635
Guido van Rossumaee08791992-09-08 09:05:33 +0000636/* s.getsockopt() method.
637 With two arguments, retrieves an integer option.
638 With a third integer argument, retrieves a string buffer of that size;
639 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000640
Guido van Rossum73624e91994-10-10 17:59:00 +0000641static PyObject *
642BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000643{
644 int level;
645 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000646 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000647 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000648 int buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000649
Guido van Rossumbe32c891996-06-20 16:25:29 +0000650 if (!PyArg_ParseTuple(args, "ii|i", &level, &optname, &buflen))
651 return NULL;
652
653 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000654 int flag = 0;
655 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000656 res = getsockopt(s->sock_fd, level, optname,
657 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000658 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000659 return PySocket_Err();
660 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000661 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000662 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000663 PyErr_SetString(PySocket_Error,
664 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000665 return NULL;
666 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000667 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000668 if (buf == NULL)
669 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000670 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000671 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000672 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000673 Py_DECREF(buf);
674 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000675 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000676 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000677 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000678}
679
680
Guido van Rossum30a685f1991-06-27 15:51:29 +0000681/* s.bind(sockaddr) method */
682
Guido van Rossum73624e91994-10-10 17:59:00 +0000683static PyObject *
684BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000685{
686 struct sockaddr *addr;
687 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000688 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000689 if (!getsockaddrarg(s, args, &addr, &addrlen))
690 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000691 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000692 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000693 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000694 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000695 return PySocket_Err();
696 Py_INCREF(Py_None);
697 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000698}
699
Guido van Rossum30a685f1991-06-27 15:51:29 +0000700
701/* s.close() method.
702 Set the file descriptor to -1 so operations tried subsequently
703 will surely fail. */
704
Guido van Rossum73624e91994-10-10 17:59:00 +0000705static PyObject *
706BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000707{
Guido van Rossum73624e91994-10-10 17:59:00 +0000708 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000709 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000710 if (s->sock_fd != -1) {
711 Py_BEGIN_ALLOW_THREADS
712 (void) close(s->sock_fd);
713 Py_END_ALLOW_THREADS
714 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000715 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000716 Py_INCREF(Py_None);
717 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000718}
719
Guido van Rossum30a685f1991-06-27 15:51:29 +0000720
721/* s.connect(sockaddr) method */
722
Guido van Rossum73624e91994-10-10 17:59:00 +0000723static PyObject *
724BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000725{
726 struct sockaddr *addr;
727 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000728 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000729 if (!getsockaddrarg(s, args, &addr, &addrlen))
730 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000731 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000732 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000733 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000734 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000735 return PySocket_Err();
736 Py_INCREF(Py_None);
737 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000738}
739
Guido van Rossum30a685f1991-06-27 15:51:29 +0000740
Guido van Rossumfc4255d1997-11-19 18:57:13 +0000741/* s.connect_ex(sockaddr) method */
742
743static PyObject *
744BUILD_FUNC_DEF_2(PySocketSock_connect_ex,PySocketSockObject *,s, PyObject *,args)
745{
746 struct sockaddr *addr;
747 int addrlen;
748 int res;
749 if (!getsockaddrarg(s, args, &addr, &addrlen))
750 return NULL;
751 Py_BEGIN_ALLOW_THREADS
752 res = connect(s->sock_fd, addr, addrlen);
753 Py_END_ALLOW_THREADS
754 if (res != 0)
755 res = errno;
756 return PyInt_FromLong((long) res);
757}
758
759
Guido van Rossumed233a51992-06-23 09:07:03 +0000760/* s.fileno() method */
761
Guido van Rossum73624e91994-10-10 17:59:00 +0000762static PyObject *
763BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000764{
Guido van Rossum73624e91994-10-10 17:59:00 +0000765 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000766 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000767 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000768}
769
770
Guido van Rossumbe32c891996-06-20 16:25:29 +0000771#ifndef NO_DUP
772/* s.dup() method */
773
774static PyObject *
775BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
776{
777 int newfd;
778 PyObject *sock;
779 if (!PyArg_NoArgs(args))
780 return NULL;
781 newfd = dup(s->sock_fd);
782 if (newfd < 0)
783 return PySocket_Err();
784 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +0000785 s->sock_family,
786 s->sock_type,
787 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +0000788 if (sock == NULL)
789 close(newfd);
790 return sock;
791}
792#endif
793
794
Guido van Rossumc89705d1992-11-26 08:54:07 +0000795/* s.getsockname() method */
796
Guido van Rossum73624e91994-10-10 17:59:00 +0000797static PyObject *
798BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000799{
800 char addrbuf[256];
801 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000802 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000803 return NULL;
804 if (!getsockaddrlen(s, &addrlen))
805 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +0000806 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000807 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000808 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000809 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000810 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000811 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000812 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
813}
814
815
Guido van Rossumb6775db1994-08-01 11:34:53 +0000816#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000817/* s.getpeername() method */
818
Guido van Rossum73624e91994-10-10 17:59:00 +0000819static PyObject *
820BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000821{
822 char addrbuf[256];
823 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000824 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000825 return NULL;
826 if (!getsockaddrlen(s, &addrlen))
827 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000828 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000829 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000830 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000831 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000832 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000833 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
834}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000835#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000836
837
Guido van Rossum30a685f1991-06-27 15:51:29 +0000838/* s.listen(n) method */
839
Guido van Rossum73624e91994-10-10 17:59:00 +0000840static PyObject *
841BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000842{
843 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000844 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +0000845 if (!PyArg_Parse(args, "i", &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000846 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000847 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000848 if (backlog < 1)
849 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000850 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +0000851 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000852 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000853 return PySocket_Err();
854 Py_INCREF(Py_None);
855 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000856}
857
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000858#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +0000859/* s.makefile(mode) method.
860 Create a new open file object referring to a dupped version of
861 the socket's file descriptor. (The dup() call is necessary so
862 that the open file and socket objects may be closed independent
863 of each other.)
864 The mode argument specifies 'r' or 'w' passed to fdopen(). */
865
Guido van Rossum73624e91994-10-10 17:59:00 +0000866static PyObject *
867BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000868{
Guido van Rossuma597dde1995-01-10 20:56:29 +0000869 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +0000870 char *mode = "r";
871 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000872 int fd;
873 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +0000874 PyObject *f;
875
876 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000877 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +0000878#ifdef MS_WIN32
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000879 if ( ((fd = _open_osfhandle( s->sock_fd, _O_BINARY )) < 0) ||
880 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL)) {
881#else
Guido van Rossum30a685f1991-06-27 15:51:29 +0000882 if ((fd = dup(s->sock_fd)) < 0 ||
Guido van Rossum6b144911995-03-14 15:05:13 +0000883 (fp = fdopen(fd, mode)) == NULL) {
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000884#endif
Guido van Rossum6b144911995-03-14 15:05:13 +0000885 if (fd >= 0)
886 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000887 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +0000888 }
889 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
890 if (f != NULL)
891 PyFile_SetBufSize(f, bufsize);
892 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000893}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000894#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000895
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000896/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000897
Guido van Rossum73624e91994-10-10 17:59:00 +0000898static PyObject *
899BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000900{
Guido van Rossumbe32c891996-06-20 16:25:29 +0000901 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000902 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000903 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
904 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000905 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000906 if (buf == NULL)
907 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000908 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +0000909 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000910 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +0000911 if (n < 0) {
912 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +0000913 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +0000914 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +0000915 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000916 return NULL;
917 return buf;
918}
919
Guido van Rossum30a685f1991-06-27 15:51:29 +0000920
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000921/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000922
Guido van Rossum73624e91994-10-10 17:59:00 +0000923static PyObject *
924BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000925{
926 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +0000927 PyObject *buf = NULL;
928 PyObject *addr = NULL;
929 PyObject *ret = NULL;
930
Guido van Rossumbe32c891996-06-20 16:25:29 +0000931 int addrlen, len, n, flags = 0;
932 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
933 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000934 if (!getsockaddrlen(s, &addrlen))
935 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000936 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000937 if (buf == NULL)
938 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000939 Py_BEGIN_ALLOW_THREADS
940 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +0000941#ifndef MS_WINDOWS
Guido van Rossum32c575d1997-12-02 20:37:32 +0000942#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000943 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +0000944#else
Barry Warsaw752300b1997-01-03 17:18:10 +0000945 (ANY *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +0000946#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000947#else
Barry Warsaw752300b1997-01-03 17:18:10 +0000948 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000949#endif
Barry Warsaw752300b1997-01-03 17:18:10 +0000950 );
Guido van Rossum73624e91994-10-10 17:59:00 +0000951 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +0000952 if (n < 0) {
953 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +0000954 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +0000955 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +0000956 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000957 return NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +0000958
959 if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
960 goto finally;
961
Guido van Rossum73624e91994-10-10 17:59:00 +0000962 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000963 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000964 Py_XDECREF(addr);
965 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000966 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000967}
968
Guido van Rossum30a685f1991-06-27 15:51:29 +0000969
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000970/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000971
Guido van Rossum73624e91994-10-10 17:59:00 +0000972static PyObject *
973BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000974{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000975 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000976 int len, n, flags = 0;
977 if (!PyArg_ParseTuple(args, "s#|i", &buf, &len, &flags))
978 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000979 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000980 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000981 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +0000982 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000983 return PySocket_Err();
984 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000985}
986
987
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000988/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000989
Guido van Rossum73624e91994-10-10 17:59:00 +0000990static PyObject *
991BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000992{
Guido van Rossum73624e91994-10-10 17:59:00 +0000993 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000994 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000995 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000996 int addrlen, len, n, flags;
997 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000998 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
999 PyErr_Clear();
1000 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001001 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001002 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001003 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001004 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001005 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001006 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001007 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001008 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001009 return PySocket_Err();
1010 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001011}
1012
Guido van Rossum30a685f1991-06-27 15:51:29 +00001013
1014/* s.shutdown(how) method */
1015
Guido van Rossum73624e91994-10-10 17:59:00 +00001016static PyObject *
1017BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001018{
1019 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001020 int res;
Guido van Rossumfe28fa01997-05-15 19:09:26 +00001021 if (!PyArg_Parse(args, "i", &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001022 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001023 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001024 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001025 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001026 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001027 return PySocket_Err();
1028 Py_INCREF(Py_None);
1029 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001030}
1031
Guido van Rossum30a685f1991-06-27 15:51:29 +00001032
1033/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001034
Guido van Rossum73624e91994-10-10 17:59:00 +00001035static PyMethodDef PySocketSock_methods[] = {
1036 {"accept", (PyCFunction)PySocketSock_accept},
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001037 {"setblocking", (PyCFunction)PySocketSock_setblocking},
Guido van Rossum73624e91994-10-10 17:59:00 +00001038 {"setsockopt", (PyCFunction)PySocketSock_setsockopt},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001039 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1},
Guido van Rossum73624e91994-10-10 17:59:00 +00001040 {"bind", (PyCFunction)PySocketSock_bind},
1041 {"close", (PyCFunction)PySocketSock_close},
1042 {"connect", (PyCFunction)PySocketSock_connect},
Barry Warsaw0d2d7591997-11-20 21:39:02 +00001043 {"connect_ex", (PyCFunction)PySocketSock_connect_ex},
Guido van Rossum73624e91994-10-10 17:59:00 +00001044 {"fileno", (PyCFunction)PySocketSock_fileno},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001045#ifndef NO_DUP
1046 {"dup", (PyCFunction)PySocketSock_dup},
1047#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001048 {"getsockname", (PyCFunction)PySocketSock_getsockname},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001049#ifdef HAVE_GETPEERNAME
Guido van Rossum73624e91994-10-10 17:59:00 +00001050 {"getpeername", (PyCFunction)PySocketSock_getpeername},
Guido van Rossum9575a441993-04-07 14:06:14 +00001051#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001052 {"listen", (PyCFunction)PySocketSock_listen},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001053#ifndef NO_DUP
Guido van Rossum6b144911995-03-14 15:05:13 +00001054 {"makefile", (PyCFunction)PySocketSock_makefile, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001055#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001056 {"recv", (PyCFunction)PySocketSock_recv, 1},
1057 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1},
1058 {"send", (PyCFunction)PySocketSock_send, 1},
Guido van Rossum73624e91994-10-10 17:59:00 +00001059 {"sendto", (PyCFunction)PySocketSock_sendto},
1060 {"shutdown", (PyCFunction)PySocketSock_shutdown},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001061 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001062};
1063
Guido van Rossum30a685f1991-06-27 15:51:29 +00001064
Guido van Rossum73624e91994-10-10 17:59:00 +00001065/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001066 First close the file description. */
1067
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001068static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001069BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001070{
1071 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +00001072 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001073}
1074
Guido van Rossum30a685f1991-06-27 15:51:29 +00001075
1076/* Return a socket object's named attribute. */
1077
Guido van Rossum73624e91994-10-10 17:59:00 +00001078static PyObject *
1079BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001080{
Guido van Rossum73624e91994-10-10 17:59:00 +00001081 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001082}
1083
Guido van Rossum30a685f1991-06-27 15:51:29 +00001084
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001085static PyObject *
1086BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
1087{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001088 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001089 sprintf(buf,
1090 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
1091 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001092 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001093}
1094
1095
Guido van Rossumb6775db1994-08-01 11:34:53 +00001096/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001097
Guido van Rossum73624e91994-10-10 17:59:00 +00001098static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001099 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001100 0,
1101 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +00001102 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001103 0,
Guido van Rossum73624e91994-10-10 17:59:00 +00001104 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001105 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001106 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001107 0, /*tp_setattr*/
1108 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001109 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001110 0, /*tp_as_number*/
1111 0, /*tp_as_sequence*/
1112 0, /*tp_as_mapping*/
1113};
1114
Guido van Rossum30a685f1991-06-27 15:51:29 +00001115
Guido van Rossum81194471991-07-27 21:42:02 +00001116/* Python interface to gethostname(). */
1117
1118/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001119static PyObject *
1120BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001121{
1122 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001123 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001124 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +00001125 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001126 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001127 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001128 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001129 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001130 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001131 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001132 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001133}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001134
1135
Guido van Rossum30a685f1991-06-27 15:51:29 +00001136/* Python interface to gethostbyname(name). */
1137
1138/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001139static PyObject *
1140BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001141{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001142 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001143 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +00001144 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001145 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001146 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001147 return NULL;
1148 return makeipaddr(&addrbuf);
1149}
1150
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001151/* Python interface to gethostbyaddr(IP). */
1152
1153/*ARGSUSED*/
1154static PyObject *
1155BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1156{
1157 struct sockaddr_in addr;
1158 char *ip_num;
1159 struct hostent *h;
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001160 char **pch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001161 PyObject *rtn_tuple = (PyObject *)NULL;
1162 PyObject *name_list = (PyObject *)NULL;
1163 PyObject *addr_list = (PyObject *)NULL;
1164 PyObject *tmp;
1165
1166 if (!PyArg_Parse(args, "s", &ip_num))
1167 return NULL;
1168 if (setipaddr(ip_num, &addr) < 0)
1169 return NULL;
1170 h = gethostbyaddr((char *)&addr.sin_addr,
1171 sizeof(addr.sin_addr),
1172 AF_INET);
1173 if (h == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +00001174#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001175 /* Let's get real error message to return */
1176 extern int h_errno;
1177 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1178#else
1179 PyErr_SetString(PySocket_Error, "host not found");
1180#endif
1181 return NULL;
1182 }
1183 if ((name_list = PyList_New(0)) == NULL)
1184 goto err;
1185 if ((addr_list = PyList_New(0)) == NULL)
1186 goto err;
1187 for (pch = h->h_aliases; *pch != NULL; pch++) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001188 int status;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001189 tmp = PyString_FromString(*pch);
1190 if (tmp == NULL)
1191 goto err;
Barry Warsaw752300b1997-01-03 17:18:10 +00001192 status = PyList_Append(name_list, tmp);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001193 Py_DECREF(tmp);
Barry Warsaw752300b1997-01-03 17:18:10 +00001194 if (status)
1195 goto err;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001196 }
1197 for (pch = h->h_addr_list; *pch != NULL; pch++) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001198 int status;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001199 memcpy((char *) &addr.sin_addr, *pch, h->h_length);
1200 tmp = makeipaddr(&addr);
1201 if (tmp == NULL)
1202 goto err;
Barry Warsaw752300b1997-01-03 17:18:10 +00001203 status = PyList_Append(addr_list, tmp);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001204 Py_DECREF(tmp);
Barry Warsaw752300b1997-01-03 17:18:10 +00001205 if (status)
1206 goto err;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001207 }
1208 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1209 err:
1210 Py_XDECREF(name_list);
1211 Py_XDECREF(addr_list);
1212 return rtn_tuple;
1213}
1214
Guido van Rossum30a685f1991-06-27 15:51:29 +00001215
1216/* Python interface to getservbyname(name).
1217 This only returns the port number, since the other info is already
1218 known or not useful (like the list of aliases). */
1219
1220/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001221static PyObject *
1222BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001223{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001224 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001225 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001226 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001227 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001228 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001229 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001230 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001231 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001232 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001233 return NULL;
1234 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001235 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001236}
1237
1238
Guido van Rossum3901d851996-12-19 16:35:04 +00001239/* Python interface to getprotobyname(name).
1240 This only returns the protocol number, since the other info is
1241 already known or not useful (like the list of aliases). */
1242
1243/*ARGSUSED*/
1244static PyObject *
1245BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1246{
1247 char *name;
1248 struct protoent *sp;
1249 if (!PyArg_Parse(args, "s", &name))
1250 return NULL;
1251 Py_BEGIN_ALLOW_THREADS
1252 sp = getprotobyname(name);
1253 Py_END_ALLOW_THREADS
1254 if (sp == NULL) {
1255 PyErr_SetString(PySocket_Error, "protocol not found");
1256 return NULL;
1257 }
1258 return PyInt_FromLong((long) sp->p_proto);
1259}
1260
1261
Guido van Rossum30a685f1991-06-27 15:51:29 +00001262/* Python interface to socket(family, type, proto).
1263 The third (protocol) argument is optional.
1264 Return a new socket object. */
1265
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001266/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001267static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001268BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001269{
Guido van Rossum73624e91994-10-10 17:59:00 +00001270 PySocketSockObject *s;
Guido van Rossum6f489d91996-06-28 20:15:15 +00001271#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001272 SOCKET fd;
1273#else
1274 int fd;
1275#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001276 int family, type, proto = 0;
1277 if (!PyArg_ParseTuple(args, "ii|i", &family, &type, &proto))
1278 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001279 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001280 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001281 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001282#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001283 if (fd == INVALID_SOCKET)
1284#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001285 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001286#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001287 return PySocket_Err();
1288 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001289 /* If the object can't be created, don't forget to close the
1290 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001291 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001292 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001293 /* From now on, ignore SIGPIPE and let the error checking
1294 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001295#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001296 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001297#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001298 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001299}
1300
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001301#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001302/* Create a socket object from a numeric file description.
1303 Useful e.g. if stdin is a socket.
1304 Additional arguments as for socket(). */
1305
1306/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001307static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001308BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001309{
Guido van Rossum73624e91994-10-10 17:59:00 +00001310 PySocketSockObject *s;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001311 int fd, family, type, proto = 0;
1312 if (!PyArg_ParseTuple(args, "iii|i", &fd, &family, &type, &proto))
1313 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001314 /* Dup the fd so it and the socket can be closed independently */
1315 fd = dup(fd);
1316 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001317 return PySocket_Err();
1318 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001319 /* From now on, ignore SIGPIPE and let the error checking
1320 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001321#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001322 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001323#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001324 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001325}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001326#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001327
Guido van Rossum006bf911996-06-12 04:04:55 +00001328static PyObject *
1329BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1330{
1331 int x1, x2;
1332
1333 if (!PyArg_Parse(args, "i", &x1)) {
1334 return NULL;
1335 }
1336 x2 = (int)ntohs((short)x1);
1337 return PyInt_FromLong(x2);
1338}
1339
1340static PyObject *
1341BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1342{
1343 int x1, x2;
1344
1345 if (!PyArg_Parse(args, "i", &x1)) {
1346 return NULL;
1347 }
1348 x2 = ntohl(x1);
1349 return PyInt_FromLong(x2);
1350}
1351
1352static PyObject *
1353BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1354{
1355 int x1, x2;
1356
1357 if (!PyArg_Parse(args, "i", &x1)) {
1358 return NULL;
1359 }
1360 x2 = (int)htons((short)x1);
1361 return PyInt_FromLong(x2);
1362}
1363
1364static PyObject *
1365BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1366{
1367 int x1, x2;
1368
1369 if (!PyArg_Parse(args, "i", &x1)) {
1370 return NULL;
1371 }
1372 x2 = htonl(x1);
1373 return PyInt_FromLong(x2);
1374}
1375
Guido van Rossum30a685f1991-06-27 15:51:29 +00001376/* List of functions exported by this module. */
1377
Guido van Rossum73624e91994-10-10 17:59:00 +00001378static PyMethodDef PySocket_methods[] = {
1379 {"gethostbyname", PySocket_gethostbyname},
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001380 {"gethostbyaddr", PySocket_gethostbyaddr},
Guido van Rossum73624e91994-10-10 17:59:00 +00001381 {"gethostname", PySocket_gethostname},
1382 {"getservbyname", PySocket_getservbyname},
Guido van Rossum3901d851996-12-19 16:35:04 +00001383 {"getprotobyname", PySocket_getprotobyname},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001384 {"socket", PySocket_socket, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001385#ifndef NO_DUP
Guido van Rossumbe32c891996-06-20 16:25:29 +00001386 {"fromfd", PySocket_fromfd, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001387#endif
Guido van Rossum006bf911996-06-12 04:04:55 +00001388 {"ntohs", PySocket_ntohs},
1389 {"ntohl", PySocket_ntohl},
1390 {"htons", PySocket_htons},
1391 {"htonl", PySocket_htonl},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001392 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001393};
1394
Guido van Rossum30a685f1991-06-27 15:51:29 +00001395
1396/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00001397 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001398 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00001399 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001400static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001401BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001402{
Guido van Rossum73624e91994-10-10 17:59:00 +00001403 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00001404 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001405 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00001406
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001407 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001408}
1409
Guido van Rossum30a685f1991-06-27 15:51:29 +00001410
Guido van Rossum8d665e61996-06-26 18:22:49 +00001411#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001412
1413/* Additional initialization and cleanup for NT/Windows */
1414
1415static void
1416NTcleanup()
1417{
1418 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00001419}
1420
1421static int
1422NTinit()
1423{
1424 WSADATA WSAData;
1425 int ret;
1426 char buf[100];
1427 ret = WSAStartup(0x0101, &WSAData);
1428 switch (ret) {
1429 case 0: /* no error */
1430 atexit(NTcleanup);
1431 return 1;
1432 case WSASYSNOTREADY:
1433 PyErr_SetString(PyExc_ImportError,
1434 "WSAStartup failed: network not ready");
1435 break;
1436 case WSAVERNOTSUPPORTED:
1437 case WSAEINVAL:
1438 PyErr_SetString(PyExc_ImportError,
1439 "WSAStartup failed: requested version not supported");
1440 break;
1441 default:
1442 sprintf(buf, "WSAStartup failed: error code %d", ret);
1443 PyErr_SetString(PyExc_ImportError, buf);
1444 break;
1445 }
1446 return 0;
1447}
1448
Guido van Rossum8d665e61996-06-26 18:22:49 +00001449#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00001450
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001451#if defined(PYOS_OS2)
1452
1453/* Additional initialization and cleanup for OS/2 */
1454
1455static void
1456OS2cleanup()
1457{
1458 /* No cleanup is necessary for OS/2 Sockets */
1459}
1460
1461static int
1462OS2init()
1463{
1464 char reason[64];
1465 int rc = sock_init();
1466
1467 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00001468 atexit(OS2cleanup);
1469 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001470 }
1471
1472 sprintf(reason, "OS/2 TCP/IP Error# %d", sock_errno());
1473 PyErr_SetString(PyExc_ImportError, reason);
1474
Guido van Rossum32c575d1997-12-02 20:37:32 +00001475 return 0; /* Indicate Failure */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001476}
1477
1478#endif /* PYOS_OS2 */
1479
Guido van Rossumbe32c891996-06-20 16:25:29 +00001480
Guido van Rossum30a685f1991-06-27 15:51:29 +00001481/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001482 * This is called when the first 'import socket' is done,
1483 * via a table in config.c, if config.c is compiled with USE_SOCKET
1484 * defined.
1485 *
1486 * For MS_WINDOWS (which means any Windows variant), this module
1487 * is actually called "_socket", and there's a wrapper "socket.py"
1488 * which implements some missing functionality (such as makefile(),
1489 * dup() and fromfd()). The import of "_socket" may fail with an
1490 * ImportError exception if initialization of WINSOCK fails. When
1491 * WINSOCK is initialized succesfully, a call to WSACleanup() is
1492 * scheduled to be made at exit time.
1493 *
1494 * For OS/2, this module is also called "_socket" and uses a wrapper
1495 * "socket.py" which implements that functionality that is missing
1496 * when PC operating systems don't put socket descriptors in the
1497 * operating system's filesystem layer.
1498 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001499
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001500void
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001501#if defined(MS_WINDOWS) || defined(PYOS_OS2)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001502init_socket()
1503#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001504initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00001505#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001506{
Guido van Rossum73624e91994-10-10 17:59:00 +00001507 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001508#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001509 if (!NTinit())
1510 return;
1511 m = Py_InitModule("_socket", PySocket_methods);
1512#else
Guido van Rossum32c575d1997-12-02 20:37:32 +00001513#if defined(__TOS_OS2__)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001514 if (!OS2init())
1515 return;
1516 m = Py_InitModule("_socket", PySocket_methods);
Guido van Rossum32c575d1997-12-02 20:37:32 +00001517#else
Guido van Rossum73624e91994-10-10 17:59:00 +00001518 m = Py_InitModule("socket", PySocket_methods);
Guido van Rossum32c575d1997-12-02 20:37:32 +00001519#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001520#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001521 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001522 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
1523 if (PySocket_Error == NULL)
1524 return;
1525 PyDict_SetItemString(d, "error", PySocket_Error);
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00001526 PySocketSock_Type.ob_type = &PyType_Type;
1527 Py_INCREF(&PySocketSock_Type);
Guido van Rossum91ba64d1997-06-02 22:18:09 +00001528 if (PyDict_SetItemString(d, "SocketType",
Guido van Rossum3b4b6fc1997-05-21 14:37:37 +00001529 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001530 return;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001531 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001532#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001533 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001534#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001535 insint(d, "SOCK_STREAM", SOCK_STREAM);
1536 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
1537 insint(d, "SOCK_RAW", SOCK_RAW);
1538 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1539 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001540
1541#ifdef SO_DEBUG
1542 insint(d, "SO_DEBUG", SO_DEBUG);
1543#endif
1544#ifdef SO_ACCEPTCONN
1545 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
1546#endif
1547#ifdef SO_REUSEADDR
1548 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
1549#endif
1550#ifdef SO_KEEPALIVE
1551 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
1552#endif
1553#ifdef SO_DONTROUTE
1554 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
1555#endif
1556#ifdef SO_BROADCAST
1557 insint(d, "SO_BROADCAST", SO_BROADCAST);
1558#endif
1559#ifdef SO_USELOOPBACK
1560 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
1561#endif
1562#ifdef SO_LINGER
1563 insint(d, "SO_LINGER", SO_LINGER);
1564#endif
1565#ifdef SO_OOBINLINE
1566 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
1567#endif
1568#ifdef SO_REUSEPORT
1569 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
1570#endif
1571
1572#ifdef SO_SNDBUF
1573 insint(d, "SO_SNDBUF", SO_SNDBUF);
1574#endif
1575#ifdef SO_RCVBUF
1576 insint(d, "SO_RCVBUF", SO_RCVBUF);
1577#endif
1578#ifdef SO_SNDLOWAT
1579 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
1580#endif
1581#ifdef SO_RCVLOWAT
1582 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
1583#endif
1584#ifdef SO_SNDTIMEO
1585 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
1586#endif
1587#ifdef SO_RCVTIMEO
1588 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
1589#endif
1590#ifdef SO_ERROR
1591 insint(d, "SO_ERROR", SO_ERROR);
1592#endif
1593#ifdef SO_TYPE
1594 insint(d, "SO_TYPE", SO_TYPE);
1595#endif
1596
1597 /* Maximum number of connections for "listen" */
1598#ifdef SOMAXCONN
1599 insint(d, "SOMAXCONN", SOMAXCONN);
1600#else
1601 insint(d, "SOMAXCONN", 5); /* Common value */
1602#endif
1603
1604 /* Flags for send, recv */
1605#ifdef MSG_OOB
1606 insint(d, "MSG_OOB", MSG_OOB);
1607#endif
1608#ifdef MSG_PEEK
1609 insint(d, "MSG_PEEK", MSG_PEEK);
1610#endif
1611#ifdef MSG_DONTROUTE
1612 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
1613#endif
1614#ifdef MSG_EOR
1615 insint(d, "MSG_EOR", MSG_EOR);
1616#endif
1617#ifdef MSG_TRUNC
1618 insint(d, "MSG_TRUNC", MSG_TRUNC);
1619#endif
1620#ifdef MSG_CTRUNC
1621 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
1622#endif
1623#ifdef MSG_WAITALL
1624 insint(d, "MSG_WAITALL", MSG_WAITALL);
1625#endif
1626#ifdef MSG_BTAG
1627 insint(d, "MSG_BTAG", MSG_BTAG);
1628#endif
1629#ifdef MSG_ETAG
1630 insint(d, "MSG_ETAG", MSG_ETAG);
1631#endif
1632
1633 /* Protocol level and numbers, usable for [gs]etsockopt */
1634#ifdef SOL_SOCKET
1635 insint(d, "SOL_SOCKET", SOL_SOCKET);
1636#endif
1637#ifdef IPPROTO_IP
1638 insint(d, "IPPROTO_IP", IPPROTO_IP);
1639#endif
1640#ifdef IPPROTO_ICMP
1641 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
1642#endif
1643#ifdef IPPROTO_IGMP
1644 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
1645#endif
1646#ifdef IPPROTO_GGP
1647 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
1648#endif
1649#ifdef IPPROTO_TCP
1650 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
1651#endif
1652#ifdef IPPROTO_EGP
1653 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
1654#endif
1655#ifdef IPPROTO_PUP
1656 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
1657#endif
1658#ifdef IPPROTO_UDP
1659 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
1660#endif
1661#ifdef IPPROTO_IDP
1662 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
1663#endif
1664#ifdef IPPROTO_HELLO
1665 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
1666#endif
1667#ifdef IPPROTO_ND
1668 insint(d, "IPPROTO_ND", IPPROTO_ND);
1669#endif
1670#ifdef IPPROTO_TP
1671 insint(d, "IPPROTO_TP", IPPROTO_TP);
1672#endif
1673#ifdef IPPROTO_XTP
1674 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
1675#endif
1676#ifdef IPPROTO_EON
1677 insint(d, "IPPROTO_EON", IPPROTO_EON);
1678#endif
1679#ifdef IPPROTO_BIP
1680 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
1681#endif
1682/**/
1683#ifdef IPPROTO_RAW
1684 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
1685#endif
1686#ifdef IPPROTO_MAX
1687 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
1688#endif
1689
1690 /* Some port configuration */
1691#ifdef IPPORT_RESERVED
1692 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
1693#else
1694 insint(d, "IPPORT_RESERVED", 1024);
1695#endif
1696#ifdef IPPORT_USERRESERVED
1697 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
1698#else
1699 insint(d, "IPPORT_USERRESERVED", 5000);
1700#endif
1701
Guido van Rossum5f05eb41995-02-17 15:11:07 +00001702 /* Some reserved IP v.4 addresses */
1703#ifdef INADDR_ANY
1704 insint(d, "INADDR_ANY", INADDR_ANY);
1705#else
1706 insint(d, "INADDR_ANY", 0x00000000);
1707#endif
1708#ifdef INADDR_BROADCAST
1709 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
1710#else
1711 insint(d, "INADDR_BROADCAST", 0xffffffff);
1712#endif
1713#ifdef INADDR_LOOPBACK
1714 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
1715#else
1716 insint(d, "INADDR_LOOPBACK", 0x7F000001);
1717#endif
1718#ifdef INADDR_UNSPEC_GROUP
1719 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
1720#else
1721 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
1722#endif
1723#ifdef INADDR_ALLHOSTS_GROUP
1724 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
1725#else
1726 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
1727#endif
1728#ifdef INADDR_MAX_LOCAL_GROUP
1729 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
1730#else
1731 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
1732#endif
1733#ifdef INADDR_NONE
1734 insint(d, "INADDR_NONE", INADDR_NONE);
1735#else
1736 insint(d, "INADDR_NONE", 0xffffffff);
1737#endif
1738
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001739 /* IP [gs]etsockopt options */
1740#ifdef IP_OPTIONS
1741 insint(d, "IP_OPTIONS", IP_OPTIONS);
1742#endif
1743#ifdef IP_HDRINCL
1744 insint(d, "IP_HDRINCL", IP_HDRINCL);
1745#endif
1746#ifdef IP_TOS
1747 insint(d, "IP_TOS", IP_TOS);
1748#endif
1749#ifdef IP_TTL
1750 insint(d, "IP_TTL", IP_TTL);
1751#endif
1752#ifdef IP_RECVOPTS
1753 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
1754#endif
1755#ifdef IP_RECVRETOPTS
1756 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
1757#endif
1758#ifdef IP_RECVDSTADDR
1759 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
1760#endif
1761#ifdef IP_RETOPTS
1762 insint(d, "IP_RETOPTS", IP_RETOPTS);
1763#endif
1764#ifdef IP_MULTICAST_IF
1765 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
1766#endif
1767#ifdef IP_MULTICAST_TTL
1768 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
1769#endif
1770#ifdef IP_MULTICAST_LOOP
1771 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
1772#endif
1773#ifdef IP_ADD_MEMBERSHIP
1774 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
1775#endif
1776#ifdef IP_DROP_MEMBERSHIP
1777 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
1778#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001779}