blob: 5111b320920d85fdc9714a293d4b0aef926932e6 [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 Rossum81194471991-07-27 21:42:02 +000033- no read/write operations (use send/recv or makefile instead)
Guido van Rossum6574b3e1991-06-25 21:36:08 +000034
Guido van Rossum27e177d1995-03-16 15:43:47 +000035Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000036
Guido van Rossum27e177d1995-03-16 15:43:47 +000037- socket.error: exception raised for socket specific errors
Guido van Rossum30a685f1991-06-27 15:51:29 +000038- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000039- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000040- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
41- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000042- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum27e177d1995-03-16 15:43:47 +000043- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +000044- an Internet socket address is a pair (hostname, port)
45 where hostname can be anything recognized by gethostbyname()
46 (including the dd.dd.dd.dd notation) and port is in host byte order
47- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000048- a UNIX domain socket address is a string specifying the pathname
Guido van Rossum6574b3e1991-06-25 21:36:08 +000049
Guido van Rossum30a685f1991-06-27 15:51:29 +000050Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000051
Guido van Rossum81194471991-07-27 21:42:02 +000052- s.accept() --> new socket object, sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000053- s.bind(sockaddr) --> None
54- s.close() --> None
55- s.connect(sockaddr) --> None
56- s.fileno() --> file descriptor
Guido van Rossumc89705d1992-11-26 08:54:07 +000057- s.getpeername() --> sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000058- s.getsockname() --> sockaddr
59- s.getsockopt(level, optname[, buflen]) --> int or string
60- s.listen(backlog) --> None
Guido van Rossum6b144911995-03-14 15:05:13 +000061- s.makefile([mode[, bufsize]]) --> file object
Guido van Rossum27e177d1995-03-16 15:43:47 +000062- s.recv(buflen [,flags]) --> string
63- s.recvfrom(buflen [,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 Rossum27e177d1995-03-16 15:43:47 +000066- s.setblocking(0 | 1) --> None
67- s.setsockopt(level, optname, value) --> None
68- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000069- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000070
Guido van Rossum6574b3e1991-06-25 21:36:08 +000071*/
72
Guido van Rossum73624e91994-10-10 17:59:00 +000073#include "Python.h"
Guido van Rossum6574b3e1991-06-25 21:36:08 +000074
Guido van Rossumb6775db1994-08-01 11:34:53 +000075#include <sys/types.h>
76#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +000077
Guido van Rossum81194471991-07-27 21:42:02 +000078#include <signal.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000079#ifndef NT
Guido van Rossumb6775db1994-08-01 11:34:53 +000080#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +000081#include <sys/socket.h>
82#include <netinet/in.h>
Guido van Rossume4485b01994-09-07 14:32:49 +000083#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000084#else
85#include <winsock.h>
86#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +000087#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +000088#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +000089#else
90#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +000091#endif
92
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000093#ifndef O_NDELAY
94#define O_NDELAY O_NONBLOCK /* For QNX only? */
95#endif
96
97
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000098/* Here we have some hacks to choose between K&R or ANSI style function
99 definitions. For NT to build this as an extension module (ie, DLL)
100 it must be compiled by the C++ compiler, as it takes the address of
101 a static data item exported from the main Python DLL.
102*/
103#ifdef NT
104/* seem to be a few differences in the API */
105#define close closesocket
106#define NO_DUP /* I wont trust passing a socket to NT's RTL!! */
107#define FORCE_ANSI_FUNC_DEFS
108#endif
109
110#ifdef FORCE_ANSI_FUNC_DEFS
111#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
112fnname( arg1type arg1name )
113
114#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
115fnname( arg1type arg1name, arg2type arg2name )
116
117#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
118fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
119
120#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
121fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
122
123#else /* !FORCE_ANSI_FN_DEFS */
124#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
125fnname( arg1name ) \
126 arg1type arg1name;
127
128#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
129fnname( arg1name, arg2name ) \
130 arg1type arg1name; \
131 arg2type arg2name;
132
133#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
134fnname( arg1name, arg2name, arg3name ) \
135 arg1type arg1name; \
136 arg2type arg2name; \
137 arg3type arg3name;
138
139#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
140fnname( arg1name, arg2name, arg3name, arg4name ) \
141 arg1type arg1name; \
142 arg2type arg2name; \
143 arg3type arg3name; \
144 arg4type arg4name;
145
146#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000147
148/* Global variable holding the exception type for errors detected
149 by this module (but not argument type or memory errors, etc.). */
150
Guido van Rossum73624e91994-10-10 17:59:00 +0000151static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000152
153
154/* Convenience function to raise an error according to errno
155 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000156
Guido van Rossum73624e91994-10-10 17:59:00 +0000157static PyObject *
158PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000159{
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000160#ifdef NT
161 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000162 PyObject *v;
163 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000164 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000165 PyErr_SetObject(PySocket_Error, v);
166 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000167 }
168 return NULL;
169 }
170 else
171#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000172 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000173}
174
Guido van Rossum30a685f1991-06-27 15:51:29 +0000175
176/* The object holding a socket. It holds some extra information,
177 like the address family, which is used to decode socket address
178 arguments properly. */
179
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000180typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000181 PyObject_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000182 int sock_fd; /* Socket file descriptor */
183 int sock_family; /* Address family, e.g., AF_INET */
184 int sock_type; /* Socket type, e.g., SOCK_STREAM */
185 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000186 union sock_addr {
187 struct sockaddr_in in;
188#ifdef AF_UNIX
189 struct sockaddr_un un;
190#endif
191 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000192} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000193
Guido van Rossum30a685f1991-06-27 15:51:29 +0000194
195/* A forward reference to the Socktype type object.
196 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000197 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000198 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000199
Guido van Rossum73624e91994-10-10 17:59:00 +0000200staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000201
Guido van Rossum30a685f1991-06-27 15:51:29 +0000202
203/* Create a new socket object.
204 This just creates the object and initializes it.
205 If the creation fails, return NULL and set an exception (implicit
206 in NEWOBJ()). */
207
Guido van Rossum73624e91994-10-10 17:59:00 +0000208static PySocketSockObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000209BUILD_FUNC_DEF_4(PySocketSock_New,int,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000210{
Guido van Rossum73624e91994-10-10 17:59:00 +0000211 PySocketSockObject *s;
212 s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000213 if (s != NULL) {
214 s->sock_fd = fd;
215 s->sock_family = family;
216 s->sock_type = type;
217 s->sock_proto = proto;
218 }
219 return s;
220}
221
Guido van Rossum30a685f1991-06-27 15:51:29 +0000222
223/* Convert a string specifying a host name or one of a few symbolic
224 names to a numeric IP address. This usually calls gethostbyname()
225 to do the work; the names "" and "<broadcast>" are special.
226 Return the length (should always be 4 bytes), or negative if
227 an error occurred; then an exception is raised. */
228
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000229static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000230BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000231{
232 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000233 int d1, d2, d3, d4;
234 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000235#ifdef HAVE_GETHOSTBYNAME_R
236 struct hostent hp_allocated;
237 char buf[1001];
238 int buf_len = (sizeof buf) - 1;
239 int errnop;
240#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000241
Guido van Rossum30a685f1991-06-27 15:51:29 +0000242 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000243 addr_ret->sin_addr.s_addr = INADDR_ANY;
244 return 4;
245 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000246 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000247 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
248 return 4;
249 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000250 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
251 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
252 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
253 addr_ret->sin_addr.s_addr = htonl(
254 ((long) d1 << 24) | ((long) d2 << 16) |
255 ((long) d3 << 8) | ((long) d4 << 0));
256 return 4;
257 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000258#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum73624e91994-10-10 17:59:00 +0000259 Py_BEGIN_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000260 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum73624e91994-10-10 17:59:00 +0000261 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000262#else /* not HAVE_GETHOSTBYNAME_R */
263 hp = gethostbyname(name);
264#endif /* HAVE_GETHOSTBYNAME_R */
265
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000266 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000267#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000268 /* Let's get real error message to return */
269 extern int h_errno;
270 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
271#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000272 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000273#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000274 return -1;
275 }
276 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
277 return hp->h_length;
278}
279
Guido van Rossum30a685f1991-06-27 15:51:29 +0000280
Guido van Rossum30a685f1991-06-27 15:51:29 +0000281/* Create a string object representing an IP address.
282 This is always a string of the form 'dd.dd.dd.dd' (with variable
283 size numbers). */
284
Guido van Rossum73624e91994-10-10 17:59:00 +0000285static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000286BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000287{
288 long x = ntohl(addr->sin_addr.s_addr);
289 char buf[100];
290 sprintf(buf, "%d.%d.%d.%d",
291 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
292 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000293 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000294}
295
296
297/* Create an object representing the given socket address,
298 suitable for passing it back to bind(), connect() etc.
299 The family field of the sockaddr structure is inspected
300 to determine what kind of address it really is. */
301
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000302/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000303static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000304BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000305{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000306 if (addrlen == 0) {
307 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000308 Py_INCREF(Py_None);
309 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000310 }
311
Guido van Rossum30a685f1991-06-27 15:51:29 +0000312 switch (addr->sa_family) {
313
314 case AF_INET:
315 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000316 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000317 PyObject *addr = makeipaddr(a);
318 PyObject *ret = Py_BuildValue("Oi", addr, ntohs(a->sin_port));
319 Py_XDECREF(addr);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000320 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000321 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000322
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 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000327 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000328 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000329#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000330
331 /* More cases here... */
332
333 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000334 PyErr_SetString(PySocket_Error, "return unknown socket address type");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000335 return NULL;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000336
Guido van Rossum30a685f1991-06-27 15:51:29 +0000337 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000338}
339
Guido van Rossum30a685f1991-06-27 15:51:29 +0000340
341/* Parse a socket address argument according to the socket object's
342 address family. Return 1 if the address was in the proper format,
343 0 of not. The address is returned through addr_ret, its length
344 through len_ret. */
345
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000346static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000347BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000348getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000349{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000350 switch (s->sock_family) {
351
Guido van Rossumb6775db1994-08-01 11:34:53 +0000352#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000353 case AF_UNIX:
354 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000355 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000356 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000357 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000358 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum73624e91994-10-10 17:59:00 +0000359 if (!PyArg_Parse(args, "s#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000360 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000361 if (len > sizeof addr->sun_path) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000362 PyErr_SetString(PySocket_Error, "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000363 return 0;
364 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000365 addr->sun_family = AF_UNIX;
366 memcpy(addr->sun_path, path, len);
367 *addr_ret = (struct sockaddr *) addr;
368 *len_ret = len + sizeof addr->sun_family;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000369 return 1;
370 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000371#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000372
Guido van Rossum30a685f1991-06-27 15:51:29 +0000373 case AF_INET:
374 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000375 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000376 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000377 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000378 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000379 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000380 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000381 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000382 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000383 addr->sin_family = AF_INET;
384 addr->sin_port = htons(port);
385 *addr_ret = (struct sockaddr *) addr;
386 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000387 return 1;
388 }
389
Guido van Rossum30a685f1991-06-27 15:51:29 +0000390 /* More cases here... */
391
392 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000393 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000394 return 0;
395
396 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000397}
398
Guido van Rossum30a685f1991-06-27 15:51:29 +0000399
Guido van Rossum710e1df1992-06-12 10:39:36 +0000400/* Get the address length according to the socket object's address family.
401 Return 1 if the family is known, 0 otherwise. The length is returned
402 through len_ret. */
403
404static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000405BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000406{
407 switch (s->sock_family) {
408
Guido van Rossumb6775db1994-08-01 11:34:53 +0000409#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000410 case AF_UNIX:
411 {
412 *len_ret = sizeof (struct sockaddr_un);
413 return 1;
414 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000415#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000416
417 case AF_INET:
418 {
419 *len_ret = sizeof (struct sockaddr_in);
420 return 1;
421 }
422
423 /* More cases here... */
424
425 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000426 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000427 return 0;
428
429 }
430}
431
432
Guido van Rossum30a685f1991-06-27 15:51:29 +0000433/* s.accept() method */
434
Guido van Rossum73624e91994-10-10 17:59:00 +0000435static PyObject *
436BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000437{
438 char addrbuf[256];
439 int addrlen, newfd;
Guido van Rossum73624e91994-10-10 17:59:00 +0000440 PyObject *sock, *addr, *res;
441 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000442 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000443 if (!getsockaddrlen(s, &addrlen))
444 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000445 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000446 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000447 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000448 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000449 return PySocket_Err();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000450 /* Create the new object with unspecified family,
451 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000452 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000453 s->sock_family,
454 s->sock_type,
455 s->sock_proto);
456 if (sock == NULL)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000457 close(newfd);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000458 addr = makesockaddr((struct sockaddr *) addrbuf, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000459 res = Py_BuildValue("OO", sock, addr);
460 Py_XDECREF(sock);
461 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000462 return res;
463}
464
Guido van Rossum30a685f1991-06-27 15:51:29 +0000465
Guido van Rossumc65a5251994-08-05 13:44:50 +0000466#if 0
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000467/* s.allowbroadcast() method */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000468/* XXX obsolete -- will disappear in next release */
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000469
Guido van Rossum73624e91994-10-10 17:59:00 +0000470static PyObject *
471BUILD_FUNC_DEF_2(PySocketSock_allowbroadcast,PySocketSockObject *,s, PyObject *,args)
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000472{
473 int flag;
474 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000475 if (!PyArg_Parse(args, "i", &flag))
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000476 return NULL;
477 res = setsockopt(s->sock_fd, SOL_SOCKET, SO_BROADCAST,
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000478 (ANY *)&flag, sizeof flag);
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000479 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000480 return PySocket_Err();
481 Py_INCREF(Py_None);
482 return Py_None;
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000483}
Guido van Rossumc65a5251994-08-05 13:44:50 +0000484#endif
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000485
486
Guido van Rossume4485b01994-09-07 14:32:49 +0000487#ifndef NT
488
489/* s.setblocking(1 | 0) method */
490
Guido van Rossum73624e91994-10-10 17:59:00 +0000491static PyObject *
492PySocketSock_setblocking(s, args)
493 PySocketSockObject *s;
494 PyObject *args;
Guido van Rossume4485b01994-09-07 14:32:49 +0000495{
496 int block;
497 int delay_flag;
Guido van Rossum73624e91994-10-10 17:59:00 +0000498 if (!PyArg_GetInt(args, &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000499 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000500 Py_BEGIN_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000501 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
502 if (block)
503 delay_flag &= (~O_NDELAY);
504 else
505 delay_flag |= O_NDELAY;
506 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum73624e91994-10-10 17:59:00 +0000507 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000508
Guido van Rossum73624e91994-10-10 17:59:00 +0000509 Py_INCREF(Py_None);
510 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000511}
512#endif
513
514
Guido van Rossumaee08791992-09-08 09:05:33 +0000515/* s.setsockopt() method.
516 With an integer third argument, sets an integer option.
517 With a string third argument, sets an option from a buffer;
518 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000519
Guido van Rossum73624e91994-10-10 17:59:00 +0000520static PyObject *
521BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000522{
523 int level;
524 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000525 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000526 char *buf;
527 int buflen;
528 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000529
Guido van Rossum73624e91994-10-10 17:59:00 +0000530 if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000531 buf = (char *) &flag;
532 buflen = sizeof flag;
533 }
534 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000535 PyErr_Clear();
536 if (!PyArg_Parse(args, "(iis#)", &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000537 return NULL;
538 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000539 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000540 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000541 return PySocket_Err();
542 Py_INCREF(Py_None);
543 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000544}
545
546
Guido van Rossumaee08791992-09-08 09:05:33 +0000547/* s.getsockopt() method.
548 With two arguments, retrieves an integer option.
549 With a third integer argument, retrieves a string buffer of that size;
550 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000551
Guido van Rossum73624e91994-10-10 17:59:00 +0000552static PyObject *
553BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000554{
555 int level;
556 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000557 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000558 PyObject *buf;
Guido van Rossumaee08791992-09-08 09:05:33 +0000559 int buflen;
560 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000561
Guido van Rossum73624e91994-10-10 17:59:00 +0000562 if (PyArg_Parse(args, "(ii)", &level, &optname)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000563 int flag = 0;
564 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000565 res = getsockopt(s->sock_fd, level, optname,
566 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000567 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000568 return PySocket_Err();
569 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000570 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000571 PyErr_Clear();
572 if (!PyArg_Parse(args, "(iii)", &level, &optname, &buflen))
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000573 return NULL;
Guido van Rossumaee08791992-09-08 09:05:33 +0000574 if (buflen <= 0 || buflen > 1024) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000575 PyErr_SetString(PySocket_Error, "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000576 return NULL;
577 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000578 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000579 if (buf == NULL)
580 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000581 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000582 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000583 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000584 Py_DECREF(buf);
585 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000586 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000587 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000588 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000589}
590
591
Guido van Rossum30a685f1991-06-27 15:51:29 +0000592/* s.bind(sockaddr) method */
593
Guido van Rossum73624e91994-10-10 17:59:00 +0000594static PyObject *
595BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000596{
597 struct sockaddr *addr;
598 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000599 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000600 if (!getsockaddrarg(s, args, &addr, &addrlen))
601 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000602 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000603 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000604 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000605 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000606 return PySocket_Err();
607 Py_INCREF(Py_None);
608 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000609}
610
Guido van Rossum30a685f1991-06-27 15:51:29 +0000611
612/* s.close() method.
613 Set the file descriptor to -1 so operations tried subsequently
614 will surely fail. */
615
Guido van Rossum73624e91994-10-10 17:59:00 +0000616static PyObject *
617BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000618{
Guido van Rossum73624e91994-10-10 17:59:00 +0000619 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000620 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000621 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000622 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000623 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000624 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000625 Py_INCREF(Py_None);
626 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000627}
628
Guido van Rossum30a685f1991-06-27 15:51:29 +0000629
630/* s.connect(sockaddr) method */
631
Guido van Rossum73624e91994-10-10 17:59:00 +0000632static PyObject *
633BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000634{
635 struct sockaddr *addr;
636 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000637 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000638 if (!getsockaddrarg(s, args, &addr, &addrlen))
639 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000640 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000641 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000642 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000643 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000644 return PySocket_Err();
645 Py_INCREF(Py_None);
646 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000647}
648
Guido van Rossum30a685f1991-06-27 15:51:29 +0000649
Guido van Rossumed233a51992-06-23 09:07:03 +0000650/* s.fileno() method */
651
Guido van Rossum73624e91994-10-10 17:59:00 +0000652static PyObject *
653BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000654{
Guido van Rossum73624e91994-10-10 17:59:00 +0000655 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000656 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000657 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000658}
659
660
Guido van Rossumc89705d1992-11-26 08:54:07 +0000661/* s.getsockname() method */
662
Guido van Rossum73624e91994-10-10 17:59:00 +0000663static PyObject *
664BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000665{
666 char addrbuf[256];
667 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000668 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000669 return NULL;
670 if (!getsockaddrlen(s, &addrlen))
671 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000672 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000673 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000674 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000675 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000676 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000677 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
678}
679
680
Guido van Rossumb6775db1994-08-01 11:34:53 +0000681#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000682/* s.getpeername() method */
683
Guido van Rossum73624e91994-10-10 17:59:00 +0000684static PyObject *
685BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000686{
687 char addrbuf[256];
688 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000689 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000690 return NULL;
691 if (!getsockaddrlen(s, &addrlen))
692 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000693 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000694 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000695 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000696 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000697 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000698 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
699}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000700#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000701
702
Guido van Rossum30a685f1991-06-27 15:51:29 +0000703/* s.listen(n) method */
704
Guido van Rossum73624e91994-10-10 17:59:00 +0000705static PyObject *
706BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000707{
708 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000709 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000710 if (!PyArg_GetInt(args, &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000711 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000712 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000713 if (backlog < 1)
714 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000715 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +0000716 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000717 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000718 return PySocket_Err();
719 Py_INCREF(Py_None);
720 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000721}
722
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000723#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +0000724/* s.makefile(mode) method.
725 Create a new open file object referring to a dupped version of
726 the socket's file descriptor. (The dup() call is necessary so
727 that the open file and socket objects may be closed independent
728 of each other.)
729 The mode argument specifies 'r' or 'w' passed to fdopen(). */
730
Guido van Rossum73624e91994-10-10 17:59:00 +0000731static PyObject *
732BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000733{
Guido van Rossuma597dde1995-01-10 20:56:29 +0000734 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +0000735 char *mode = "r";
736 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000737 int fd;
738 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +0000739 PyObject *f;
740
741 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000742 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000743 if ((fd = dup(s->sock_fd)) < 0 ||
Guido van Rossum6b144911995-03-14 15:05:13 +0000744 (fp = fdopen(fd, mode)) == NULL) {
745 if (fd >= 0)
746 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000747 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +0000748 }
749 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
750 if (f != NULL)
751 PyFile_SetBufSize(f, bufsize);
752 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000753}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000754#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000755
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000756/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000757
Guido van Rossum73624e91994-10-10 17:59:00 +0000758static PyObject *
759BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000760{
761 int len, n, flags;
Guido van Rossum73624e91994-10-10 17:59:00 +0000762 PyObject *buf;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000763 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000764 if (!PyArg_Parse(args, "i", &len)) {
765 PyErr_Clear();
766 if (!PyArg_Parse(args, "(ii)", &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000767 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000768 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000769 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000770 if (buf == NULL)
771 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000772 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +0000773 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000774 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000775 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000776 return PySocket_Err();
777 if (_PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000778 return NULL;
779 return buf;
780}
781
Guido van Rossum30a685f1991-06-27 15:51:29 +0000782
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000783/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000784
Guido van Rossum73624e91994-10-10 17:59:00 +0000785static PyObject *
786BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000787{
788 char addrbuf[256];
Guido van Rossum73624e91994-10-10 17:59:00 +0000789 PyObject *buf, *addr, *ret;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000790 int addrlen, len, n, flags;
791 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000792 if (!PyArg_Parse(args, "i", &len)) {
793 PyErr_Clear();
794 if (!PyArg_Parse(args, "(ii)", &len, &flags))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000795 return NULL;
796 }
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000797 if (!getsockaddrlen(s, &addrlen))
798 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000799 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000800 if (buf == NULL)
801 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000802 Py_BEGIN_ALLOW_THREADS
803 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000804#ifndef NT
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000805 (ANY *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000806#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000807 (struct sockaddr *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000808#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000809 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000810 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000811 return PySocket_Err();
812 if (_PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000813 return NULL;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000814 addr = makesockaddr((struct sockaddr *)addrbuf, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000815 ret = Py_BuildValue("OO", buf, addr);
816 Py_XDECREF(addr);
817 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000818 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000819}
820
Guido van Rossum30a685f1991-06-27 15:51:29 +0000821
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000822/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000823
Guido van Rossum73624e91994-10-10 17:59:00 +0000824static PyObject *
825BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000826{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000827 char *buf;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000828 int len, n, flags;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000829 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000830 if (!PyArg_Parse(args, "s#", &buf, &len)) {
831 PyErr_Clear();
832 if (!PyArg_Parse(args, "(s#i)", &buf, &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000833 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000834 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000835 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000836 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000837 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +0000838 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000839 return PySocket_Err();
840 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000841}
842
843
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000844/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000845
Guido van Rossum73624e91994-10-10 17:59:00 +0000846static PyObject *
847BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000848{
Guido van Rossum73624e91994-10-10 17:59:00 +0000849 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000850 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000851 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000852 int addrlen, len, n, flags;
853 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000854 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
855 PyErr_Clear();
856 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000857 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000858 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000859 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000860 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000861 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000862 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000863 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000864 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000865 return PySocket_Err();
866 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000867}
868
Guido van Rossum30a685f1991-06-27 15:51:29 +0000869
870/* s.shutdown(how) method */
871
Guido van Rossum73624e91994-10-10 17:59:00 +0000872static PyObject *
873BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000874{
875 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000876 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000877 if (!PyArg_GetInt(args, &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000878 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000879 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000880 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +0000881 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000882 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000883 return PySocket_Err();
884 Py_INCREF(Py_None);
885 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000886}
887
Guido van Rossum30a685f1991-06-27 15:51:29 +0000888
889/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000890
Guido van Rossum73624e91994-10-10 17:59:00 +0000891static PyMethodDef PySocketSock_methods[] = {
892 {"accept", (PyCFunction)PySocketSock_accept},
Guido van Rossumc65a5251994-08-05 13:44:50 +0000893#if 0
Guido van Rossum73624e91994-10-10 17:59:00 +0000894 {"allowbroadcast", (PyCFunction)PySocketSock_allowbroadcast},
Guido van Rossumc65a5251994-08-05 13:44:50 +0000895#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000896#ifndef NT
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000897 {"setblocking", (PyCFunction)PySocketSock_setblocking},
Guido van Rossume4485b01994-09-07 14:32:49 +0000898#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000899 {"setsockopt", (PyCFunction)PySocketSock_setsockopt},
900 {"getsockopt", (PyCFunction)PySocketSock_getsockopt},
901 {"bind", (PyCFunction)PySocketSock_bind},
902 {"close", (PyCFunction)PySocketSock_close},
903 {"connect", (PyCFunction)PySocketSock_connect},
904 {"fileno", (PyCFunction)PySocketSock_fileno},
905 {"getsockname", (PyCFunction)PySocketSock_getsockname},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000906#ifdef HAVE_GETPEERNAME
Guido van Rossum73624e91994-10-10 17:59:00 +0000907 {"getpeername", (PyCFunction)PySocketSock_getpeername},
Guido van Rossum9575a441993-04-07 14:06:14 +0000908#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000909 {"listen", (PyCFunction)PySocketSock_listen},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000910#ifndef NO_DUP
Guido van Rossum6b144911995-03-14 15:05:13 +0000911 {"makefile", (PyCFunction)PySocketSock_makefile, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000912#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000913 {"recv", (PyCFunction)PySocketSock_recv},
914 {"recvfrom", (PyCFunction)PySocketSock_recvfrom},
915 {"send", (PyCFunction)PySocketSock_send},
916 {"sendto", (PyCFunction)PySocketSock_sendto},
917 {"shutdown", (PyCFunction)PySocketSock_shutdown},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000918 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000919};
920
Guido van Rossum30a685f1991-06-27 15:51:29 +0000921
Guido van Rossum73624e91994-10-10 17:59:00 +0000922/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +0000923 First close the file description. */
924
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000925static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000926BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000927{
928 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000929 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000930}
931
Guido van Rossum30a685f1991-06-27 15:51:29 +0000932
933/* Return a socket object's named attribute. */
934
Guido van Rossum73624e91994-10-10 17:59:00 +0000935static PyObject *
936BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000937{
Guido van Rossum73624e91994-10-10 17:59:00 +0000938 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000939}
940
Guido van Rossum30a685f1991-06-27 15:51:29 +0000941
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000942static PyObject *
943BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
944{
945 PyObject *addro;
946 struct sockaddr *addr;
947 char buf[512];
Guido van Rossuma597dde1995-01-10 20:56:29 +0000948 PyObject *t, *comma, *v;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000949 int i, len;
950 sprintf(buf,
951 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
952 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossuma597dde1995-01-10 20:56:29 +0000953 t = PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000954 return t;
955}
956
957
Guido van Rossumb6775db1994-08-01 11:34:53 +0000958/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000959
Guido van Rossum73624e91994-10-10 17:59:00 +0000960static PyTypeObject PySocketSock_Type = {
961 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000962 0,
963 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +0000964 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000965 0,
Guido van Rossum73624e91994-10-10 17:59:00 +0000966 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000967 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000968 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000969 0, /*tp_setattr*/
970 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000971 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000972 0, /*tp_as_number*/
973 0, /*tp_as_sequence*/
974 0, /*tp_as_mapping*/
975};
976
Guido van Rossum30a685f1991-06-27 15:51:29 +0000977
Guido van Rossum81194471991-07-27 21:42:02 +0000978/* Python interface to gethostname(). */
979
980/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000981static PyObject *
982BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +0000983{
984 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000985 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000986 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +0000987 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000988 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000989 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +0000990 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000991 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000992 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +0000993 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +0000994 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +0000995}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000996
997
Guido van Rossum30a685f1991-06-27 15:51:29 +0000998/* Python interface to gethostbyname(name). */
999
1000/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001001static PyObject *
1002BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001003{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001004 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001005 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +00001006 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001007 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001008 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001009 return NULL;
1010 return makeipaddr(&addrbuf);
1011}
1012
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001013/* Python interface to gethostbyaddr(IP). */
1014
1015/*ARGSUSED*/
1016static PyObject *
1017BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1018{
1019 struct sockaddr_in addr;
1020 char *ip_num;
1021 struct hostent *h;
1022 int d1,d2,d3,d4;
1023 char ch, **pch;
1024 PyObject *rtn_tuple = (PyObject *)NULL;
1025 PyObject *name_list = (PyObject *)NULL;
1026 PyObject *addr_list = (PyObject *)NULL;
1027 PyObject *tmp;
1028
1029 if (!PyArg_Parse(args, "s", &ip_num))
1030 return NULL;
1031 if (setipaddr(ip_num, &addr) < 0)
1032 return NULL;
1033 h = gethostbyaddr((char *)&addr.sin_addr,
1034 sizeof(addr.sin_addr),
1035 AF_INET);
1036 if (h == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +00001037#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001038 /* Let's get real error message to return */
1039 extern int h_errno;
1040 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1041#else
1042 PyErr_SetString(PySocket_Error, "host not found");
1043#endif
1044 return NULL;
1045 }
1046 if ((name_list = PyList_New(0)) == NULL)
1047 goto err;
1048 if ((addr_list = PyList_New(0)) == NULL)
1049 goto err;
1050 for (pch = h->h_aliases; *pch != NULL; pch++) {
1051 tmp = PyString_FromString(*pch);
1052 if (tmp == NULL)
1053 goto err;
1054 PyList_Append(name_list, tmp);
1055 Py_DECREF(tmp);
1056 }
1057 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1058 memcpy((char *) &addr.sin_addr, *pch, h->h_length);
1059 tmp = makeipaddr(&addr);
1060 if (tmp == NULL)
1061 goto err;
1062 PyList_Append(addr_list, tmp);
1063 Py_DECREF(tmp);
1064 }
1065 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1066 err:
1067 Py_XDECREF(name_list);
1068 Py_XDECREF(addr_list);
1069 return rtn_tuple;
1070}
1071
Guido van Rossum30a685f1991-06-27 15:51:29 +00001072
1073/* Python interface to getservbyname(name).
1074 This only returns the port number, since the other info is already
1075 known or not useful (like the list of aliases). */
1076
1077/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001078static PyObject *
1079BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001080{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001081 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001082 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001083 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001084 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001085 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001086 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001087 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001088 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001089 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001090 return NULL;
1091 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001092 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001093}
1094
1095
1096/* Python interface to socket(family, type, proto).
1097 The third (protocol) argument is optional.
1098 Return a new socket object. */
1099
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001100/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001101static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001102BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001103{
Guido van Rossum73624e91994-10-10 17:59:00 +00001104 PySocketSockObject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001105 int fd, family, type, proto;
1106 proto = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001107 if (!PyArg_Parse(args, "(ii)", &family, &type)) {
1108 PyErr_Clear();
1109 if (!PyArg_Parse(args, "(iii)", &family, &type, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001110 return NULL;
1111 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001112 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001113 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001114 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001115 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001116 return PySocket_Err();
1117 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001118 /* If the object can't be created, don't forget to close the
1119 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001120 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001121 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001122 /* From now on, ignore SIGPIPE and let the error checking
1123 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001124#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001125 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001126#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001127 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001128}
1129
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001130#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001131/* Create a socket object from a numeric file description.
1132 Useful e.g. if stdin is a socket.
1133 Additional arguments as for socket(). */
1134
1135/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001136static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001137BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001138{
Guido van Rossum73624e91994-10-10 17:59:00 +00001139 PySocketSockObject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001140 int fd, family, type, proto;
1141 proto = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001142 if (!PyArg_Parse(args, "(iii)", &fd, &family, &type)) {
1143 PyErr_Clear();
1144 if (!PyArg_Parse(args, "(iiii)", &fd, &family, &type, &proto))
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001145 return NULL;
1146 }
Guido van Rossum5f59d601992-12-14 16:59:51 +00001147 /* Dup the fd so it and the socket can be closed independently */
1148 fd = dup(fd);
1149 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001150 return PySocket_Err();
1151 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001152 /* From now on, ignore SIGPIPE and let the error checking
1153 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001154#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001155 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001156#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001157 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001158}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001159#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001160
Guido van Rossum30a685f1991-06-27 15:51:29 +00001161/* List of functions exported by this module. */
1162
Guido van Rossum73624e91994-10-10 17:59:00 +00001163static PyMethodDef PySocket_methods[] = {
1164 {"gethostbyname", PySocket_gethostbyname},
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001165 {"gethostbyaddr", PySocket_gethostbyaddr},
Guido van Rossum73624e91994-10-10 17:59:00 +00001166 {"gethostname", PySocket_gethostname},
1167 {"getservbyname", PySocket_getservbyname},
1168 {"socket", PySocket_socket},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001169#ifndef NO_DUP
Guido van Rossum73624e91994-10-10 17:59:00 +00001170 {"fromfd", PySocket_fromfd},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001171#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001172 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001173};
1174
Guido van Rossum30a685f1991-06-27 15:51:29 +00001175
1176/* Convenience routine to export an integer value.
1177 For simplicity, errors (which are unlikely anyway) are ignored. */
1178
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001179static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001180BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001181{
Guido van Rossum73624e91994-10-10 17:59:00 +00001182 PyObject *v = PyInt_FromLong((long) value);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001183 if (v == NULL) {
1184 /* Don't bother reporting this error */
Guido van Rossum73624e91994-10-10 17:59:00 +00001185 PyErr_Clear();
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001186 }
1187 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001188 PyDict_SetItemString(d, name, v);
1189 Py_DECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001190 }
1191}
1192
Guido van Rossum30a685f1991-06-27 15:51:29 +00001193
1194/* Initialize this module.
1195 This is called when the first 'import socket' is done,
1196 via a table in config.c, if config.c is compiled with USE_SOCKET
1197 defined. */
1198
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001199void
1200initsocket()
1201{
Guido van Rossum73624e91994-10-10 17:59:00 +00001202 PyObject *m, *d;
1203 m = Py_InitModule("socket", PySocket_methods);
1204 d = PyModule_GetDict(m);
1205 PySocket_Error = PyString_FromString("socket.error");
1206 if (PySocket_Error == NULL ||
1207 PyDict_SetItemString(d, "error", PySocket_Error) != 0)
1208 Py_FatalError("can't define socket.error");
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001209 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001210#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001211 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001212#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001213 insint(d, "SOCK_STREAM", SOCK_STREAM);
1214 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
1215 insint(d, "SOCK_RAW", SOCK_RAW);
1216 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1217 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001218
1219#ifdef SO_DEBUG
1220 insint(d, "SO_DEBUG", SO_DEBUG);
1221#endif
1222#ifdef SO_ACCEPTCONN
1223 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
1224#endif
1225#ifdef SO_REUSEADDR
1226 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
1227#endif
1228#ifdef SO_KEEPALIVE
1229 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
1230#endif
1231#ifdef SO_DONTROUTE
1232 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
1233#endif
1234#ifdef SO_BROADCAST
1235 insint(d, "SO_BROADCAST", SO_BROADCAST);
1236#endif
1237#ifdef SO_USELOOPBACK
1238 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
1239#endif
1240#ifdef SO_LINGER
1241 insint(d, "SO_LINGER", SO_LINGER);
1242#endif
1243#ifdef SO_OOBINLINE
1244 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
1245#endif
1246#ifdef SO_REUSEPORT
1247 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
1248#endif
1249
1250#ifdef SO_SNDBUF
1251 insint(d, "SO_SNDBUF", SO_SNDBUF);
1252#endif
1253#ifdef SO_RCVBUF
1254 insint(d, "SO_RCVBUF", SO_RCVBUF);
1255#endif
1256#ifdef SO_SNDLOWAT
1257 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
1258#endif
1259#ifdef SO_RCVLOWAT
1260 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
1261#endif
1262#ifdef SO_SNDTIMEO
1263 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
1264#endif
1265#ifdef SO_RCVTIMEO
1266 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
1267#endif
1268#ifdef SO_ERROR
1269 insint(d, "SO_ERROR", SO_ERROR);
1270#endif
1271#ifdef SO_TYPE
1272 insint(d, "SO_TYPE", SO_TYPE);
1273#endif
1274
1275 /* Maximum number of connections for "listen" */
1276#ifdef SOMAXCONN
1277 insint(d, "SOMAXCONN", SOMAXCONN);
1278#else
1279 insint(d, "SOMAXCONN", 5); /* Common value */
1280#endif
1281
1282 /* Flags for send, recv */
1283#ifdef MSG_OOB
1284 insint(d, "MSG_OOB", MSG_OOB);
1285#endif
1286#ifdef MSG_PEEK
1287 insint(d, "MSG_PEEK", MSG_PEEK);
1288#endif
1289#ifdef MSG_DONTROUTE
1290 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
1291#endif
1292#ifdef MSG_EOR
1293 insint(d, "MSG_EOR", MSG_EOR);
1294#endif
1295#ifdef MSG_TRUNC
1296 insint(d, "MSG_TRUNC", MSG_TRUNC);
1297#endif
1298#ifdef MSG_CTRUNC
1299 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
1300#endif
1301#ifdef MSG_WAITALL
1302 insint(d, "MSG_WAITALL", MSG_WAITALL);
1303#endif
1304#ifdef MSG_BTAG
1305 insint(d, "MSG_BTAG", MSG_BTAG);
1306#endif
1307#ifdef MSG_ETAG
1308 insint(d, "MSG_ETAG", MSG_ETAG);
1309#endif
1310
1311 /* Protocol level and numbers, usable for [gs]etsockopt */
1312#ifdef SOL_SOCKET
1313 insint(d, "SOL_SOCKET", SOL_SOCKET);
1314#endif
1315#ifdef IPPROTO_IP
1316 insint(d, "IPPROTO_IP", IPPROTO_IP);
1317#endif
1318#ifdef IPPROTO_ICMP
1319 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
1320#endif
1321#ifdef IPPROTO_IGMP
1322 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
1323#endif
1324#ifdef IPPROTO_GGP
1325 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
1326#endif
1327#ifdef IPPROTO_TCP
1328 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
1329#endif
1330#ifdef IPPROTO_EGP
1331 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
1332#endif
1333#ifdef IPPROTO_PUP
1334 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
1335#endif
1336#ifdef IPPROTO_UDP
1337 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
1338#endif
1339#ifdef IPPROTO_IDP
1340 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
1341#endif
1342#ifdef IPPROTO_HELLO
1343 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
1344#endif
1345#ifdef IPPROTO_ND
1346 insint(d, "IPPROTO_ND", IPPROTO_ND);
1347#endif
1348#ifdef IPPROTO_TP
1349 insint(d, "IPPROTO_TP", IPPROTO_TP);
1350#endif
1351#ifdef IPPROTO_XTP
1352 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
1353#endif
1354#ifdef IPPROTO_EON
1355 insint(d, "IPPROTO_EON", IPPROTO_EON);
1356#endif
1357#ifdef IPPROTO_BIP
1358 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
1359#endif
1360/**/
1361#ifdef IPPROTO_RAW
1362 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
1363#endif
1364#ifdef IPPROTO_MAX
1365 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
1366#endif
1367
1368 /* Some port configuration */
1369#ifdef IPPORT_RESERVED
1370 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
1371#else
1372 insint(d, "IPPORT_RESERVED", 1024);
1373#endif
1374#ifdef IPPORT_USERRESERVED
1375 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
1376#else
1377 insint(d, "IPPORT_USERRESERVED", 5000);
1378#endif
1379
Guido van Rossum5f05eb41995-02-17 15:11:07 +00001380 /* Some reserved IP v.4 addresses */
1381#ifdef INADDR_ANY
1382 insint(d, "INADDR_ANY", INADDR_ANY);
1383#else
1384 insint(d, "INADDR_ANY", 0x00000000);
1385#endif
1386#ifdef INADDR_BROADCAST
1387 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
1388#else
1389 insint(d, "INADDR_BROADCAST", 0xffffffff);
1390#endif
1391#ifdef INADDR_LOOPBACK
1392 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
1393#else
1394 insint(d, "INADDR_LOOPBACK", 0x7F000001);
1395#endif
1396#ifdef INADDR_UNSPEC_GROUP
1397 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
1398#else
1399 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
1400#endif
1401#ifdef INADDR_ALLHOSTS_GROUP
1402 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
1403#else
1404 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
1405#endif
1406#ifdef INADDR_MAX_LOCAL_GROUP
1407 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
1408#else
1409 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
1410#endif
1411#ifdef INADDR_NONE
1412 insint(d, "INADDR_NONE", INADDR_NONE);
1413#else
1414 insint(d, "INADDR_NONE", 0xffffffff);
1415#endif
1416
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001417 /* IP [gs]etsockopt options */
1418#ifdef IP_OPTIONS
1419 insint(d, "IP_OPTIONS", IP_OPTIONS);
1420#endif
1421#ifdef IP_HDRINCL
1422 insint(d, "IP_HDRINCL", IP_HDRINCL);
1423#endif
1424#ifdef IP_TOS
1425 insint(d, "IP_TOS", IP_TOS);
1426#endif
1427#ifdef IP_TTL
1428 insint(d, "IP_TTL", IP_TTL);
1429#endif
1430#ifdef IP_RECVOPTS
1431 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
1432#endif
1433#ifdef IP_RECVRETOPTS
1434 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
1435#endif
1436#ifdef IP_RECVDSTADDR
1437 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
1438#endif
1439#ifdef IP_RETOPTS
1440 insint(d, "IP_RETOPTS", IP_RETOPTS);
1441#endif
1442#ifdef IP_MULTICAST_IF
1443 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
1444#endif
1445#ifdef IP_MULTICAST_TTL
1446 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
1447#endif
1448#ifdef IP_MULTICAST_LOOP
1449 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
1450#endif
1451#ifdef IP_ADD_MEMBERSHIP
1452 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
1453#endif
1454#ifdef IP_DROP_MEMBERSHIP
1455 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
1456#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001457}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001458
1459#ifdef NT
1460BOOL WINAPI DllMain (HANDLE hInst,
1461 ULONG ul_reason_for_call,
1462 LPVOID lpReserved)
1463{
1464 switch (ul_reason_for_call)
1465 {
1466 case DLL_PROCESS_ATTACH:
1467 WSADATA WSAData;
1468 if (WSAStartup(MAKEWORD(2,0), &WSAData)) {
1469 OutputDebugString("Python can't initialize Windows Sockets DLL!");
1470 return FALSE;
1471 }
1472 break;
1473 case DLL_PROCESS_DETACH:
1474 WSACleanup();
1475 break;
1476
1477 }
1478 return TRUE;
1479}
1480#endif /* NT */