blob: 1830fd6e95d52d1293f1246ef10683079e3d7a94 [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
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 Rossum3bbc62e1995-01-02 19:30:30 +000041- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000042- socket.getservbyname(servername, protocolname) --> port number
43- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum6574b3e1991-06-25 21:36:08 +000044- family and type constants from <socket.h> are accessed as socket.AF_INET etc.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000045- errors are reported as the exception socket.error
46- an Internet socket address is a pair (hostname, port)
47 where hostname can be anything recognized by gethostbyname()
48 (including the dd.dd.dd.dd notation) and port is in host byte order
49- where a hostname is returned, the dd.dd.dd.dd notation is used
50- a UNIX domain socket is a string specifying the pathname
51
Guido van Rossum30a685f1991-06-27 15:51:29 +000052Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000053
Guido van Rossum81194471991-07-27 21:42:02 +000054- s.accept() --> new socket object, sockaddr
Guido van Rossum73624e91994-10-10 17:59:00 +000055- s.setsockopt(level, optname, flag) --> Py_None
Guido van Rossum0e69587d1992-06-05 15:11:30 +000056- s.getsockopt(level, optname) --> flag
Guido van Rossum73624e91994-10-10 17:59:00 +000057- s.bind(sockaddr) --> Py_None
58- s.connect(sockaddr) --> Py_None
Guido van Rossumc89705d1992-11-26 08:54:07 +000059- s.getsockname() --> sockaddr
60- s.getpeername() --> sockaddr
Guido van Rossum73624e91994-10-10 17:59:00 +000061- s.listen(n) --> Py_None
Guido van Rossum6b144911995-03-14 15:05:13 +000062- s.makefile([mode[, bufsize]]) --> file object
Guido van Rossumeb6b33a1993-05-25 09:38:27 +000063- s.recv(nbytes [,flags]) --> string
Guido van Rossum18c9a4f1993-05-25 12:16:29 +000064- s.recvfrom(nbytes [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000065- s.send(string [,flags]) --> nbytes
66- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum73624e91994-10-10 17:59:00 +000067- s.setblocking(1 | 0) --> Py_None
68- s.shutdown(how) --> Py_None
69- s.close() --> Py_None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000070- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000071
Guido van Rossum6574b3e1991-06-25 21:36:08 +000072*/
73
Guido van Rossum73624e91994-10-10 17:59:00 +000074#include "Python.h"
Guido van Rossum6574b3e1991-06-25 21:36:08 +000075
Guido van Rossumb6775db1994-08-01 11:34:53 +000076#include <sys/types.h>
77#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +000078
Guido van Rossum81194471991-07-27 21:42:02 +000079#include <signal.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000080#ifndef NT
Guido van Rossumb6775db1994-08-01 11:34:53 +000081#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +000082#include <sys/socket.h>
83#include <netinet/in.h>
Guido van Rossume4485b01994-09-07 14:32:49 +000084#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000085#else
86#include <winsock.h>
87#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +000088#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +000089#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +000090#else
91#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +000092#endif
93
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000094#ifndef O_NDELAY
95#define O_NDELAY O_NONBLOCK /* For QNX only? */
96#endif
97
98
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000099/* Here we have some hacks to choose between K&R or ANSI style function
100 definitions. For NT to build this as an extension module (ie, DLL)
101 it must be compiled by the C++ compiler, as it takes the address of
102 a static data item exported from the main Python DLL.
103*/
104#ifdef NT
105/* seem to be a few differences in the API */
106#define close closesocket
107#define NO_DUP /* I wont trust passing a socket to NT's RTL!! */
108#define FORCE_ANSI_FUNC_DEFS
109#endif
110
111#ifdef FORCE_ANSI_FUNC_DEFS
112#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
113fnname( arg1type arg1name )
114
115#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
116fnname( arg1type arg1name, arg2type arg2name )
117
118#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
119fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
120
121#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
122fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
123
124#else /* !FORCE_ANSI_FN_DEFS */
125#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
126fnname( arg1name ) \
127 arg1type arg1name;
128
129#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
130fnname( arg1name, arg2name ) \
131 arg1type arg1name; \
132 arg2type arg2name;
133
134#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
135fnname( arg1name, arg2name, arg3name ) \
136 arg1type arg1name; \
137 arg2type arg2name; \
138 arg3type arg3name;
139
140#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
141fnname( arg1name, arg2name, arg3name, arg4name ) \
142 arg1type arg1name; \
143 arg2type arg2name; \
144 arg3type arg3name; \
145 arg4type arg4name;
146
147#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000148
149/* Global variable holding the exception type for errors detected
150 by this module (but not argument type or memory errors, etc.). */
151
Guido van Rossum73624e91994-10-10 17:59:00 +0000152static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000153
154
155/* Convenience function to raise an error according to errno
156 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000157
Guido van Rossum73624e91994-10-10 17:59:00 +0000158static PyObject *
159PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000160{
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000161#ifdef NT
162 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000163 PyObject *v;
164 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000165 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000166 PyErr_SetObject(PySocket_Error, v);
167 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000168 }
169 return NULL;
170 }
171 else
172#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000173 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000174}
175
Guido van Rossum30a685f1991-06-27 15:51:29 +0000176
177/* The object holding a socket. It holds some extra information,
178 like the address family, which is used to decode socket address
179 arguments properly. */
180
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000181typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000182 PyObject_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000183 int sock_fd; /* Socket file descriptor */
184 int sock_family; /* Address family, e.g., AF_INET */
185 int sock_type; /* Socket type, e.g., SOCK_STREAM */
186 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000187 union sock_addr {
188 struct sockaddr_in in;
189#ifdef AF_UNIX
190 struct sockaddr_un un;
191#endif
192 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000193} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000194
Guido van Rossum30a685f1991-06-27 15:51:29 +0000195
196/* A forward reference to the Socktype type object.
197 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000198 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000199 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000200
Guido van Rossum73624e91994-10-10 17:59:00 +0000201staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000202
Guido van Rossum30a685f1991-06-27 15:51:29 +0000203
204/* Create a new socket object.
205 This just creates the object and initializes it.
206 If the creation fails, return NULL and set an exception (implicit
207 in NEWOBJ()). */
208
Guido van Rossum73624e91994-10-10 17:59:00 +0000209static PySocketSockObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000210BUILD_FUNC_DEF_4(PySocketSock_New,int,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000211{
Guido van Rossum73624e91994-10-10 17:59:00 +0000212 PySocketSockObject *s;
213 s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000214 if (s != NULL) {
215 s->sock_fd = fd;
216 s->sock_family = family;
217 s->sock_type = type;
218 s->sock_proto = proto;
219 }
220 return s;
221}
222
Guido van Rossum30a685f1991-06-27 15:51:29 +0000223
224/* Convert a string specifying a host name or one of a few symbolic
225 names to a numeric IP address. This usually calls gethostbyname()
226 to do the work; the names "" and "<broadcast>" are special.
227 Return the length (should always be 4 bytes), or negative if
228 an error occurred; then an exception is raised. */
229
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000230static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000231BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000232{
233 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000234 int d1, d2, d3, d4;
235 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000236#ifdef HAVE_GETHOSTBYNAME_R
237 struct hostent hp_allocated;
238 char buf[1001];
239 int buf_len = (sizeof buf) - 1;
240 int errnop;
241#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000242
Guido van Rossum30a685f1991-06-27 15:51:29 +0000243 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000244 addr_ret->sin_addr.s_addr = INADDR_ANY;
245 return 4;
246 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000247 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000248 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
249 return 4;
250 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000251 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
252 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
253 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
254 addr_ret->sin_addr.s_addr = htonl(
255 ((long) d1 << 24) | ((long) d2 << 16) |
256 ((long) d3 << 8) | ((long) d4 << 0));
257 return 4;
258 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000259#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum73624e91994-10-10 17:59:00 +0000260 Py_BEGIN_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000261 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum73624e91994-10-10 17:59:00 +0000262 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000263#else /* not HAVE_GETHOSTBYNAME_R */
264 hp = gethostbyname(name);
265#endif /* HAVE_GETHOSTBYNAME_R */
266
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000267 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000268#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000269 /* Let's get real error message to return */
270 extern int h_errno;
271 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
272#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000273 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000274#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000275 return -1;
276 }
277 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
278 return hp->h_length;
279}
280
Guido van Rossum30a685f1991-06-27 15:51:29 +0000281
Guido van Rossum30a685f1991-06-27 15:51:29 +0000282/* Create a string object representing an IP address.
283 This is always a string of the form 'dd.dd.dd.dd' (with variable
284 size numbers). */
285
Guido van Rossum73624e91994-10-10 17:59:00 +0000286static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000287BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000288{
289 long x = ntohl(addr->sin_addr.s_addr);
290 char buf[100];
291 sprintf(buf, "%d.%d.%d.%d",
292 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
293 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000294 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000295}
296
297
298/* Create an object representing the given socket address,
299 suitable for passing it back to bind(), connect() etc.
300 The family field of the sockaddr structure is inspected
301 to determine what kind of address it really is. */
302
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000303/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000304static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000305BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000306{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000307 if (addrlen == 0) {
308 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000309 Py_INCREF(Py_None);
310 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000311 }
312
Guido van Rossum30a685f1991-06-27 15:51:29 +0000313 switch (addr->sa_family) {
314
315 case AF_INET:
316 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000317 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000318 PyObject *addr = makeipaddr(a);
319 PyObject *ret = Py_BuildValue("Oi", addr, ntohs(a->sin_port));
320 Py_XDECREF(addr);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000321 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000322 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000323
Guido van Rossumb6775db1994-08-01 11:34:53 +0000324#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000325 case AF_UNIX:
326 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000327 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000328 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000329 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000330#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000331
332 /* More cases here... */
333
334 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000335 PyErr_SetString(PySocket_Error, "return unknown socket address type");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000336 return NULL;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000337
Guido van Rossum30a685f1991-06-27 15:51:29 +0000338 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000339}
340
Guido van Rossum30a685f1991-06-27 15:51:29 +0000341
342/* Parse a socket address argument according to the socket object's
343 address family. Return 1 if the address was in the proper format,
344 0 of not. The address is returned through addr_ret, its length
345 through len_ret. */
346
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000347static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000348BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000349getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000350{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000351 switch (s->sock_family) {
352
Guido van Rossumb6775db1994-08-01 11:34:53 +0000353#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000354 case AF_UNIX:
355 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000356 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000357 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000358 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000359 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum73624e91994-10-10 17:59:00 +0000360 if (!PyArg_Parse(args, "s#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000361 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000362 if (len > sizeof addr->sun_path) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000363 PyErr_SetString(PySocket_Error, "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000364 return 0;
365 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000366 addr->sun_family = AF_UNIX;
367 memcpy(addr->sun_path, path, len);
368 *addr_ret = (struct sockaddr *) addr;
369 *len_ret = len + sizeof addr->sun_family;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000370 return 1;
371 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000372#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000373
Guido van Rossum30a685f1991-06-27 15:51:29 +0000374 case AF_INET:
375 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000376 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000377 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000378 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000379 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000380 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000381 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000382 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000383 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000384 addr->sin_family = AF_INET;
385 addr->sin_port = htons(port);
386 *addr_ret = (struct sockaddr *) addr;
387 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000388 return 1;
389 }
390
Guido van Rossum30a685f1991-06-27 15:51:29 +0000391 /* More cases here... */
392
393 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000394 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000395 return 0;
396
397 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000398}
399
Guido van Rossum30a685f1991-06-27 15:51:29 +0000400
Guido van Rossum710e1df1992-06-12 10:39:36 +0000401/* Get the address length according to the socket object's address family.
402 Return 1 if the family is known, 0 otherwise. The length is returned
403 through len_ret. */
404
405static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000406BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000407{
408 switch (s->sock_family) {
409
Guido van Rossumb6775db1994-08-01 11:34:53 +0000410#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000411 case AF_UNIX:
412 {
413 *len_ret = sizeof (struct sockaddr_un);
414 return 1;
415 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000416#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000417
418 case AF_INET:
419 {
420 *len_ret = sizeof (struct sockaddr_in);
421 return 1;
422 }
423
424 /* More cases here... */
425
426 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000427 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000428 return 0;
429
430 }
431}
432
433
Guido van Rossum30a685f1991-06-27 15:51:29 +0000434/* s.accept() method */
435
Guido van Rossum73624e91994-10-10 17:59:00 +0000436static PyObject *
437BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000438{
439 char addrbuf[256];
440 int addrlen, newfd;
Guido van Rossum73624e91994-10-10 17:59:00 +0000441 PyObject *sock, *addr, *res;
442 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000443 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000444 if (!getsockaddrlen(s, &addrlen))
445 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000446 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000447 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000448 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000449 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000450 return PySocket_Err();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000451 /* Create the new object with unspecified family,
452 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000453 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000454 s->sock_family,
455 s->sock_type,
456 s->sock_proto);
457 if (sock == NULL)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000458 close(newfd);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000459 addr = makesockaddr((struct sockaddr *) addrbuf, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000460 res = Py_BuildValue("OO", sock, addr);
461 Py_XDECREF(sock);
462 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000463 return res;
464}
465
Guido van Rossum30a685f1991-06-27 15:51:29 +0000466
Guido van Rossumc65a5251994-08-05 13:44:50 +0000467#if 0
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000468/* s.allowbroadcast() method */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000469/* XXX obsolete -- will disappear in next release */
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000470
Guido van Rossum73624e91994-10-10 17:59:00 +0000471static PyObject *
472BUILD_FUNC_DEF_2(PySocketSock_allowbroadcast,PySocketSockObject *,s, PyObject *,args)
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000473{
474 int flag;
475 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000476 if (!PyArg_Parse(args, "i", &flag))
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000477 return NULL;
478 res = setsockopt(s->sock_fd, SOL_SOCKET, SO_BROADCAST,
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000479 (ANY *)&flag, sizeof flag);
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000480 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000481 return PySocket_Err();
482 Py_INCREF(Py_None);
483 return Py_None;
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000484}
Guido van Rossumc65a5251994-08-05 13:44:50 +0000485#endif
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000486
487
Guido van Rossume4485b01994-09-07 14:32:49 +0000488#ifndef NT
489
490/* s.setblocking(1 | 0) method */
491
Guido van Rossum73624e91994-10-10 17:59:00 +0000492static PyObject *
493PySocketSock_setblocking(s, args)
494 PySocketSockObject *s;
495 PyObject *args;
Guido van Rossume4485b01994-09-07 14:32:49 +0000496{
497 int block;
498 int delay_flag;
Guido van Rossum73624e91994-10-10 17:59:00 +0000499 if (!PyArg_GetInt(args, &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000500 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000501 Py_BEGIN_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000502 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
503 if (block)
504 delay_flag &= (~O_NDELAY);
505 else
506 delay_flag |= O_NDELAY;
507 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum73624e91994-10-10 17:59:00 +0000508 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000509
Guido van Rossum73624e91994-10-10 17:59:00 +0000510 Py_INCREF(Py_None);
511 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000512}
513#endif
514
515
Guido van Rossumaee08791992-09-08 09:05:33 +0000516/* s.setsockopt() method.
517 With an integer third argument, sets an integer option.
518 With a string third argument, sets an option from a buffer;
519 use optional built-in module 'struct' to encode 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_setsockopt,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 Rossumaee08791992-09-08 09:05:33 +0000527 char *buf;
528 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, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000532 buf = (char *) &flag;
533 buflen = sizeof flag;
534 }
535 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000536 PyErr_Clear();
537 if (!PyArg_Parse(args, "(iis#)", &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000538 return NULL;
539 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000540 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000541 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000542 return PySocket_Err();
543 Py_INCREF(Py_None);
544 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000545}
546
547
Guido van Rossumaee08791992-09-08 09:05:33 +0000548/* s.getsockopt() method.
549 With two arguments, retrieves an integer option.
550 With a third integer argument, retrieves a string buffer of that size;
551 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000552
Guido van Rossum73624e91994-10-10 17:59:00 +0000553static PyObject *
554BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000555{
556 int level;
557 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000558 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000559 PyObject *buf;
Guido van Rossumaee08791992-09-08 09:05:33 +0000560 int buflen;
561 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000562
Guido van Rossum73624e91994-10-10 17:59:00 +0000563 if (PyArg_Parse(args, "(ii)", &level, &optname)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000564 int flag = 0;
565 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000566 res = getsockopt(s->sock_fd, level, optname,
567 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000568 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000569 return PySocket_Err();
570 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000571 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000572 PyErr_Clear();
573 if (!PyArg_Parse(args, "(iii)", &level, &optname, &buflen))
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000574 return NULL;
Guido van Rossumaee08791992-09-08 09:05:33 +0000575 if (buflen <= 0 || buflen > 1024) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000576 PyErr_SetString(PySocket_Error, "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000577 return NULL;
578 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000579 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000580 if (buf == NULL)
581 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000582 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000583 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000584 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000585 Py_DECREF(buf);
586 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000587 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000588 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000589 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000590}
591
592
Guido van Rossum30a685f1991-06-27 15:51:29 +0000593/* s.bind(sockaddr) method */
594
Guido van Rossum73624e91994-10-10 17:59:00 +0000595static PyObject *
596BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000597{
598 struct sockaddr *addr;
599 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000600 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000601 if (!getsockaddrarg(s, args, &addr, &addrlen))
602 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000603 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000604 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000605 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000606 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000607 return PySocket_Err();
608 Py_INCREF(Py_None);
609 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000610}
611
Guido van Rossum30a685f1991-06-27 15:51:29 +0000612
613/* s.close() method.
614 Set the file descriptor to -1 so operations tried subsequently
615 will surely fail. */
616
Guido van Rossum73624e91994-10-10 17:59:00 +0000617static PyObject *
618BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000619{
Guido van Rossum73624e91994-10-10 17:59:00 +0000620 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000621 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000622 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000623 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000624 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000625 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000626 Py_INCREF(Py_None);
627 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000628}
629
Guido van Rossum30a685f1991-06-27 15:51:29 +0000630
631/* s.connect(sockaddr) method */
632
Guido van Rossum73624e91994-10-10 17:59:00 +0000633static PyObject *
634BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000635{
636 struct sockaddr *addr;
637 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000638 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000639 if (!getsockaddrarg(s, args, &addr, &addrlen))
640 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000641 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000642 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000643 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000644 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000645 return PySocket_Err();
646 Py_INCREF(Py_None);
647 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000648}
649
Guido van Rossum30a685f1991-06-27 15:51:29 +0000650
Guido van Rossumed233a51992-06-23 09:07:03 +0000651/* s.fileno() method */
652
Guido van Rossum73624e91994-10-10 17:59:00 +0000653static PyObject *
654BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000655{
Guido van Rossum73624e91994-10-10 17:59:00 +0000656 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000657 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000658 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000659}
660
661
Guido van Rossumc89705d1992-11-26 08:54:07 +0000662/* s.getsockname() method */
663
Guido van Rossum73624e91994-10-10 17:59:00 +0000664static PyObject *
665BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000666{
667 char addrbuf[256];
668 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000669 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000670 return NULL;
671 if (!getsockaddrlen(s, &addrlen))
672 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000673 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000674 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000675 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000676 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000677 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000678 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
679}
680
681
Guido van Rossumb6775db1994-08-01 11:34:53 +0000682#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000683/* s.getpeername() method */
684
Guido van Rossum73624e91994-10-10 17:59:00 +0000685static PyObject *
686BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000687{
688 char addrbuf[256];
689 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000690 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000691 return NULL;
692 if (!getsockaddrlen(s, &addrlen))
693 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000694 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000695 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000696 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000697 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000698 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000699 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
700}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000701#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000702
703
Guido van Rossum30a685f1991-06-27 15:51:29 +0000704/* s.listen(n) method */
705
Guido van Rossum73624e91994-10-10 17:59:00 +0000706static PyObject *
707BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000708{
709 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000710 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000711 if (!PyArg_GetInt(args, &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000712 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000713 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000714 if (backlog < 1)
715 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000716 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +0000717 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000718 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000719 return PySocket_Err();
720 Py_INCREF(Py_None);
721 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000722}
723
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000724#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +0000725/* s.makefile(mode) method.
726 Create a new open file object referring to a dupped version of
727 the socket's file descriptor. (The dup() call is necessary so
728 that the open file and socket objects may be closed independent
729 of each other.)
730 The mode argument specifies 'r' or 'w' passed to fdopen(). */
731
Guido van Rossum73624e91994-10-10 17:59:00 +0000732static PyObject *
733BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000734{
Guido van Rossuma597dde1995-01-10 20:56:29 +0000735 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +0000736 char *mode = "r";
737 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000738 int fd;
739 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +0000740 PyObject *f;
741
742 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000743 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000744 if ((fd = dup(s->sock_fd)) < 0 ||
Guido van Rossum6b144911995-03-14 15:05:13 +0000745 (fp = fdopen(fd, mode)) == NULL) {
746 if (fd >= 0)
747 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000748 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +0000749 }
750 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
751 if (f != NULL)
752 PyFile_SetBufSize(f, bufsize);
753 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000754}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000755#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000756
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000757/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000758
Guido van Rossum73624e91994-10-10 17:59:00 +0000759static PyObject *
760BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000761{
762 int len, n, flags;
Guido van Rossum73624e91994-10-10 17:59:00 +0000763 PyObject *buf;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000764 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000765 if (!PyArg_Parse(args, "i", &len)) {
766 PyErr_Clear();
767 if (!PyArg_Parse(args, "(ii)", &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000768 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000769 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000770 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000771 if (buf == NULL)
772 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000773 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +0000774 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000775 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000776 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000777 return PySocket_Err();
778 if (_PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000779 return NULL;
780 return buf;
781}
782
Guido van Rossum30a685f1991-06-27 15:51:29 +0000783
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000784/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000785
Guido van Rossum73624e91994-10-10 17:59:00 +0000786static PyObject *
787BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000788{
789 char addrbuf[256];
Guido van Rossum73624e91994-10-10 17:59:00 +0000790 PyObject *buf, *addr, *ret;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000791 int addrlen, len, n, flags;
792 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000793 if (!PyArg_Parse(args, "i", &len)) {
794 PyErr_Clear();
795 if (!PyArg_Parse(args, "(ii)", &len, &flags))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000796 return NULL;
797 }
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000798 if (!getsockaddrlen(s, &addrlen))
799 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000800 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000801 if (buf == NULL)
802 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000803 Py_BEGIN_ALLOW_THREADS
804 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000805#ifndef NT
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000806 (ANY *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000807#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000808 (struct sockaddr *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000809#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000810 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000811 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000812 return PySocket_Err();
813 if (_PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000814 return NULL;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000815 addr = makesockaddr((struct sockaddr *)addrbuf, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000816 ret = Py_BuildValue("OO", buf, addr);
817 Py_XDECREF(addr);
818 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000819 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000820}
821
Guido van Rossum30a685f1991-06-27 15:51:29 +0000822
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000823/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000824
Guido van Rossum73624e91994-10-10 17:59:00 +0000825static PyObject *
826BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000827{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000828 char *buf;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000829 int len, n, flags;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000830 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000831 if (!PyArg_Parse(args, "s#", &buf, &len)) {
832 PyErr_Clear();
833 if (!PyArg_Parse(args, "(s#i)", &buf, &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000834 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000835 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000836 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000837 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000838 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +0000839 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000840 return PySocket_Err();
841 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000842}
843
844
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000845/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000846
Guido van Rossum73624e91994-10-10 17:59:00 +0000847static PyObject *
848BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000849{
Guido van Rossum73624e91994-10-10 17:59:00 +0000850 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000851 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000852 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000853 int addrlen, len, n, flags;
854 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000855 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
856 PyErr_Clear();
857 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000858 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000859 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000860 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000861 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000862 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000863 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000864 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000865 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000866 return PySocket_Err();
867 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000868}
869
Guido van Rossum30a685f1991-06-27 15:51:29 +0000870
871/* s.shutdown(how) method */
872
Guido van Rossum73624e91994-10-10 17:59:00 +0000873static PyObject *
874BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000875{
876 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000877 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000878 if (!PyArg_GetInt(args, &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000879 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000880 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000881 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +0000882 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000883 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000884 return PySocket_Err();
885 Py_INCREF(Py_None);
886 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000887}
888
Guido van Rossum30a685f1991-06-27 15:51:29 +0000889
890/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000891
Guido van Rossum73624e91994-10-10 17:59:00 +0000892static PyMethodDef PySocketSock_methods[] = {
893 {"accept", (PyCFunction)PySocketSock_accept},
Guido van Rossumc65a5251994-08-05 13:44:50 +0000894#if 0
Guido van Rossum73624e91994-10-10 17:59:00 +0000895 {"allowbroadcast", (PyCFunction)PySocketSock_allowbroadcast},
Guido van Rossumc65a5251994-08-05 13:44:50 +0000896#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000897#ifndef NT
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000898 {"setblocking", (PyCFunction)PySocketSock_setblocking},
Guido van Rossume4485b01994-09-07 14:32:49 +0000899#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000900 {"setsockopt", (PyCFunction)PySocketSock_setsockopt},
901 {"getsockopt", (PyCFunction)PySocketSock_getsockopt},
902 {"bind", (PyCFunction)PySocketSock_bind},
903 {"close", (PyCFunction)PySocketSock_close},
904 {"connect", (PyCFunction)PySocketSock_connect},
905 {"fileno", (PyCFunction)PySocketSock_fileno},
906 {"getsockname", (PyCFunction)PySocketSock_getsockname},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000907#ifdef HAVE_GETPEERNAME
Guido van Rossum73624e91994-10-10 17:59:00 +0000908 {"getpeername", (PyCFunction)PySocketSock_getpeername},
Guido van Rossum9575a441993-04-07 14:06:14 +0000909#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000910 {"listen", (PyCFunction)PySocketSock_listen},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000911#ifndef NO_DUP
Guido van Rossum6b144911995-03-14 15:05:13 +0000912 {"makefile", (PyCFunction)PySocketSock_makefile, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000913#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000914 {"recv", (PyCFunction)PySocketSock_recv},
915 {"recvfrom", (PyCFunction)PySocketSock_recvfrom},
916 {"send", (PyCFunction)PySocketSock_send},
917 {"sendto", (PyCFunction)PySocketSock_sendto},
918 {"shutdown", (PyCFunction)PySocketSock_shutdown},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000919 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000920};
921
Guido van Rossum30a685f1991-06-27 15:51:29 +0000922
Guido van Rossum73624e91994-10-10 17:59:00 +0000923/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +0000924 First close the file description. */
925
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000926static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000927BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000928{
929 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000930 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000931}
932
Guido van Rossum30a685f1991-06-27 15:51:29 +0000933
934/* Return a socket object's named attribute. */
935
Guido van Rossum73624e91994-10-10 17:59:00 +0000936static PyObject *
937BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000938{
Guido van Rossum73624e91994-10-10 17:59:00 +0000939 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000940}
941
Guido van Rossum30a685f1991-06-27 15:51:29 +0000942
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000943static PyObject *
944BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
945{
946 PyObject *addro;
947 struct sockaddr *addr;
948 char buf[512];
Guido van Rossuma597dde1995-01-10 20:56:29 +0000949 PyObject *t, *comma, *v;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000950 int i, len;
951 sprintf(buf,
952 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
953 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossuma597dde1995-01-10 20:56:29 +0000954 t = PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000955 return t;
956}
957
958
Guido van Rossumb6775db1994-08-01 11:34:53 +0000959/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000960
Guido van Rossum73624e91994-10-10 17:59:00 +0000961static PyTypeObject PySocketSock_Type = {
962 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000963 0,
964 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +0000965 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000966 0,
Guido van Rossum73624e91994-10-10 17:59:00 +0000967 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000968 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000969 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000970 0, /*tp_setattr*/
971 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000972 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000973 0, /*tp_as_number*/
974 0, /*tp_as_sequence*/
975 0, /*tp_as_mapping*/
976};
977
Guido van Rossum30a685f1991-06-27 15:51:29 +0000978
Guido van Rossum81194471991-07-27 21:42:02 +0000979/* Python interface to gethostname(). */
980
981/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000982static PyObject *
983BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +0000984{
985 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000986 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000987 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +0000988 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000989 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000990 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +0000991 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000992 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000993 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +0000994 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +0000995 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +0000996}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000997
998
Guido van Rossum30a685f1991-06-27 15:51:29 +0000999/* Python interface to gethostbyname(name). */
1000
1001/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001002static PyObject *
1003BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001004{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001005 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001006 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +00001007 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001008 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001009 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001010 return NULL;
1011 return makeipaddr(&addrbuf);
1012}
1013
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001014/* Python interface to gethostbyaddr(IP). */
1015
1016/*ARGSUSED*/
1017static PyObject *
1018BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1019{
1020 struct sockaddr_in addr;
1021 char *ip_num;
1022 struct hostent *h;
1023 int d1,d2,d3,d4;
1024 char ch, **pch;
1025 PyObject *rtn_tuple = (PyObject *)NULL;
1026 PyObject *name_list = (PyObject *)NULL;
1027 PyObject *addr_list = (PyObject *)NULL;
1028 PyObject *tmp;
1029
1030 if (!PyArg_Parse(args, "s", &ip_num))
1031 return NULL;
1032 if (setipaddr(ip_num, &addr) < 0)
1033 return NULL;
1034 h = gethostbyaddr((char *)&addr.sin_addr,
1035 sizeof(addr.sin_addr),
1036 AF_INET);
1037 if (h == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +00001038#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001039 /* Let's get real error message to return */
1040 extern int h_errno;
1041 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1042#else
1043 PyErr_SetString(PySocket_Error, "host not found");
1044#endif
1045 return NULL;
1046 }
1047 if ((name_list = PyList_New(0)) == NULL)
1048 goto err;
1049 if ((addr_list = PyList_New(0)) == NULL)
1050 goto err;
1051 for (pch = h->h_aliases; *pch != NULL; pch++) {
1052 tmp = PyString_FromString(*pch);
1053 if (tmp == NULL)
1054 goto err;
1055 PyList_Append(name_list, tmp);
1056 Py_DECREF(tmp);
1057 }
1058 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1059 memcpy((char *) &addr.sin_addr, *pch, h->h_length);
1060 tmp = makeipaddr(&addr);
1061 if (tmp == NULL)
1062 goto err;
1063 PyList_Append(addr_list, tmp);
1064 Py_DECREF(tmp);
1065 }
1066 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1067 err:
1068 Py_XDECREF(name_list);
1069 Py_XDECREF(addr_list);
1070 return rtn_tuple;
1071}
1072
Guido van Rossum30a685f1991-06-27 15:51:29 +00001073
1074/* Python interface to getservbyname(name).
1075 This only returns the port number, since the other info is already
1076 known or not useful (like the list of aliases). */
1077
1078/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001079static PyObject *
1080BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001081{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001082 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001083 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001084 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001085 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001086 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001087 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001088 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001089 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001090 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001091 return NULL;
1092 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001093 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001094}
1095
1096
1097/* Python interface to socket(family, type, proto).
1098 The third (protocol) argument is optional.
1099 Return a new socket object. */
1100
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001101/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001102static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001103BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001104{
Guido van Rossum73624e91994-10-10 17:59:00 +00001105 PySocketSockObject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001106 int fd, family, type, proto;
1107 proto = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001108 if (!PyArg_Parse(args, "(ii)", &family, &type)) {
1109 PyErr_Clear();
1110 if (!PyArg_Parse(args, "(iii)", &family, &type, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001111 return NULL;
1112 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001113 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001114 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001115 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001116 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001117 return PySocket_Err();
1118 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001119 /* If the object can't be created, don't forget to close the
1120 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001121 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001122 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001123 /* From now on, ignore SIGPIPE and let the error checking
1124 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001125#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001126 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001127#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001128 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001129}
1130
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001131#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001132/* Create a socket object from a numeric file description.
1133 Useful e.g. if stdin is a socket.
1134 Additional arguments as for socket(). */
1135
1136/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001137static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001138BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001139{
Guido van Rossum73624e91994-10-10 17:59:00 +00001140 PySocketSockObject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001141 int fd, family, type, proto;
1142 proto = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001143 if (!PyArg_Parse(args, "(iii)", &fd, &family, &type)) {
1144 PyErr_Clear();
1145 if (!PyArg_Parse(args, "(iiii)", &fd, &family, &type, &proto))
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001146 return NULL;
1147 }
Guido van Rossum5f59d601992-12-14 16:59:51 +00001148 /* Dup the fd so it and the socket can be closed independently */
1149 fd = dup(fd);
1150 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001151 return PySocket_Err();
1152 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001153 /* From now on, ignore SIGPIPE and let the error checking
1154 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001155#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001156 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001157#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001158 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001159}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001160#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001161
Guido van Rossum30a685f1991-06-27 15:51:29 +00001162/* List of functions exported by this module. */
1163
Guido van Rossum73624e91994-10-10 17:59:00 +00001164static PyMethodDef PySocket_methods[] = {
1165 {"gethostbyname", PySocket_gethostbyname},
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001166 {"gethostbyaddr", PySocket_gethostbyaddr},
Guido van Rossum73624e91994-10-10 17:59:00 +00001167 {"gethostname", PySocket_gethostname},
1168 {"getservbyname", PySocket_getservbyname},
1169 {"socket", PySocket_socket},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001170#ifndef NO_DUP
Guido van Rossum73624e91994-10-10 17:59:00 +00001171 {"fromfd", PySocket_fromfd},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001172#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001173 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001174};
1175
Guido van Rossum30a685f1991-06-27 15:51:29 +00001176
1177/* Convenience routine to export an integer value.
1178 For simplicity, errors (which are unlikely anyway) are ignored. */
1179
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001180static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001181BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001182{
Guido van Rossum73624e91994-10-10 17:59:00 +00001183 PyObject *v = PyInt_FromLong((long) value);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001184 if (v == NULL) {
1185 /* Don't bother reporting this error */
Guido van Rossum73624e91994-10-10 17:59:00 +00001186 PyErr_Clear();
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001187 }
1188 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001189 PyDict_SetItemString(d, name, v);
1190 Py_DECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001191 }
1192}
1193
Guido van Rossum30a685f1991-06-27 15:51:29 +00001194
1195/* Initialize this module.
1196 This is called when the first 'import socket' is done,
1197 via a table in config.c, if config.c is compiled with USE_SOCKET
1198 defined. */
1199
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001200void
1201initsocket()
1202{
Guido van Rossum73624e91994-10-10 17:59:00 +00001203 PyObject *m, *d;
1204 m = Py_InitModule("socket", PySocket_methods);
1205 d = PyModule_GetDict(m);
1206 PySocket_Error = PyString_FromString("socket.error");
1207 if (PySocket_Error == NULL ||
1208 PyDict_SetItemString(d, "error", PySocket_Error) != 0)
1209 Py_FatalError("can't define socket.error");
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001210 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001211#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001212 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001213#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001214 insint(d, "SOCK_STREAM", SOCK_STREAM);
1215 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
1216 insint(d, "SOCK_RAW", SOCK_RAW);
1217 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1218 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001219
1220#ifdef SO_DEBUG
1221 insint(d, "SO_DEBUG", SO_DEBUG);
1222#endif
1223#ifdef SO_ACCEPTCONN
1224 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
1225#endif
1226#ifdef SO_REUSEADDR
1227 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
1228#endif
1229#ifdef SO_KEEPALIVE
1230 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
1231#endif
1232#ifdef SO_DONTROUTE
1233 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
1234#endif
1235#ifdef SO_BROADCAST
1236 insint(d, "SO_BROADCAST", SO_BROADCAST);
1237#endif
1238#ifdef SO_USELOOPBACK
1239 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
1240#endif
1241#ifdef SO_LINGER
1242 insint(d, "SO_LINGER", SO_LINGER);
1243#endif
1244#ifdef SO_OOBINLINE
1245 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
1246#endif
1247#ifdef SO_REUSEPORT
1248 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
1249#endif
1250
1251#ifdef SO_SNDBUF
1252 insint(d, "SO_SNDBUF", SO_SNDBUF);
1253#endif
1254#ifdef SO_RCVBUF
1255 insint(d, "SO_RCVBUF", SO_RCVBUF);
1256#endif
1257#ifdef SO_SNDLOWAT
1258 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
1259#endif
1260#ifdef SO_RCVLOWAT
1261 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
1262#endif
1263#ifdef SO_SNDTIMEO
1264 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
1265#endif
1266#ifdef SO_RCVTIMEO
1267 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
1268#endif
1269#ifdef SO_ERROR
1270 insint(d, "SO_ERROR", SO_ERROR);
1271#endif
1272#ifdef SO_TYPE
1273 insint(d, "SO_TYPE", SO_TYPE);
1274#endif
1275
1276 /* Maximum number of connections for "listen" */
1277#ifdef SOMAXCONN
1278 insint(d, "SOMAXCONN", SOMAXCONN);
1279#else
1280 insint(d, "SOMAXCONN", 5); /* Common value */
1281#endif
1282
1283 /* Flags for send, recv */
1284#ifdef MSG_OOB
1285 insint(d, "MSG_OOB", MSG_OOB);
1286#endif
1287#ifdef MSG_PEEK
1288 insint(d, "MSG_PEEK", MSG_PEEK);
1289#endif
1290#ifdef MSG_DONTROUTE
1291 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
1292#endif
1293#ifdef MSG_EOR
1294 insint(d, "MSG_EOR", MSG_EOR);
1295#endif
1296#ifdef MSG_TRUNC
1297 insint(d, "MSG_TRUNC", MSG_TRUNC);
1298#endif
1299#ifdef MSG_CTRUNC
1300 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
1301#endif
1302#ifdef MSG_WAITALL
1303 insint(d, "MSG_WAITALL", MSG_WAITALL);
1304#endif
1305#ifdef MSG_BTAG
1306 insint(d, "MSG_BTAG", MSG_BTAG);
1307#endif
1308#ifdef MSG_ETAG
1309 insint(d, "MSG_ETAG", MSG_ETAG);
1310#endif
1311
1312 /* Protocol level and numbers, usable for [gs]etsockopt */
1313#ifdef SOL_SOCKET
1314 insint(d, "SOL_SOCKET", SOL_SOCKET);
1315#endif
1316#ifdef IPPROTO_IP
1317 insint(d, "IPPROTO_IP", IPPROTO_IP);
1318#endif
1319#ifdef IPPROTO_ICMP
1320 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
1321#endif
1322#ifdef IPPROTO_IGMP
1323 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
1324#endif
1325#ifdef IPPROTO_GGP
1326 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
1327#endif
1328#ifdef IPPROTO_TCP
1329 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
1330#endif
1331#ifdef IPPROTO_EGP
1332 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
1333#endif
1334#ifdef IPPROTO_PUP
1335 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
1336#endif
1337#ifdef IPPROTO_UDP
1338 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
1339#endif
1340#ifdef IPPROTO_IDP
1341 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
1342#endif
1343#ifdef IPPROTO_HELLO
1344 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
1345#endif
1346#ifdef IPPROTO_ND
1347 insint(d, "IPPROTO_ND", IPPROTO_ND);
1348#endif
1349#ifdef IPPROTO_TP
1350 insint(d, "IPPROTO_TP", IPPROTO_TP);
1351#endif
1352#ifdef IPPROTO_XTP
1353 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
1354#endif
1355#ifdef IPPROTO_EON
1356 insint(d, "IPPROTO_EON", IPPROTO_EON);
1357#endif
1358#ifdef IPPROTO_BIP
1359 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
1360#endif
1361/**/
1362#ifdef IPPROTO_RAW
1363 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
1364#endif
1365#ifdef IPPROTO_MAX
1366 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
1367#endif
1368
1369 /* Some port configuration */
1370#ifdef IPPORT_RESERVED
1371 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
1372#else
1373 insint(d, "IPPORT_RESERVED", 1024);
1374#endif
1375#ifdef IPPORT_USERRESERVED
1376 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
1377#else
1378 insint(d, "IPPORT_USERRESERVED", 5000);
1379#endif
1380
Guido van Rossum5f05eb41995-02-17 15:11:07 +00001381 /* Some reserved IP v.4 addresses */
1382#ifdef INADDR_ANY
1383 insint(d, "INADDR_ANY", INADDR_ANY);
1384#else
1385 insint(d, "INADDR_ANY", 0x00000000);
1386#endif
1387#ifdef INADDR_BROADCAST
1388 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
1389#else
1390 insint(d, "INADDR_BROADCAST", 0xffffffff);
1391#endif
1392#ifdef INADDR_LOOPBACK
1393 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
1394#else
1395 insint(d, "INADDR_LOOPBACK", 0x7F000001);
1396#endif
1397#ifdef INADDR_UNSPEC_GROUP
1398 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
1399#else
1400 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
1401#endif
1402#ifdef INADDR_ALLHOSTS_GROUP
1403 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
1404#else
1405 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
1406#endif
1407#ifdef INADDR_MAX_LOCAL_GROUP
1408 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
1409#else
1410 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
1411#endif
1412#ifdef INADDR_NONE
1413 insint(d, "INADDR_NONE", INADDR_NONE);
1414#else
1415 insint(d, "INADDR_NONE", 0xffffffff);
1416#endif
1417
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001418 /* IP [gs]etsockopt options */
1419#ifdef IP_OPTIONS
1420 insint(d, "IP_OPTIONS", IP_OPTIONS);
1421#endif
1422#ifdef IP_HDRINCL
1423 insint(d, "IP_HDRINCL", IP_HDRINCL);
1424#endif
1425#ifdef IP_TOS
1426 insint(d, "IP_TOS", IP_TOS);
1427#endif
1428#ifdef IP_TTL
1429 insint(d, "IP_TTL", IP_TTL);
1430#endif
1431#ifdef IP_RECVOPTS
1432 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
1433#endif
1434#ifdef IP_RECVRETOPTS
1435 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
1436#endif
1437#ifdef IP_RECVDSTADDR
1438 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
1439#endif
1440#ifdef IP_RETOPTS
1441 insint(d, "IP_RETOPTS", IP_RETOPTS);
1442#endif
1443#ifdef IP_MULTICAST_IF
1444 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
1445#endif
1446#ifdef IP_MULTICAST_TTL
1447 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
1448#endif
1449#ifdef IP_MULTICAST_LOOP
1450 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
1451#endif
1452#ifdef IP_ADD_MEMBERSHIP
1453 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
1454#endif
1455#ifdef IP_DROP_MEMBERSHIP
1456 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
1457#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001458}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001459
1460#ifdef NT
1461BOOL WINAPI DllMain (HANDLE hInst,
1462 ULONG ul_reason_for_call,
1463 LPVOID lpReserved)
1464{
1465 switch (ul_reason_for_call)
1466 {
1467 case DLL_PROCESS_ATTACH:
1468 WSADATA WSAData;
1469 if (WSAStartup(MAKEWORD(2,0), &WSAData)) {
1470 OutputDebugString("Python can't initialize Windows Sockets DLL!");
1471 return FALSE;
1472 }
1473 break;
1474 case DLL_PROCESS_DETACH:
1475 WSACleanup();
1476 break;
1477
1478 }
1479 return TRUE;
1480}
1481#endif /* NT */