blob: bda7bf1569e4e792d50e12992cde006e083826d7 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/***********************************************************
Guido van Rossumb6775db1994-08-01 11:34:53 +00002Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
Guido van Rossume5372401993-03-16 12:15:04 +00003Amsterdam, The Netherlands.
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
25/* Socket module */
26
27/*
28This module provides an interface to Berkeley socket IPC.
29
30Limitations:
31
Guido van Rossum30a685f1991-06-27 15:51:29 +000032- only AF_INET and AF_UNIX address families are supported
Guido van Rossumb6775db1994-08-01 11:34:53 +000033- no asynchronous I/O (but you can use select() on sockets)
Guido van Rossum81194471991-07-27 21:42:02 +000034- no read/write operations (use send/recv or makefile instead)
Guido van Rossum0e69587d1992-06-05 15:11:30 +000035- setsockopt() and getsockopt() only support integer options
Guido van Rossum6574b3e1991-06-25 21:36:08 +000036
37Interface:
38
Guido van Rossum81194471991-07-27 21:42:02 +000039- socket.gethostname() --> host name (string)
Guido van Rossum30a685f1991-06-27 15:51:29 +000040- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000041- socket.getservbyname(servername, protocolname) --> port number
42- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum6574b3e1991-06-25 21:36:08 +000043- family and type constants from <socket.h> are accessed as socket.AF_INET etc.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000044- errors are reported as the exception socket.error
45- an Internet socket address is a pair (hostname, port)
46 where hostname can be anything recognized by gethostbyname()
47 (including the dd.dd.dd.dd notation) and port is in host byte order
48- where a hostname is returned, the dd.dd.dd.dd notation is used
49- a UNIX domain socket is a string specifying the pathname
50
Guido van Rossum30a685f1991-06-27 15:51:29 +000051Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000052
Guido van Rossum81194471991-07-27 21:42:02 +000053- s.accept() --> new socket object, sockaddr
Guido van Rossum73624e91994-10-10 17:59:00 +000054- s.setsockopt(level, optname, flag) --> Py_None
Guido van Rossum0e69587d1992-06-05 15:11:30 +000055- s.getsockopt(level, optname) --> flag
Guido van Rossum73624e91994-10-10 17:59:00 +000056- s.bind(sockaddr) --> Py_None
57- s.connect(sockaddr) --> Py_None
Guido van Rossumc89705d1992-11-26 08:54:07 +000058- s.getsockname() --> sockaddr
59- s.getpeername() --> sockaddr
Guido van Rossum73624e91994-10-10 17:59:00 +000060- s.listen(n) --> Py_None
Guido van Rossum30a685f1991-06-27 15:51:29 +000061- s.makefile(mode) --> file object
Guido van Rossumeb6b33a1993-05-25 09:38:27 +000062- s.recv(nbytes [,flags]) --> string
Guido van Rossum18c9a4f1993-05-25 12:16:29 +000063- s.recvfrom(nbytes [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000064- s.send(string [,flags]) --> nbytes
65- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum73624e91994-10-10 17:59:00 +000066- s.setblocking(1 | 0) --> Py_None
67- s.shutdown(how) --> Py_None
68- s.close() --> Py_None
Guido van Rossum30a685f1991-06-27 15:51:29 +000069
Guido van Rossum6574b3e1991-06-25 21:36:08 +000070*/
71
Guido van Rossum73624e91994-10-10 17:59:00 +000072#include "Python.h"
Guido van Rossum6574b3e1991-06-25 21:36:08 +000073
Guido van Rossumb6775db1994-08-01 11:34:53 +000074#include <sys/types.h>
75#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +000076
Guido van Rossum81194471991-07-27 21:42:02 +000077#include <signal.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000078#ifndef NT
Guido van Rossumb6775db1994-08-01 11:34:53 +000079#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +000080#include <sys/socket.h>
81#include <netinet/in.h>
Guido van Rossume4485b01994-09-07 14:32:49 +000082#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000083#else
84#include <winsock.h>
85#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +000086#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +000087#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +000088#else
89#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +000090#endif
91
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000092/* Here we have some hacks to choose between K&R or ANSI style function
93 definitions. For NT to build this as an extension module (ie, DLL)
94 it must be compiled by the C++ compiler, as it takes the address of
95 a static data item exported from the main Python DLL.
96*/
97#ifdef NT
98/* seem to be a few differences in the API */
99#define close closesocket
100#define NO_DUP /* I wont trust passing a socket to NT's RTL!! */
101#define FORCE_ANSI_FUNC_DEFS
102#endif
103
104#ifdef FORCE_ANSI_FUNC_DEFS
105#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
106fnname( arg1type arg1name )
107
108#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
109fnname( arg1type arg1name, arg2type arg2name )
110
111#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
112fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
113
114#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
115fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
116
117#else /* !FORCE_ANSI_FN_DEFS */
118#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
119fnname( arg1name ) \
120 arg1type arg1name;
121
122#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
123fnname( arg1name, arg2name ) \
124 arg1type arg1name; \
125 arg2type arg2name;
126
127#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
128fnname( arg1name, arg2name, arg3name ) \
129 arg1type arg1name; \
130 arg2type arg2name; \
131 arg3type arg3name;
132
133#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
134fnname( arg1name, arg2name, arg3name, arg4name ) \
135 arg1type arg1name; \
136 arg2type arg2name; \
137 arg3type arg3name; \
138 arg4type arg4name;
139
140#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000141
142/* Global variable holding the exception type for errors detected
143 by this module (but not argument type or memory errors, etc.). */
144
Guido van Rossum73624e91994-10-10 17:59:00 +0000145static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000146
147
148/* Convenience function to raise an error according to errno
149 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000150
Guido van Rossum73624e91994-10-10 17:59:00 +0000151static PyObject *
152PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000153{
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000154#ifdef NT
155 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000156 PyObject *v;
157 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000158 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000159 PyErr_SetObject(PySocket_Error, v);
160 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000161 }
162 return NULL;
163 }
164 else
165#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000166 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000167}
168
Guido van Rossum30a685f1991-06-27 15:51:29 +0000169
170/* The object holding a socket. It holds some extra information,
171 like the address family, which is used to decode socket address
172 arguments properly. */
173
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000174typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000175 PyObject_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000176 int sock_fd; /* Socket file descriptor */
177 int sock_family; /* Address family, e.g., AF_INET */
178 int sock_type; /* Socket type, e.g., SOCK_STREAM */
179 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum73624e91994-10-10 17:59:00 +0000180} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000181
Guido van Rossum30a685f1991-06-27 15:51:29 +0000182
183/* A forward reference to the Socktype type object.
184 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000185 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000186 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000187
Guido van Rossum73624e91994-10-10 17:59:00 +0000188staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000189
Guido van Rossum30a685f1991-06-27 15:51:29 +0000190
191/* Create a new socket object.
192 This just creates the object and initializes it.
193 If the creation fails, return NULL and set an exception (implicit
194 in NEWOBJ()). */
195
Guido van Rossum73624e91994-10-10 17:59:00 +0000196static PySocketSockObject *
197BUILD_FUNC_DEF_4(PySocketSock_New, int, fd, int, family, int, type, int, proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000198{
Guido van Rossum73624e91994-10-10 17:59:00 +0000199 PySocketSockObject *s;
200 s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000201 if (s != NULL) {
202 s->sock_fd = fd;
203 s->sock_family = family;
204 s->sock_type = type;
205 s->sock_proto = proto;
206 }
207 return s;
208}
209
Guido van Rossum30a685f1991-06-27 15:51:29 +0000210
211/* Convert a string specifying a host name or one of a few symbolic
212 names to a numeric IP address. This usually calls gethostbyname()
213 to do the work; the names "" and "<broadcast>" are special.
214 Return the length (should always be 4 bytes), or negative if
215 an error occurred; then an exception is raised. */
216
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000217static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000218BUILD_FUNC_DEF_2(setipaddr, char*, name, struct sockaddr_in *, addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000219{
220 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000221 int d1, d2, d3, d4;
222 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000223
Guido van Rossum30a685f1991-06-27 15:51:29 +0000224 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000225 addr_ret->sin_addr.s_addr = INADDR_ANY;
226 return 4;
227 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000228 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000229 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
230 return 4;
231 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000232 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
233 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
234 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
235 addr_ret->sin_addr.s_addr = htonl(
236 ((long) d1 << 24) | ((long) d2 << 16) |
237 ((long) d3 << 8) | ((long) d4 << 0));
238 return 4;
239 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000240 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000241 hp = gethostbyname(name);
Guido van Rossum73624e91994-10-10 17:59:00 +0000242 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000243 if (hp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000244 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000245 return -1;
246 }
247 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
248 return hp->h_length;
249}
250
Guido van Rossum30a685f1991-06-27 15:51:29 +0000251
Guido van Rossum30a685f1991-06-27 15:51:29 +0000252/* Create a string object representing an IP address.
253 This is always a string of the form 'dd.dd.dd.dd' (with variable
254 size numbers). */
255
Guido van Rossum73624e91994-10-10 17:59:00 +0000256static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000257BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000258{
259 long x = ntohl(addr->sin_addr.s_addr);
260 char buf[100];
261 sprintf(buf, "%d.%d.%d.%d",
262 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
263 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000264 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000265}
266
267
268/* Create an object representing the given socket address,
269 suitable for passing it back to bind(), connect() etc.
270 The family field of the sockaddr structure is inspected
271 to determine what kind of address it really is. */
272
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000273/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000274static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000275BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *, addr, int, addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000276{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000277 if (addrlen == 0) {
278 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000279 Py_INCREF(Py_None);
280 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000281 }
282
Guido van Rossum30a685f1991-06-27 15:51:29 +0000283 switch (addr->sa_family) {
284
285 case AF_INET:
286 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000287 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000288 PyObject *addr = makeipaddr(a);
289 PyObject *ret = Py_BuildValue("Oi", addr, ntohs(a->sin_port));
290 Py_XDECREF(addr);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000291 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000292 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000293
Guido van Rossumb6775db1994-08-01 11:34:53 +0000294#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000295 case AF_UNIX:
296 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000297 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000298 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000299 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000300#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000301
302 /* More cases here... */
303
304 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000305 PyErr_SetString(PySocket_Error, "return unknown socket address type");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000306 return NULL;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000307
Guido van Rossum30a685f1991-06-27 15:51:29 +0000308 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000309}
310
Guido van Rossum30a685f1991-06-27 15:51:29 +0000311
312/* Parse a socket address argument according to the socket object's
313 address family. Return 1 if the address was in the proper format,
314 0 of not. The address is returned through addr_ret, its length
315 through len_ret. */
316
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000317static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000318BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000319getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000320{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000321 switch (s->sock_family) {
322
Guido van Rossumb6775db1994-08-01 11:34:53 +0000323#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000324 case AF_UNIX:
325 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000326 static struct sockaddr_un addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000327 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000328 int len;
Guido van Rossum73624e91994-10-10 17:59:00 +0000329 if (!PyArg_Parse(args, "s#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000330 return 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000331 if (len > sizeof addr.sun_path) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000332 PyErr_SetString(PySocket_Error, "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000333 return 0;
334 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000335 addr.sun_family = AF_UNIX;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000336 memcpy(addr.sun_path, path, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000337 *addr_ret = (struct sockaddr *) &addr;
338 *len_ret = len + sizeof addr.sun_family;
339 return 1;
340 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000341#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000342
Guido van Rossum30a685f1991-06-27 15:51:29 +0000343 case AF_INET:
344 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000345 static struct sockaddr_in addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000346 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000347 int port;
Guido van Rossum73624e91994-10-10 17:59:00 +0000348 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000349 return 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000350 if (setipaddr(host, &addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000351 return 0;
352 addr.sin_family = AF_INET;
353 addr.sin_port = htons(port);
354 *addr_ret = (struct sockaddr *) &addr;
355 *len_ret = sizeof addr;
356 return 1;
357 }
358
Guido van Rossum30a685f1991-06-27 15:51:29 +0000359 /* More cases here... */
360
361 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000362 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000363 return 0;
364
365 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000366}
367
Guido van Rossum30a685f1991-06-27 15:51:29 +0000368
Guido van Rossum710e1df1992-06-12 10:39:36 +0000369/* Get the address length according to the socket object's address family.
370 Return 1 if the family is known, 0 otherwise. The length is returned
371 through len_ret. */
372
373static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000374BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000375{
376 switch (s->sock_family) {
377
Guido van Rossumb6775db1994-08-01 11:34:53 +0000378#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000379 case AF_UNIX:
380 {
381 *len_ret = sizeof (struct sockaddr_un);
382 return 1;
383 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000384#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000385
386 case AF_INET:
387 {
388 *len_ret = sizeof (struct sockaddr_in);
389 return 1;
390 }
391
392 /* More cases here... */
393
394 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000395 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000396 return 0;
397
398 }
399}
400
401
Guido van Rossum30a685f1991-06-27 15:51:29 +0000402/* s.accept() method */
403
Guido van Rossum73624e91994-10-10 17:59:00 +0000404static PyObject *
405BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000406{
407 char addrbuf[256];
408 int addrlen, newfd;
Guido van Rossum73624e91994-10-10 17:59:00 +0000409 PyObject *sock, *addr, *res;
410 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000411 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000412 if (!getsockaddrlen(s, &addrlen))
413 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000414 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000415 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000416 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000417 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000418 return PySocket_Err();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000419 /* Create the new object with unspecified family,
420 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000421 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000422 s->sock_family,
423 s->sock_type,
424 s->sock_proto);
425 if (sock == NULL)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000426 close(newfd);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000427 addr = makesockaddr((struct sockaddr *) addrbuf, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000428 res = Py_BuildValue("OO", sock, addr);
429 Py_XDECREF(sock);
430 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000431 return res;
432}
433
Guido van Rossum30a685f1991-06-27 15:51:29 +0000434
Guido van Rossumc65a5251994-08-05 13:44:50 +0000435#if 0
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000436/* s.allowbroadcast() method */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000437/* XXX obsolete -- will disappear in next release */
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000438
Guido van Rossum73624e91994-10-10 17:59:00 +0000439static PyObject *
440BUILD_FUNC_DEF_2(PySocketSock_allowbroadcast,PySocketSockObject *,s, PyObject *,args)
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000441{
442 int flag;
443 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000444 if (!PyArg_Parse(args, "i", &flag))
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000445 return NULL;
446 res = setsockopt(s->sock_fd, SOL_SOCKET, SO_BROADCAST,
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000447 (ANY *)&flag, sizeof flag);
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000448 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000449 return PySocket_Err();
450 Py_INCREF(Py_None);
451 return Py_None;
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000452}
Guido van Rossumc65a5251994-08-05 13:44:50 +0000453#endif
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000454
455
Guido van Rossume4485b01994-09-07 14:32:49 +0000456#ifndef NT
457
458/* s.setblocking(1 | 0) method */
459
Guido van Rossum73624e91994-10-10 17:59:00 +0000460static PyObject *
461PySocketSock_setblocking(s, args)
462 PySocketSockObject *s;
463 PyObject *args;
Guido van Rossume4485b01994-09-07 14:32:49 +0000464{
465 int block;
466 int delay_flag;
Guido van Rossum73624e91994-10-10 17:59:00 +0000467 if (!PyArg_GetInt(args, &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000468 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000469 Py_BEGIN_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000470 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
471 if (block)
472 delay_flag &= (~O_NDELAY);
473 else
474 delay_flag |= O_NDELAY;
475 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum73624e91994-10-10 17:59:00 +0000476 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000477
Guido van Rossum73624e91994-10-10 17:59:00 +0000478 Py_INCREF(Py_None);
479 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000480}
481#endif
482
483
Guido van Rossumaee08791992-09-08 09:05:33 +0000484/* s.setsockopt() method.
485 With an integer third argument, sets an integer option.
486 With a string third argument, sets an option from a buffer;
487 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000488
Guido van Rossum73624e91994-10-10 17:59:00 +0000489static PyObject *
490BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000491{
492 int level;
493 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000494 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000495 char *buf;
496 int buflen;
497 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000498
Guido van Rossum73624e91994-10-10 17:59:00 +0000499 if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000500 buf = (char *) &flag;
501 buflen = sizeof flag;
502 }
503 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000504 PyErr_Clear();
505 if (!PyArg_Parse(args, "(iis#)", &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000506 return NULL;
507 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000508 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000509 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000510 return PySocket_Err();
511 Py_INCREF(Py_None);
512 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000513}
514
515
Guido van Rossumaee08791992-09-08 09:05:33 +0000516/* s.getsockopt() method.
517 With two arguments, retrieves an integer option.
518 With a third integer argument, retrieves a string buffer of that size;
519 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000520
Guido van Rossum73624e91994-10-10 17:59:00 +0000521static PyObject *
522BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000523{
524 int level;
525 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000526 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000527 PyObject *buf;
Guido van Rossumaee08791992-09-08 09:05:33 +0000528 int buflen;
529 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000530
Guido van Rossum73624e91994-10-10 17:59:00 +0000531 if (PyArg_Parse(args, "(ii)", &level, &optname)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000532 int flag = 0;
533 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000534 res = getsockopt(s->sock_fd, level, optname,
535 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000536 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000537 return PySocket_Err();
538 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000539 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000540 PyErr_Clear();
541 if (!PyArg_Parse(args, "(iii)", &level, &optname, &buflen))
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000542 return NULL;
Guido van Rossumaee08791992-09-08 09:05:33 +0000543 if (buflen <= 0 || buflen > 1024) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000544 PyErr_SetString(PySocket_Error, "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000545 return NULL;
546 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000547 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000548 if (buf == NULL)
549 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000550 res = getsockopt(s->sock_fd, level, optname,
551 (ANY *)getstringvalue(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000552 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000553 Py_DECREF(buf);
554 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000555 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000556 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000557 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000558}
559
560
Guido van Rossum30a685f1991-06-27 15:51:29 +0000561/* s.bind(sockaddr) method */
562
Guido van Rossum73624e91994-10-10 17:59:00 +0000563static PyObject *
564BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000565{
566 struct sockaddr *addr;
567 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000568 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000569 if (!getsockaddrarg(s, args, &addr, &addrlen))
570 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000571 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000572 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000573 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000574 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000575 return PySocket_Err();
576 Py_INCREF(Py_None);
577 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000578}
579
Guido van Rossum30a685f1991-06-27 15:51:29 +0000580
581/* s.close() method.
582 Set the file descriptor to -1 so operations tried subsequently
583 will surely fail. */
584
Guido van Rossum73624e91994-10-10 17:59:00 +0000585static PyObject *
586BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000587{
Guido van Rossum73624e91994-10-10 17:59:00 +0000588 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000589 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000590 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000591 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000592 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000593 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000594 Py_INCREF(Py_None);
595 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000596}
597
Guido van Rossum30a685f1991-06-27 15:51:29 +0000598
599/* s.connect(sockaddr) method */
600
Guido van Rossum73624e91994-10-10 17:59:00 +0000601static PyObject *
602BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000603{
604 struct sockaddr *addr;
605 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000606 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000607 if (!getsockaddrarg(s, args, &addr, &addrlen))
608 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000609 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000610 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000611 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000612 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000613 return PySocket_Err();
614 Py_INCREF(Py_None);
615 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000616}
617
Guido van Rossum30a685f1991-06-27 15:51:29 +0000618
Guido van Rossumed233a51992-06-23 09:07:03 +0000619/* s.fileno() method */
620
Guido van Rossum73624e91994-10-10 17:59:00 +0000621static PyObject *
622BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000623{
Guido van Rossum73624e91994-10-10 17:59:00 +0000624 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000625 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000626 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000627}
628
629
Guido van Rossumc89705d1992-11-26 08:54:07 +0000630/* s.getsockname() method */
631
Guido van Rossum73624e91994-10-10 17:59:00 +0000632static PyObject *
633BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000634{
635 char addrbuf[256];
636 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000637 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000638 return NULL;
639 if (!getsockaddrlen(s, &addrlen))
640 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000641 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000642 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000643 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000644 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000645 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000646 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
647}
648
649
Guido van Rossumb6775db1994-08-01 11:34:53 +0000650#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000651/* s.getpeername() method */
652
Guido van Rossum73624e91994-10-10 17:59:00 +0000653static PyObject *
654BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000655{
656 char addrbuf[256];
657 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000658 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000659 return NULL;
660 if (!getsockaddrlen(s, &addrlen))
661 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000662 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000663 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000664 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000665 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000666 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000667 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
668}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000669#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000670
671
Guido van Rossum30a685f1991-06-27 15:51:29 +0000672/* s.listen(n) method */
673
Guido van Rossum73624e91994-10-10 17:59:00 +0000674static PyObject *
675BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000676{
677 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000678 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000679 if (!PyArg_GetInt(args, &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000680 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000681 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000682 if (backlog < 1)
683 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000684 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +0000685 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000686 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000687 return PySocket_Err();
688 Py_INCREF(Py_None);
689 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000690}
691
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000692#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +0000693/* s.makefile(mode) method.
694 Create a new open file object referring to a dupped version of
695 the socket's file descriptor. (The dup() call is necessary so
696 that the open file and socket objects may be closed independent
697 of each other.)
698 The mode argument specifies 'r' or 'w' passed to fdopen(). */
699
Guido van Rossum73624e91994-10-10 17:59:00 +0000700static PyObject *
701BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000702{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000703 extern int fclose PROTO((FILE *));
Guido van Rossumff4949e1992-08-05 19:58:53 +0000704 char *mode;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000705 int fd;
706 FILE *fp;
Guido van Rossum73624e91994-10-10 17:59:00 +0000707 if (!PyArg_Parse(args, "s", &mode))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000708 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000709 if ((fd = dup(s->sock_fd)) < 0 ||
Guido van Rossumff4949e1992-08-05 19:58:53 +0000710 (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum73624e91994-10-10 17:59:00 +0000711 return PySocket_Err();
712 return PyFile_FromFile(fp, "<socket>", mode, fclose);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000713}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000714#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000715
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000716/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000717
Guido van Rossum73624e91994-10-10 17:59:00 +0000718static PyObject *
719BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000720{
721 int len, n, flags;
Guido van Rossum73624e91994-10-10 17:59:00 +0000722 PyObject *buf;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000723 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000724 if (!PyArg_Parse(args, "i", &len)) {
725 PyErr_Clear();
726 if (!PyArg_Parse(args, "(ii)", &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000727 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000728 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000729 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000730 if (buf == NULL)
731 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000732 Py_BEGIN_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +0000733 n = recv(s->sock_fd, getstringvalue(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000734 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000735 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000736 return PySocket_Err();
737 if (_PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000738 return NULL;
739 return buf;
740}
741
Guido van Rossum30a685f1991-06-27 15:51:29 +0000742
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000743/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000744
Guido van Rossum73624e91994-10-10 17:59:00 +0000745static PyObject *
746BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000747{
748 char addrbuf[256];
Guido van Rossum73624e91994-10-10 17:59:00 +0000749 PyObject *buf, *addr, *ret;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000750 int addrlen, len, n, flags;
751 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000752 if (!PyArg_Parse(args, "i", &len)) {
753 PyErr_Clear();
754 if (!PyArg_Parse(args, "(ii)", &len, &flags))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000755 return NULL;
756 }
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000757 if (!getsockaddrlen(s, &addrlen))
758 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000759 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000760 if (buf == NULL)
761 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000762 Py_BEGIN_ALLOW_THREADS
763 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000764#ifndef NT
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000765 (ANY *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000766#else
767 (struct sockaddr *)addrbuf, &addrlen);
768#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000769 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000770 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000771 return PySocket_Err();
772 if (_PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000773 return NULL;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000774 addr = makesockaddr((struct sockaddr *)addrbuf, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000775 ret = Py_BuildValue("OO", buf, addr);
776 Py_XDECREF(addr);
777 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000778 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000779}
780
Guido van Rossum30a685f1991-06-27 15:51:29 +0000781
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000782/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000783
Guido van Rossum73624e91994-10-10 17:59:00 +0000784static PyObject *
785BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000786{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000787 char *buf;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000788 int len, n, flags;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000789 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000790 if (!PyArg_Parse(args, "s#", &buf, &len)) {
791 PyErr_Clear();
792 if (!PyArg_Parse(args, "(s#i)", &buf, &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000793 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000794 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000795 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000796 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000797 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +0000798 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000799 return PySocket_Err();
800 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000801}
802
803
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000804/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000805
Guido van Rossum73624e91994-10-10 17:59:00 +0000806static PyObject *
807BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000808{
Guido van Rossum73624e91994-10-10 17:59:00 +0000809 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000810 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000811 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000812 int addrlen, len, n, flags;
813 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000814 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
815 PyErr_Clear();
816 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000817 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000818 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000819 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000820 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000821 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000822 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000823 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000824 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000825 return PySocket_Err();
826 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000827}
828
Guido van Rossum30a685f1991-06-27 15:51:29 +0000829
830/* s.shutdown(how) method */
831
Guido van Rossum73624e91994-10-10 17:59:00 +0000832static PyObject *
833BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000834{
835 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000836 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000837 if (!PyArg_GetInt(args, &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000838 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000839 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000840 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +0000841 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000842 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000843 return PySocket_Err();
844 Py_INCREF(Py_None);
845 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000846}
847
Guido van Rossum30a685f1991-06-27 15:51:29 +0000848
849/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000850
Guido van Rossum73624e91994-10-10 17:59:00 +0000851static PyMethodDef PySocketSock_methods[] = {
852 {"accept", (PyCFunction)PySocketSock_accept},
Guido van Rossumc65a5251994-08-05 13:44:50 +0000853#if 0
Guido van Rossum73624e91994-10-10 17:59:00 +0000854 {"allowbroadcast", (PyCFunction)PySocketSock_allowbroadcast},
Guido van Rossumc65a5251994-08-05 13:44:50 +0000855#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000856#ifndef NT
Guido van Rossum73624e91994-10-10 17:59:00 +0000857 {"setblocking", (PyCFunction)PySocketSock_setblocking},
Guido van Rossume4485b01994-09-07 14:32:49 +0000858#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000859 {"setsockopt", (PyCFunction)PySocketSock_setsockopt},
860 {"getsockopt", (PyCFunction)PySocketSock_getsockopt},
861 {"bind", (PyCFunction)PySocketSock_bind},
862 {"close", (PyCFunction)PySocketSock_close},
863 {"connect", (PyCFunction)PySocketSock_connect},
864 {"fileno", (PyCFunction)PySocketSock_fileno},
865 {"getsockname", (PyCFunction)PySocketSock_getsockname},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000866#ifdef HAVE_GETPEERNAME
Guido van Rossum73624e91994-10-10 17:59:00 +0000867 {"getpeername", (PyCFunction)PySocketSock_getpeername},
Guido van Rossum9575a441993-04-07 14:06:14 +0000868#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000869 {"listen", (PyCFunction)PySocketSock_listen},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000870#ifndef NO_DUP
Guido van Rossum73624e91994-10-10 17:59:00 +0000871 {"makefile", (PyCFunction)PySocketSock_makefile},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000872#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000873 {"recv", (PyCFunction)PySocketSock_recv},
874 {"recvfrom", (PyCFunction)PySocketSock_recvfrom},
875 {"send", (PyCFunction)PySocketSock_send},
876 {"sendto", (PyCFunction)PySocketSock_sendto},
877 {"shutdown", (PyCFunction)PySocketSock_shutdown},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000878 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000879};
880
Guido van Rossum30a685f1991-06-27 15:51:29 +0000881
Guido van Rossum73624e91994-10-10 17:59:00 +0000882/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +0000883 First close the file description. */
884
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000885static void
Guido van Rossum73624e91994-10-10 17:59:00 +0000886BUILD_FUNC_DEF_1(PySocketSock_dealloc, PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000887{
888 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000889 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000890}
891
Guido van Rossum30a685f1991-06-27 15:51:29 +0000892
893/* Return a socket object's named attribute. */
894
Guido van Rossum73624e91994-10-10 17:59:00 +0000895static PyObject *
896BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000897{
Guido van Rossum73624e91994-10-10 17:59:00 +0000898 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000899}
900
Guido van Rossum30a685f1991-06-27 15:51:29 +0000901
Guido van Rossumb6775db1994-08-01 11:34:53 +0000902/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000903
Guido van Rossum73624e91994-10-10 17:59:00 +0000904static PyTypeObject PySocketSock_Type = {
905 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000906 0,
907 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +0000908 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000909 0,
Guido van Rossum73624e91994-10-10 17:59:00 +0000910 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000911 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000912 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000913 0, /*tp_setattr*/
914 0, /*tp_compare*/
915 0, /*tp_repr*/
916 0, /*tp_as_number*/
917 0, /*tp_as_sequence*/
918 0, /*tp_as_mapping*/
919};
920
Guido van Rossum30a685f1991-06-27 15:51:29 +0000921
Guido van Rossum81194471991-07-27 21:42:02 +0000922/* Python interface to gethostname(). */
923
924/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000925static PyObject *
926BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +0000927{
928 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000929 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000930 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +0000931 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000932 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000933 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +0000934 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000935 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000936 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +0000937 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +0000938 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +0000939}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000940
941
Guido van Rossum30a685f1991-06-27 15:51:29 +0000942/* Python interface to gethostbyname(name). */
943
944/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000945static PyObject *
946BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000947{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000948 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000949 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +0000950 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000951 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000952 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000953 return NULL;
954 return makeipaddr(&addrbuf);
955}
956
957
958/* Python interface to getservbyname(name).
959 This only returns the port number, since the other info is already
960 known or not useful (like the list of aliases). */
961
962/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000963static PyObject *
964BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000965{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000966 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000967 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +0000968 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000969 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000970 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000971 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +0000972 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +0000973 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000974 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000975 return NULL;
976 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000977 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000978}
979
980
981/* Python interface to socket(family, type, proto).
982 The third (protocol) argument is optional.
983 Return a new socket object. */
984
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000985/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000986static PyObject *
987BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self,PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000988{
Guido van Rossum73624e91994-10-10 17:59:00 +0000989 PySocketSockObject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +0000990 int fd, family, type, proto;
991 proto = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000992 if (!PyArg_Parse(args, "(ii)", &family, &type)) {
993 PyErr_Clear();
994 if (!PyArg_Parse(args, "(iii)", &family, &type, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000995 return NULL;
996 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000997 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000998 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +0000999 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001000 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001001 return PySocket_Err();
1002 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001003 /* If the object can't be created, don't forget to close the
1004 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001005 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001006 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001007 /* From now on, ignore SIGPIPE and let the error checking
1008 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001009#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001010 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001011#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001012 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001013}
1014
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001015#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001016/* Create a socket object from a numeric file description.
1017 Useful e.g. if stdin is a socket.
1018 Additional arguments as for socket(). */
1019
1020/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001021static PyObject *
1022BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self,PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001023{
Guido van Rossum73624e91994-10-10 17:59:00 +00001024 PySocketSockObject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001025 int fd, family, type, proto;
1026 proto = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001027 if (!PyArg_Parse(args, "(iii)", &fd, &family, &type)) {
1028 PyErr_Clear();
1029 if (!PyArg_Parse(args, "(iiii)", &fd, &family, &type, &proto))
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001030 return NULL;
1031 }
Guido van Rossum5f59d601992-12-14 16:59:51 +00001032 /* Dup the fd so it and the socket can be closed independently */
1033 fd = dup(fd);
1034 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001035 return PySocket_Err();
1036 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001037 /* From now on, ignore SIGPIPE and let the error checking
1038 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001039#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001040 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001041#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001042 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001043}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001044#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001045
Guido van Rossum30a685f1991-06-27 15:51:29 +00001046/* List of functions exported by this module. */
1047
Guido van Rossum73624e91994-10-10 17:59:00 +00001048static PyMethodDef PySocket_methods[] = {
1049 {"gethostbyname", PySocket_gethostbyname},
1050 {"gethostname", PySocket_gethostname},
1051 {"getservbyname", PySocket_getservbyname},
1052 {"socket", PySocket_socket},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001053#ifndef NO_DUP
Guido van Rossum73624e91994-10-10 17:59:00 +00001054 {"fromfd", PySocket_fromfd},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001055#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001056 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001057};
1058
Guido van Rossum30a685f1991-06-27 15:51:29 +00001059
1060/* Convenience routine to export an integer value.
1061 For simplicity, errors (which are unlikely anyway) are ignored. */
1062
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001063static void
Guido van Rossum73624e91994-10-10 17:59:00 +00001064BUILD_FUNC_DEF_3(insint,PyObject *,d,char *,name,int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001065{
Guido van Rossum73624e91994-10-10 17:59:00 +00001066 PyObject *v = PyInt_FromLong((long) value);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001067 if (v == NULL) {
1068 /* Don't bother reporting this error */
Guido van Rossum73624e91994-10-10 17:59:00 +00001069 PyErr_Clear();
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001070 }
1071 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001072 PyDict_SetItemString(d, name, v);
1073 Py_DECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001074 }
1075}
1076
Guido van Rossum30a685f1991-06-27 15:51:29 +00001077
1078/* Initialize this module.
1079 This is called when the first 'import socket' is done,
1080 via a table in config.c, if config.c is compiled with USE_SOCKET
1081 defined. */
1082
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001083void
1084initsocket()
1085{
Guido van Rossum73624e91994-10-10 17:59:00 +00001086 PyObject *m, *d;
1087 m = Py_InitModule("socket", PySocket_methods);
1088 d = PyModule_GetDict(m);
1089 PySocket_Error = PyString_FromString("socket.error");
1090 if (PySocket_Error == NULL ||
1091 PyDict_SetItemString(d, "error", PySocket_Error) != 0)
1092 Py_FatalError("can't define socket.error");
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001093 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001094#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001095 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001096#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001097 insint(d, "SOCK_STREAM", SOCK_STREAM);
1098 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
1099 insint(d, "SOCK_RAW", SOCK_RAW);
1100 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1101 insint(d, "SOCK_RDM", SOCK_RDM);
1102}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001103
1104#ifdef NT
1105BOOL WINAPI DllMain (HANDLE hInst,
1106 ULONG ul_reason_for_call,
1107 LPVOID lpReserved)
1108{
1109 switch (ul_reason_for_call)
1110 {
1111 case DLL_PROCESS_ATTACH:
1112 WSADATA WSAData;
1113 if (WSAStartup(MAKEWORD(2,0), &WSAData)) {
1114 OutputDebugString("Python can't initialize Windows Sockets DLL!");
1115 return FALSE;
1116 }
1117 break;
1118 case DLL_PROCESS_DETACH:
1119 WSACleanup();
1120 break;
1121
1122 }
1123 return TRUE;
1124}
1125#endif /* NT */