Location | Tool | Test ID | Function | Issue |
---|---|---|---|---|
/builddir/build/BUILD/Python-2.7.3/Modules/socketmodule.c:2853:9 | clang-analyzer | Assigned value is garbage or undefined | ||
/builddir/build/BUILD/Python-2.7.3/Modules/socketmodule.c:2853:9 | clang-analyzer | Assigned value is garbage or undefined | ||
/builddir/build/BUILD/Python-2.7.3/Modules/socketmodule.c:3374:9 | gcc | unused-but-set-variable | socket_gethostbyname_ex | variable 'result' set but not used |
/builddir/build/BUILD/Python-2.7.3/Modules/socketmodule.c:3374:9 | gcc | unused-but-set-variable | socket_gethostbyname_ex | variable 'result' set but not used |
/builddir/build/BUILD/Python-2.7.3/Modules/socketmodule.c:3385:5 | clang-analyzer | Value stored to 'result' is never read | ||
/builddir/build/BUILD/Python-2.7.3/Modules/socketmodule.c:3385:5 | clang-analyzer | Value stored to 'result' is never read | ||
/builddir/build/BUILD/Python-2.7.3/Modules/socketmodule.c:3450:9 | gcc | unused-but-set-variable | socket_gethostbyaddr | variable 'result' set but not used |
/builddir/build/BUILD/Python-2.7.3/Modules/socketmodule.c:3450:9 | gcc | unused-but-set-variable | socket_gethostbyaddr | variable 'result' set but not used |
/builddir/build/BUILD/Python-2.7.3/Modules/socketmodule.c:3482:5 | clang-analyzer | Value stored to 'result' is never read | ||
/builddir/build/BUILD/Python-2.7.3/Modules/socketmodule.c:3482:5 | clang-analyzer | Value stored to 'result' is never read |
1 /* Socket module */
2
3 /*
4
5 This module provides an interface to Berkeley socket IPC.
6
7 Limitations:
8
9 - Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
10 portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported
11 under Linux.
12 - No read/write operations (use sendall/recv or makefile instead).
13 - Additional restrictions apply on some non-Unix platforms (compensated
14 for by socket.py).
15
16 Module interface:
17
18 - socket.error: exception raised for socket specific errors
19 - socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
20 a subclass of socket.error
21 - socket.herror: exception raised for gethostby* errors,
22 a subclass of socket.error
23 - socket.fromfd(fd, family, type[, proto]) --> new socket object (created
24 from an existing file descriptor)
25 - socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
26 - socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
27 - socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
28 - socket.getprotobyname(protocolname) --> protocol number
29 - socket.getservbyname(servicename[, protocolname]) --> port number
30 - socket.getservbyport(portnumber[, protocolname]) --> service name
31 - socket.socket([family[, type [, proto]]]) --> new socket object
32 - socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
33 - socket.ntohs(16 bit value) --> new int object
34 - socket.ntohl(32 bit value) --> new int object
35 - socket.htons(16 bit value) --> new int object
36 - socket.htonl(32 bit value) --> new int object
37 - socket.getaddrinfo(host, port [, family, socktype, proto, flags])
38 --> List of (family, socktype, proto, canonname, sockaddr)
39 - socket.getnameinfo(sockaddr, flags) --> (host, port)
40 - socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
41 - socket.has_ipv6: boolean value indicating if IPv6 is supported
42 - socket.inet_aton(IP address) -> 32-bit packed IP representation
43 - socket.inet_ntoa(packed IP) -> IP address string
44 - socket.getdefaulttimeout() -> None | float
45 - socket.setdefaulttimeout(None | float)
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 address is a string specifying the pathname
51 - an AF_PACKET socket address is a tuple containing a string
52 specifying the ethernet interface and an integer specifying
53 the Ethernet protocol number to be received. For example:
54 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
55 specify packet-type and ha-type/addr.
56 - an AF_TIPC socket address is expressed as
57 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
58 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
59 and scope can be one of:
60 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
61 The meaning of v1, v2 and v3 depends on the value of addr_type:
62 if addr_type is TIPC_ADDR_NAME:
63 v1 is the server type
64 v2 is the port identifier
65 v3 is ignored
66 if addr_type is TIPC_ADDR_NAMESEQ:
67 v1 is the server type
68 v2 is the lower port number
69 v3 is the upper port number
70 if addr_type is TIPC_ADDR_ID:
71 v1 is the node
72 v2 is the ref
73 v3 is ignored
74
75
76 Local naming conventions:
77
78 - names starting with sock_ are socket object methods
79 - names starting with socket_ are module-level functions
80 - names starting with PySocket are exported through socketmodule.h
81
82 */
83
84 #ifdef __APPLE__
85 /*
86 * inet_aton is not available on OSX 10.3, yet we want to use a binary
87 * that was build on 10.4 or later to work on that release, weak linking
88 * comes to the rescue.
89 */
90 # pragma weak inet_aton
91 #endif
92
93 #include "Python.h"
94 #include "structmember.h"
95
96 #undef MAX
97 #define MAX(x, y) ((x) < (y) ? (y) : (x))
98
99 /* Socket object documentation */
100 PyDoc_STRVAR(sock_doc,
101 "socket([family[, type[, proto]]]) -> socket object\n\
102 \n\
103 Open a socket of the given type. The family argument specifies the\n\
104 address family; it defaults to AF_INET. The type argument specifies\n\
105 whether this is a stream (SOCK_STREAM, this is the default)\n\
106 or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
107 specifying the default protocol. Keyword arguments are accepted.\n\
108 \n\
109 A socket object represents one endpoint of a network connection.\n\
110 \n\
111 Methods of socket objects (keyword arguments not allowed):\n\
112 \n\
113 accept() -- accept a connection, returning new socket and client address\n\
114 bind(addr) -- bind the socket to a local address\n\
115 close() -- close the socket\n\
116 connect(addr) -- connect the socket to a remote address\n\
117 connect_ex(addr) -- connect, return an error code instead of an exception\n\
118 dup() -- return a new socket object identical to the current one [*]\n\
119 fileno() -- return underlying file descriptor\n\
120 getpeername() -- return remote address [*]\n\
121 getsockname() -- return local address\n\
122 getsockopt(level, optname[, buflen]) -- get socket options\n\
123 gettimeout() -- return timeout or None\n\
124 listen(n) -- start listening for incoming connections\n\
125 makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\
126 recv(buflen[, flags]) -- receive data\n\
127 recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
128 recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
129 recvfrom_into(buffer[, nbytes, [, flags])\n\
130 -- receive data and sender\'s address (into a buffer)\n\
131 sendall(data[, flags]) -- send all data\n\
132 send(data[, flags]) -- send data, may not send all of it\n\
133 sendto(data[, flags], addr) -- send data to a given address\n\
134 setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
135 setsockopt(level, optname, value) -- set socket options\n\
136 settimeout(None | float) -- set or clear the timeout\n\
137 shutdown(how) -- shut down traffic in one or both directions\n\
138 \n\
139 [*] not available on all platforms!");
140
141 /* XXX This is a terrible mess of platform-dependent preprocessor hacks.
142 I hope some day someone can clean this up please... */
143
144 /* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
145 script doesn't get this right, so we hardcode some platform checks below.
146 On the other hand, not all Linux versions agree, so there the settings
147 computed by the configure script are needed! */
148
149 #ifndef linux
150 # undef HAVE_GETHOSTBYNAME_R_3_ARG
151 # undef HAVE_GETHOSTBYNAME_R_5_ARG
152 # undef HAVE_GETHOSTBYNAME_R_6_ARG
153 #endif
154
155 #ifndef WITH_THREAD
156 # undef HAVE_GETHOSTBYNAME_R
157 #endif
158
159 #ifdef HAVE_GETHOSTBYNAME_R
160 # if defined(_AIX) || defined(__osf__)
161 # define HAVE_GETHOSTBYNAME_R_3_ARG
162 # elif defined(__sun) || defined(__sgi)
163 # define HAVE_GETHOSTBYNAME_R_5_ARG
164 # elif defined(linux)
165 /* Rely on the configure script */
166 # else
167 # undef HAVE_GETHOSTBYNAME_R
168 # endif
169 #endif
170
171 #if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
172 !defined(MS_WINDOWS)
173 # define USE_GETHOSTBYNAME_LOCK
174 #endif
175
176 /* To use __FreeBSD_version */
177 #ifdef HAVE_SYS_PARAM_H
178 #include <sys/param.h>
179 #endif
180 /* On systems on which getaddrinfo() is believed to not be thread-safe,
181 (this includes the getaddrinfo emulation) protect access with a lock. */
182 #if defined(WITH_THREAD) && (defined(__APPLE__) || \
183 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
184 defined(__OpenBSD__) || defined(__NetBSD__) || \
185 defined(__VMS) || !defined(HAVE_GETADDRINFO))
186 #define USE_GETADDRINFO_LOCK
187 #endif
188
189 #ifdef USE_GETADDRINFO_LOCK
190 #define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
191 #define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
192 #else
193 #define ACQUIRE_GETADDRINFO_LOCK
194 #define RELEASE_GETADDRINFO_LOCK
195 #endif
196
197 #if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
198 # include "pythread.h"
199 #endif
200
201 #if defined(PYCC_VACPP)
202 # include <types.h>
203 # include <io.h>
204 # include <sys/ioctl.h>
205 # include <utils.h>
206 # include <ctype.h>
207 #endif
208
209 #if defined(__VMS)
210 # include <ioctl.h>
211 #endif
212
213 #if defined(PYOS_OS2)
214 # define INCL_DOS
215 # define INCL_DOSERRORS
216 # define INCL_NOPMAPI
217 # include <os2.h>
218 #endif
219
220 #if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
221 /* make sure that the reentrant (gethostbyaddr_r etc)
222 functions are declared correctly if compiling with
223 MIPSPro 7.x in ANSI C mode (default) */
224
225 /* XXX Using _SGIAPI is the wrong thing,
226 but I don't know what the right thing is. */
227 #undef _SGIAPI /* to avoid warning */
228 #define _SGIAPI 1
229
230 #undef _XOPEN_SOURCE
231 #include <sys/socket.h>
232 #include <sys/types.h>
233 #include <netinet/in.h>
234 #ifdef _SS_ALIGNSIZE
235 #define HAVE_GETADDRINFO 1
236 #define HAVE_GETNAMEINFO 1
237 #endif
238
239 #define HAVE_INET_PTON
240 #include <netdb.h>
241 #endif
242
243 /* Irix 6.5 fails to define this variable at all. This is needed
244 for both GCC and SGI's compiler. I'd say that the SGI headers
245 are just busted. Same thing for Solaris. */
246 #if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
247 #define INET_ADDRSTRLEN 16
248 #endif
249
250 /* Generic includes */
251 #ifdef HAVE_SYS_TYPES_H
252 #include <sys/types.h>
253 #endif
254
255 /* Generic socket object definitions and includes */
256 #define PySocket_BUILDING_SOCKET
257 #include "socketmodule.h"
258
259 /* Addressing includes */
260
261 #ifndef MS_WINDOWS
262
263 /* Non-MS WINDOWS includes */
264 # include <netdb.h>
265
266 /* Headers needed for inet_ntoa() and inet_addr() */
267 # ifdef __BEOS__
268 # include <net/netdb.h>
269 # elif defined(PYOS_OS2) && defined(PYCC_VACPP)
270 # include <netdb.h>
271 typedef size_t socklen_t;
272 # else
273 # include <arpa/inet.h>
274 # endif
275
276 # ifndef RISCOS
277 # include <fcntl.h>
278 # else
279 # include <sys/ioctl.h>
280 # include <socklib.h>
281 # define NO_DUP
282 int h_errno; /* not used */
283 # define INET_ADDRSTRLEN 16
284 # endif
285
286 #else
287
288 /* MS_WINDOWS includes */
289 # ifdef HAVE_FCNTL_H
290 # include <fcntl.h>
291 # endif
292
293 #endif
294
295 #include <stddef.h>
296
297 #ifndef offsetof
298 # define offsetof(type, member) ((size_t)(&((type *)0)->member))
299 #endif
300
301 #ifndef O_NONBLOCK
302 # define O_NONBLOCK O_NDELAY
303 #endif
304
305 /* include Python's addrinfo.h unless it causes trouble */
306 #if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
307 /* Do not include addinfo.h on some newer IRIX versions.
308 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
309 * for example, but not by 6.5.10.
310 */
311 #elif defined(_MSC_VER) && _MSC_VER>1201
312 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
313 * EAI_* constants are defined in (the already included) ws2tcpip.h.
314 */
315 #else
316 # include "addrinfo.h"
317 #endif
318
319 #ifndef HAVE_INET_PTON
320 #if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
321 int inet_pton(int af, const char *src, void *dst);
322 const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
323 #endif
324 #endif
325
326 #ifdef __APPLE__
327 /* On OS X, getaddrinfo returns no error indication of lookup
328 failure, so we must use the emulation instead of the libinfo
329 implementation. Unfortunately, performing an autoconf test
330 for this bug would require DNS access for the machine performing
331 the configuration, which is not acceptable. Therefore, we
332 determine the bug just by checking for __APPLE__. If this bug
333 gets ever fixed, perhaps checking for sys/version.h would be
334 appropriate, which is 10/0 on the system with the bug. */
335 #ifndef HAVE_GETNAMEINFO
336 /* This bug seems to be fixed in Jaguar. Ths easiest way I could
337 Find to check for Jaguar is that it has getnameinfo(), which
338 older releases don't have */
339 #undef HAVE_GETADDRINFO
340 #endif
341
342 #ifdef HAVE_INET_ATON
343 #define USE_INET_ATON_WEAKLINK
344 #endif
345
346 #endif
347
348 /* I know this is a bad practice, but it is the easiest... */
349 #if !defined(HAVE_GETADDRINFO)
350 /* avoid clashes with the C library definition of the symbol. */
351 #define getaddrinfo fake_getaddrinfo
352 #define gai_strerror fake_gai_strerror
353 #define freeaddrinfo fake_freeaddrinfo
354 #include "getaddrinfo.c"
355 #endif
356 #if !defined(HAVE_GETNAMEINFO)
357 #define getnameinfo fake_getnameinfo
358 #include "getnameinfo.c"
359 #endif
360
361 #if defined(MS_WINDOWS) || defined(__BEOS__)
362 /* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
363 /* seem to be a few differences in the API */
364 #define SOCKETCLOSE closesocket
365 #define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
366 #endif
367
368 #ifdef MS_WIN32
369 #define EAFNOSUPPORT WSAEAFNOSUPPORT
370 #define snprintf _snprintf
371 #endif
372
373 #if defined(PYOS_OS2) && !defined(PYCC_GCC)
374 #define SOCKETCLOSE soclose
375 #define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
376 #endif
377
378 #ifndef SOCKETCLOSE
379 #define SOCKETCLOSE close
380 #endif
381
382 #if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
383 #define USE_BLUETOOTH 1
384 #if defined(__FreeBSD__)
385 #define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
386 #define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
387 #define BTPROTO_HCI BLUETOOTH_PROTO_HCI
388 #define SOL_HCI SOL_HCI_RAW
389 #define HCI_FILTER SO_HCI_RAW_FILTER
390 #define sockaddr_l2 sockaddr_l2cap
391 #define sockaddr_rc sockaddr_rfcomm
392 #define hci_dev hci_node
393 #define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
394 #define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
395 #define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
396 #elif defined(__NetBSD__) || defined(__DragonFly__)
397 #define sockaddr_l2 sockaddr_bt
398 #define sockaddr_rc sockaddr_bt
399 #define sockaddr_hci sockaddr_bt
400 #define sockaddr_sco sockaddr_bt
401 #define SOL_HCI BTPROTO_HCI
402 #define HCI_DATA_DIR SO_HCI_DIRECTION
403 #define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
404 #define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
405 #define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
406 #define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
407 #else
408 #define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
409 #define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
410 #define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
411 #define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
412 #endif
413 #endif
414
415 #ifdef __VMS
416 /* TCP/IP Services for VMS uses a maximum send/recv buffer length */
417 #define SEGMENT_SIZE (32 * 1024 -1)
418 #endif
419
420 #define SAS2SA(x) ((struct sockaddr *)(x))
421
422 /*
423 * Constants for getnameinfo()
424 */
425 #if !defined(NI_MAXHOST)
426 #define NI_MAXHOST 1025
427 #endif
428 #if !defined(NI_MAXSERV)
429 #define NI_MAXSERV 32
430 #endif
431
432 /* XXX There's a problem here: *static* functions are not supposed to have
433 a Py prefix (or use CapitalizedWords). Later... */
434
435 /* Global variable holding the exception type for errors detected
436 by this module (but not argument type or memory errors, etc.). */
437 static PyObject *socket_error;
438 static PyObject *socket_herror;
439 static PyObject *socket_gaierror;
440 static PyObject *socket_timeout;
441
442 #ifdef RISCOS
443 /* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
444 static int taskwindow;
445 #endif
446
447 /* A forward reference to the socket type object.
448 The sock_type variable contains pointers to various functions,
449 some of which call new_sockobject(), which uses sock_type, so
450 there has to be a circular reference. */
451 static PyTypeObject sock_type;
452
453 #if defined(HAVE_POLL_H)
454 #include <poll.h>
455 #elif defined(HAVE_SYS_POLL_H)
456 #include <sys/poll.h>
457 #endif
458
459 #ifdef HAVE_POLL
460 /* Instead of select(), we'll use poll() since poll() works on any fd. */
461 #define IS_SELECTABLE(s) 1
462 /* Can we call select() with this socket without a buffer overrun? */
463 #else
464 /* If there's no timeout left, we don't have to call select, so it's a safe,
465 * little white lie. */
466 #define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.0)
467 #endif
468
469 static PyObject*
470 select_error(void)
471 {
472 PyErr_SetString(socket_error, "unable to select on socket");
473 return NULL;
474 }
475
476 /* Convenience function to raise an error according to errno
477 and return a NULL pointer from a function. */
478
479 static PyObject *
480 set_error(void)
481 {
482 #ifdef MS_WINDOWS
483 int err_no = WSAGetLastError();
484 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
485 recognizes the error codes used by both GetLastError() and
486 WSAGetLastError */
487 if (err_no)
488 return PyErr_SetExcFromWindowsErr(socket_error, err_no);
489 #endif
490
491 #if defined(PYOS_OS2) && !defined(PYCC_GCC)
492 if (sock_errno() != NO_ERROR) {
493 APIRET rc;
494 ULONG msglen;
495 char outbuf[100];
496 int myerrorcode = sock_errno();
497
498 /* Retrieve socket-related error message from MPTN.MSG file */
499 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
500 myerrorcode - SOCBASEERR + 26,
501 "mptn.msg",
502 &msglen);
503 if (rc == NO_ERROR) {
504 PyObject *v;
505
506 /* OS/2 doesn't guarantee a terminator */
507 outbuf[msglen] = '\0';
508 if (strlen(outbuf) > 0) {
509 /* If non-empty msg, trim CRLF */
510 char *lastc = &outbuf[ strlen(outbuf)-1 ];
511 while (lastc > outbuf &&
512 isspace(Py_CHARMASK(*lastc))) {
513 /* Trim trailing whitespace (CRLF) */
514 *lastc-- = '\0';
515 }
516 }
517 v = Py_BuildValue("(is)", myerrorcode, outbuf);
518 if (v != NULL) {
519 PyErr_SetObject(socket_error, v);
520 Py_DECREF(v);
521 }
522 return NULL;
523 }
524 }
525 #endif
526
527 #if defined(RISCOS)
528 if (_inet_error.errnum != NULL) {
529 PyObject *v;
530 v = Py_BuildValue("(is)", errno, _inet_err());
531 if (v != NULL) {
532 PyErr_SetObject(socket_error, v);
533 Py_DECREF(v);
534 }
535 return NULL;
536 }
537 #endif
538
539 return PyErr_SetFromErrno(socket_error);
540 }
541
542
543 static PyObject *
544 set_herror(int h_error)
545 {
546 PyObject *v;
547
548 #ifdef HAVE_HSTRERROR
549 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
550 #else
551 v = Py_BuildValue("(is)", h_error, "host not found");
552 #endif
553 if (v != NULL) {
554 PyErr_SetObject(socket_herror, v);
555 Py_DECREF(v);
556 }
557
558 return NULL;
559 }
560
561
562 static PyObject *
563 set_gaierror(int error)
564 {
565 PyObject *v;
566
567 #ifdef EAI_SYSTEM
568 /* EAI_SYSTEM is not available on Windows XP. */
569 if (error == EAI_SYSTEM)
570 return set_error();
571 #endif
572
573 #ifdef HAVE_GAI_STRERROR
574 v = Py_BuildValue("(is)", error, gai_strerror(error));
575 #else
576 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
577 #endif
578 if (v != NULL) {
579 PyErr_SetObject(socket_gaierror, v);
580 Py_DECREF(v);
581 }
582
583 return NULL;
584 }
585
586 #ifdef __VMS
587 /* Function to send in segments */
588 static int
589 sendsegmented(int sock_fd, char *buf, int len, int flags)
590 {
591 int n = 0;
592 int remaining = len;
593
594 while (remaining > 0) {
595 unsigned int segment;
596
597 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
598 n = send(sock_fd, buf, segment, flags);
599 if (n < 0) {
600 return n;
601 }
602 remaining -= segment;
603 buf += segment;
604 } /* end while */
605
606 return len;
607 }
608 #endif
609
610 /* Function to perform the setting of socket blocking mode
611 internally. block = (1 | 0). */
612 static int
613 internal_setblocking(PySocketSockObject *s, int block)
614 {
615 #ifndef RISCOS
616 #ifndef MS_WINDOWS
617 int delay_flag;
618 #endif
619 #endif
620
621 Py_BEGIN_ALLOW_THREADS
622 #ifdef __BEOS__
623 block = !block;
624 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
625 (void *)(&block), sizeof(int));
626 #else
627 #ifndef RISCOS
628 #ifndef MS_WINDOWS
629 #if defined(PYOS_OS2) && !defined(PYCC_GCC)
630 block = !block;
631 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
632 #elif defined(__VMS)
633 block = !block;
634 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
635 #else /* !PYOS_OS2 && !__VMS */
636 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
637 if (block)
638 delay_flag &= (~O_NONBLOCK);
639 else
640 delay_flag |= O_NONBLOCK;
641 fcntl(s->sock_fd, F_SETFL, delay_flag);
642 #endif /* !PYOS_OS2 */
643 #else /* MS_WINDOWS */
644 block = !block;
645 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
646 #endif /* MS_WINDOWS */
647 #else /* RISCOS */
648 block = !block;
649 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
650 #endif /* RISCOS */
651 #endif /* __BEOS__ */
652 Py_END_ALLOW_THREADS
653
654 /* Since these don't return anything */
655 return 1;
656 }
657
658 /* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
659 The argument writing indicates the direction.
660 This does not raise an exception; we'll let our caller do that
661 after they've reacquired the interpreter lock.
662 Returns 1 on timeout, -1 on error, 0 otherwise. */
663 static int
664 internal_select(PySocketSockObject *s, int writing)
665 {
666 int n;
667
668 /* Nothing to do unless we're in timeout mode (not non-blocking) */
669 if (s->sock_timeout <= 0.0)
670 return 0;
671
672 /* Guard against closed socket */
673 if (s->sock_fd < 0)
674 return 0;
675
676 /* Prefer poll, if available, since you can poll() any fd
677 * which can't be done with select(). */
678 #ifdef HAVE_POLL
679 {
680 struct pollfd pollfd;
681 int timeout;
682
683 pollfd.fd = s->sock_fd;
684 pollfd.events = writing ? POLLOUT : POLLIN;
685
686 /* s->sock_timeout is in seconds, timeout in ms */
687 timeout = (int)(s->sock_timeout * 1000 + 0.5);
688 n = poll(&pollfd, 1, timeout);
689 }
690 #else
691 {
692 /* Construct the arguments to select */
693 fd_set fds;
694 struct timeval tv;
695 tv.tv_sec = (int)s->sock_timeout;
696 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
697 FD_ZERO(&fds);
698 FD_SET(s->sock_fd, &fds);
699
700 /* See if the socket is ready */
701 if (writing)
702 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
703 else
704 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
705 }
706 #endif
707
708 if (n < 0)
709 return -1;
710 if (n == 0)
711 return 1;
712 return 0;
713 }
714
715 /* Initialize a new socket object. */
716
717 static double defaulttimeout = -1.0; /* Default timeout for new sockets */
718
719 PyMODINIT_FUNC
720 init_sockobject(PySocketSockObject *s,
721 SOCKET_T fd, int family, int type, int proto)
722 {
723 #ifdef RISCOS
724 int block = 1;
725 #endif
726 s->sock_fd = fd;
727 s->sock_family = family;
728 s->sock_type = type;
729 s->sock_proto = proto;
730 s->sock_timeout = defaulttimeout;
731
732 s->errorhandler = &set_error;
733
734 if (defaulttimeout >= 0.0)
735 internal_setblocking(s, 0);
736
737 #ifdef RISCOS
738 if (taskwindow)
739 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
740 #endif
741 }
742
743
744 /* Create a new socket object.
745 This just creates the object and initializes it.
746 If the creation fails, return NULL and set an exception (implicit
747 in NEWOBJ()). */
748
749 static PySocketSockObject *
750 new_sockobject(SOCKET_T fd, int family, int type, int proto)
751 {
752 PySocketSockObject *s;
753 s = (PySocketSockObject *)
754 PyType_GenericNew(&sock_type, NULL, NULL);
755 if (s != NULL)
756 init_sockobject(s, fd, family, type, proto);
757 return s;
758 }
759
760
761 /* Lock to allow python interpreter to continue, but only allow one
762 thread to be in gethostbyname or getaddrinfo */
763 #if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
764 PyThread_type_lock netdb_lock;
765 #endif
766
767
768 /* Convert a string specifying a host name or one of a few symbolic
769 names to a numeric IP address. This usually calls gethostbyname()
770 to do the work; the names "" and "<broadcast>" are special.
771 Return the length (IPv4 should be 4 bytes), or negative if
772 an error occurred; then an exception is raised. */
773
774 static int
775 setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
776 {
777 struct addrinfo hints, *res;
778 int error;
779 int d1, d2, d3, d4;
780 char ch;
781
782 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
783 if (name[0] == '\0') {
784 int siz;
785 memset(&hints, 0, sizeof(hints));
786 hints.ai_family = af;
787 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
788 hints.ai_flags = AI_PASSIVE;
789 Py_BEGIN_ALLOW_THREADS
790 ACQUIRE_GETADDRINFO_LOCK
791 error = getaddrinfo(NULL, "0", &hints, &res);
792 Py_END_ALLOW_THREADS
793 /* We assume that those thread-unsafe getaddrinfo() versions
794 *are* safe regarding their return value, ie. that a
795 subsequent call to getaddrinfo() does not destroy the
796 outcome of the first call. */
797 RELEASE_GETADDRINFO_LOCK
798 if (error) {
799 set_gaierror(error);
800 return -1;
801 }
802 switch (res->ai_family) {
803 case AF_INET:
804 siz = 4;
805 break;
806 #ifdef ENABLE_IPV6
807 case AF_INET6:
808 siz = 16;
809 break;
810 #endif
811 default:
812 freeaddrinfo(res);
813 PyErr_SetString(socket_error,
814 "unsupported address family");
815 return -1;
816 }
817 if (res->ai_next) {
818 freeaddrinfo(res);
819 PyErr_SetString(socket_error,
820 "wildcard resolved to multiple address");
821 return -1;
822 }
823 if (res->ai_addrlen < addr_ret_size)
824 addr_ret_size = res->ai_addrlen;
825 memcpy(addr_ret, res->ai_addr, addr_ret_size);
826 freeaddrinfo(res);
827 return siz;
828 }
829 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
830 struct sockaddr_in *sin;
831 if (af != AF_INET && af != AF_UNSPEC) {
832 PyErr_SetString(socket_error,
833 "address family mismatched");
834 return -1;
835 }
836 sin = (struct sockaddr_in *)addr_ret;
837 memset((void *) sin, '\0', sizeof(*sin));
838 sin->sin_family = AF_INET;
839 #ifdef HAVE_SOCKADDR_SA_LEN
840 sin->sin_len = sizeof(*sin);
841 #endif
842 sin->sin_addr.s_addr = INADDR_BROADCAST;
843 return sizeof(sin->sin_addr);
844 }
845 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
846 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
847 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
848 struct sockaddr_in *sin;
849 sin = (struct sockaddr_in *)addr_ret;
850 sin->sin_addr.s_addr = htonl(
851 ((long) d1 << 24) | ((long) d2 << 16) |
852 ((long) d3 << 8) | ((long) d4 << 0));
853 sin->sin_family = AF_INET;
854 #ifdef HAVE_SOCKADDR_SA_LEN
855 sin->sin_len = sizeof(*sin);
856 #endif
857 return 4;
858 }
859 memset(&hints, 0, sizeof(hints));
860 hints.ai_family = af;
861 Py_BEGIN_ALLOW_THREADS
862 ACQUIRE_GETADDRINFO_LOCK
863 error = getaddrinfo(name, NULL, &hints, &res);
864 #if defined(__digital__) && defined(__unix__)
865 if (error == EAI_NONAME && af == AF_UNSPEC) {
866 /* On Tru64 V5.1, numeric-to-addr conversion fails
867 if no address family is given. Assume IPv4 for now.*/
868 hints.ai_family = AF_INET;
869 error = getaddrinfo(name, NULL, &hints, &res);
870 }
871 #endif
872 Py_END_ALLOW_THREADS
873 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
874 if (error) {
875 set_gaierror(error);
876 return -1;
877 }
878 if (res->ai_addrlen < addr_ret_size)
879 addr_ret_size = res->ai_addrlen;
880 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
881 freeaddrinfo(res);
882 switch (addr_ret->sa_family) {
883 case AF_INET:
884 return 4;
885 #ifdef ENABLE_IPV6
886 case AF_INET6:
887 return 16;
888 #endif
889 default:
890 PyErr_SetString(socket_error, "unknown address family");
891 return -1;
892 }
893 }
894
895
896 /* Create a string object representing an IP address.
897 This is always a string of the form 'dd.dd.dd.dd' (with variable
898 size numbers). */
899
900 static PyObject *
901 makeipaddr(struct sockaddr *addr, int addrlen)
902 {
903 char buf[NI_MAXHOST];
904 int error;
905
906 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
907 NI_NUMERICHOST);
908 if (error) {
909 set_gaierror(error);
910 return NULL;
911 }
912 return PyString_FromString(buf);
913 }
914
915
916 #ifdef USE_BLUETOOTH
917 /* Convert a string representation of a Bluetooth address into a numeric
918 address. Returns the length (6), or raises an exception and returns -1 if
919 an error occurred. */
920
921 static int
922 setbdaddr(char *name, bdaddr_t *bdaddr)
923 {
924 unsigned int b0, b1, b2, b3, b4, b5;
925 char ch;
926 int n;
927
928 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
929 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
930 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
931 bdaddr->b[0] = b0;
932 bdaddr->b[1] = b1;
933 bdaddr->b[2] = b2;
934 bdaddr->b[3] = b3;
935 bdaddr->b[4] = b4;
936 bdaddr->b[5] = b5;
937 return 6;
938 } else {
939 PyErr_SetString(socket_error, "bad bluetooth address");
940 return -1;
941 }
942 }
943
944 /* Create a string representation of the Bluetooth address. This is always a
945 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
946 value (zero padded if necessary). */
947
948 static PyObject *
949 makebdaddr(bdaddr_t *bdaddr)
950 {
951 char buf[(6 * 2) + 5 + 1];
952
953 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
954 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
955 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
956 return PyString_FromString(buf);
957 }
958 #endif
959
960
961 /* Create an object representing the given socket address,
962 suitable for passing it back to bind(), connect() etc.
963 The family field of the sockaddr structure is inspected
964 to determine what kind of address it really is. */
965
966 /*ARGSUSED*/
967 static PyObject *
968 makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
969 {
970 if (addrlen == 0) {
971 /* No address -- may be recvfrom() from known socket */
972 Py_INCREF(Py_None);
973 return Py_None;
974 }
975
976 #ifdef __BEOS__
977 /* XXX: BeOS version of accept() doesn't set family correctly */
978 addr->sa_family = AF_INET;
979 #endif
980
981 switch (addr->sa_family) {
982
983 case AF_INET:
984 {
985 struct sockaddr_in *a;
986 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
987 PyObject *ret = NULL;
988 if (addrobj) {
989 a = (struct sockaddr_in *)addr;
990 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
991 Py_DECREF(addrobj);
992 }
993 return ret;
994 }
995
996 #if defined(AF_UNIX)
997 case AF_UNIX:
998 {
999 struct sockaddr_un *a = (struct sockaddr_un *) addr;
1000 #ifdef linux
1001 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1002 addrlen -= offsetof(struct sockaddr_un, sun_path);
1003 return PyString_FromStringAndSize(a->sun_path,
1004 addrlen);
1005 }
1006 else
1007 #endif /* linux */
1008 {
1009 /* regular NULL-terminated string */
1010 return PyString_FromString(a->sun_path);
1011 }
1012 }
1013 #endif /* AF_UNIX */
1014
1015 #if defined(AF_NETLINK)
1016 case AF_NETLINK:
1017 {
1018 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1019 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
1020 }
1021 #endif /* AF_NETLINK */
1022
1023 #ifdef ENABLE_IPV6
1024 case AF_INET6:
1025 {
1026 struct sockaddr_in6 *a;
1027 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1028 PyObject *ret = NULL;
1029 if (addrobj) {
1030 a = (struct sockaddr_in6 *)addr;
1031 ret = Py_BuildValue("OiII",
1032 addrobj,
1033 ntohs(a->sin6_port),
1034 ntohl(a->sin6_flowinfo),
1035 a->sin6_scope_id);
1036 Py_DECREF(addrobj);
1037 }
1038 return ret;
1039 }
1040 #endif
1041
1042 #ifdef USE_BLUETOOTH
1043 case AF_BLUETOOTH:
1044 switch (proto) {
1045
1046 case BTPROTO_L2CAP:
1047 {
1048 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1049 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1050 PyObject *ret = NULL;
1051 if (addrobj) {
1052 ret = Py_BuildValue("Oi",
1053 addrobj,
1054 _BT_L2_MEMB(a, psm));
1055 Py_DECREF(addrobj);
1056 }
1057 return ret;
1058 }
1059
1060 case BTPROTO_RFCOMM:
1061 {
1062 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1063 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1064 PyObject *ret = NULL;
1065 if (addrobj) {
1066 ret = Py_BuildValue("Oi",
1067 addrobj,
1068 _BT_RC_MEMB(a, channel));
1069 Py_DECREF(addrobj);
1070 }
1071 return ret;
1072 }
1073
1074 case BTPROTO_HCI:
1075 {
1076 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
1077 #if defined(__NetBSD__) || defined(__DragonFly__)
1078 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1079 #else
1080 PyObject *ret = NULL;
1081 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1082 return ret;
1083 #endif
1084 }
1085
1086 #if !defined(__FreeBSD__)
1087 case BTPROTO_SCO:
1088 {
1089 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1090 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1091 }
1092 #endif
1093
1094 default:
1095 PyErr_SetString(PyExc_ValueError,
1096 "Unknown Bluetooth protocol");
1097 return NULL;
1098 }
1099 #endif
1100
1101 #if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
1102 case AF_PACKET:
1103 {
1104 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1105 char *ifname = "";
1106 struct ifreq ifr;
1107 /* need to look up interface name give index */
1108 if (a->sll_ifindex) {
1109 ifr.ifr_ifindex = a->sll_ifindex;
1110 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1111 ifname = ifr.ifr_name;
1112 }
1113 return Py_BuildValue("shbhs#",
1114 ifname,
1115 ntohs(a->sll_protocol),
1116 a->sll_pkttype,
1117 a->sll_hatype,
1118 a->sll_addr,
1119 a->sll_halen);
1120 }
1121 #endif
1122
1123 #ifdef HAVE_LINUX_TIPC_H
1124 case AF_TIPC:
1125 {
1126 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1127 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1128 return Py_BuildValue("IIIII",
1129 a->addrtype,
1130 a->addr.nameseq.type,
1131 a->addr.nameseq.lower,
1132 a->addr.nameseq.upper,
1133 a->scope);
1134 } else if (a->addrtype == TIPC_ADDR_NAME) {
1135 return Py_BuildValue("IIIII",
1136 a->addrtype,
1137 a->addr.name.name.type,
1138 a->addr.name.name.instance,
1139 a->addr.name.name.instance,
1140 a->scope);
1141 } else if (a->addrtype == TIPC_ADDR_ID) {
1142 return Py_BuildValue("IIIII",
1143 a->addrtype,
1144 a->addr.id.node,
1145 a->addr.id.ref,
1146 0,
1147 a->scope);
1148 } else {
1149 PyErr_SetString(PyExc_ValueError,
1150 "Invalid address type");
1151 return NULL;
1152 }
1153 }
1154 #endif
1155
1156 /* More cases here... */
1157
1158 default:
1159 /* If we don't know the address family, don't raise an
1160 exception -- return it as a tuple. */
1161 return Py_BuildValue("is#",
1162 addr->sa_family,
1163 addr->sa_data,
1164 sizeof(addr->sa_data));
1165
1166 }
1167 }
1168
1169
1170 /* Parse a socket address argument according to the socket object's
1171 address family. Return 1 if the address was in the proper format,
1172 0 of not. The address is returned through addr_ret, its length
1173 through len_ret. */
1174
1175 static int
1176 getsockaddrarg(PySocketSockObject *s, PyObject *args,
1177 struct sockaddr *addr_ret, int *len_ret)
1178 {
1179 switch (s->sock_family) {
1180
1181 #if defined(AF_UNIX)
1182 case AF_UNIX:
1183 {
1184 struct sockaddr_un* addr;
1185 char *path;
1186 int len;
1187 if (!PyArg_Parse(args, "t#", &path, &len))
1188 return 0;
1189
1190 addr = (struct sockaddr_un*)addr_ret;
1191 #ifdef linux
1192 if (len > 0 && path[0] == 0) {
1193 /* Linux abstract namespace extension */
1194 if (len > sizeof addr->sun_path) {
1195 PyErr_SetString(socket_error,
1196 "AF_UNIX path too long");
1197 return 0;
1198 }
1199 }
1200 else
1201 #endif /* linux */
1202 {
1203 /* regular NULL-terminated string */
1204 if (len >= sizeof addr->sun_path) {
1205 PyErr_SetString(socket_error,
1206 "AF_UNIX path too long");
1207 return 0;
1208 }
1209 addr->sun_path[len] = 0;
1210 }
1211 addr->sun_family = s->sock_family;
1212 memcpy(addr->sun_path, path, len);
1213 #if defined(PYOS_OS2)
1214 *len_ret = sizeof(*addr);
1215 #else
1216 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
1217 #endif
1218 return 1;
1219 }
1220 #endif /* AF_UNIX */
1221
1222 #if defined(AF_NETLINK)
1223 case AF_NETLINK:
1224 {
1225 struct sockaddr_nl* addr;
1226 int pid, groups;
1227 addr = (struct sockaddr_nl *)addr_ret;
1228 if (!PyTuple_Check(args)) {
1229 PyErr_Format(
1230 PyExc_TypeError,
1231 "getsockaddrarg: "
1232 "AF_NETLINK address must be tuple, not %.500s",
1233 Py_TYPE(args)->tp_name);
1234 return 0;
1235 }
1236 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1237 return 0;
1238 addr->nl_family = AF_NETLINK;
1239 addr->nl_pid = pid;
1240 addr->nl_groups = groups;
1241 *len_ret = sizeof(*addr);
1242 return 1;
1243 }
1244 #endif
1245
1246 case AF_INET:
1247 {
1248 struct sockaddr_in* addr;
1249 char *host;
1250 int port, result;
1251 if (!PyTuple_Check(args)) {
1252 PyErr_Format(
1253 PyExc_TypeError,
1254 "getsockaddrarg: "
1255 "AF_INET address must be tuple, not %.500s",
1256 Py_TYPE(args)->tp_name);
1257 return 0;
1258 }
1259 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1260 "idna", &host, &port))
1261 return 0;
1262 addr=(struct sockaddr_in*)addr_ret;
1263 result = setipaddr(host, (struct sockaddr *)addr,
1264 sizeof(*addr), AF_INET);
1265 PyMem_Free(host);
1266 if (result < 0)
1267 return 0;
1268 if (port < 0 || port > 0xffff) {
1269 PyErr_SetString(
1270 PyExc_OverflowError,
1271 "getsockaddrarg: port must be 0-65535.");
1272 return 0;
1273 }
1274 addr->sin_family = AF_INET;
1275 addr->sin_port = htons((short)port);
1276 *len_ret = sizeof *addr;
1277 return 1;
1278 }
1279
1280 #ifdef ENABLE_IPV6
1281 case AF_INET6:
1282 {
1283 struct sockaddr_in6* addr;
1284 char *host;
1285 int port, result;
1286 unsigned int flowinfo, scope_id;
1287 flowinfo = scope_id = 0;
1288 if (!PyTuple_Check(args)) {
1289 PyErr_Format(
1290 PyExc_TypeError,
1291 "getsockaddrarg: "
1292 "AF_INET6 address must be tuple, not %.500s",
1293 Py_TYPE(args)->tp_name);
1294 return 0;
1295 }
1296 if (!PyArg_ParseTuple(args, "eti|II",
1297 "idna", &host, &port, &flowinfo,
1298 &scope_id)) {
1299 return 0;
1300 }
1301 addr = (struct sockaddr_in6*)addr_ret;
1302 result = setipaddr(host, (struct sockaddr *)addr,
1303 sizeof(*addr), AF_INET6);
1304 PyMem_Free(host);
1305 if (result < 0)
1306 return 0;
1307 if (port < 0 || port > 0xffff) {
1308 PyErr_SetString(
1309 PyExc_OverflowError,
1310 "getsockaddrarg: port must be 0-65535.");
1311 return 0;
1312 }
1313 if (flowinfo < 0 || flowinfo > 0xfffff) {
1314 PyErr_SetString(
1315 PyExc_OverflowError,
1316 "getsockaddrarg: flowinfo must be 0-1048575.");
1317 return 0;
1318 }
1319 addr->sin6_family = s->sock_family;
1320 addr->sin6_port = htons((short)port);
1321 addr->sin6_flowinfo = htonl(flowinfo);
1322 addr->sin6_scope_id = scope_id;
1323 *len_ret = sizeof *addr;
1324 return 1;
1325 }
1326 #endif
1327
1328 #ifdef USE_BLUETOOTH
1329 case AF_BLUETOOTH:
1330 {
1331 switch (s->sock_proto) {
1332 case BTPROTO_L2CAP:
1333 {
1334 struct sockaddr_l2 *addr;
1335 char *straddr;
1336
1337 addr = (struct sockaddr_l2 *)addr_ret;
1338 memset(addr, 0, sizeof(struct sockaddr_l2));
1339 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1340 if (!PyArg_ParseTuple(args, "si", &straddr,
1341 &_BT_L2_MEMB(addr, psm))) {
1342 PyErr_SetString(socket_error, "getsockaddrarg: "
1343 "wrong format");
1344 return 0;
1345 }
1346 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1347 return 0;
1348
1349 *len_ret = sizeof *addr;
1350 return 1;
1351 }
1352 case BTPROTO_RFCOMM:
1353 {
1354 struct sockaddr_rc *addr;
1355 char *straddr;
1356
1357 addr = (struct sockaddr_rc *)addr_ret;
1358 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1359 if (!PyArg_ParseTuple(args, "si", &straddr,
1360 &_BT_RC_MEMB(addr, channel))) {
1361 PyErr_SetString(socket_error, "getsockaddrarg: "
1362 "wrong format");
1363 return 0;
1364 }
1365 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1366 return 0;
1367
1368 *len_ret = sizeof *addr;
1369 return 1;
1370 }
1371 case BTPROTO_HCI:
1372 {
1373 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
1374 #if defined(__NetBSD__) || defined(__DragonFly__)
1375 char *straddr = PyBytes_AS_STRING(args);
1376
1377 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1378 if (straddr == NULL) {
1379 PyErr_SetString(socket_error, "getsockaddrarg: "
1380 "wrong format");
1381 return 0;
1382 }
1383 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1384 return 0;
1385 #else
1386 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1387 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
1388 PyErr_SetString(socket_error, "getsockaddrarg: "
1389 "wrong format");
1390 return 0;
1391 }
1392 #endif
1393 *len_ret = sizeof *addr;
1394 return 1;
1395 }
1396 #if !defined(__FreeBSD__)
1397 case BTPROTO_SCO:
1398 {
1399 struct sockaddr_sco *addr;
1400 char *straddr;
1401
1402 addr = (struct sockaddr_sco *)addr_ret;
1403 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1404 straddr = PyString_AsString(args);
1405 if (straddr == NULL) {
1406 PyErr_SetString(socket_error, "getsockaddrarg: "
1407 "wrong format");
1408 return 0;
1409 }
1410 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1411 return 0;
1412
1413 *len_ret = sizeof *addr;
1414 return 1;
1415 }
1416 #endif
1417 default:
1418 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1419 return 0;
1420 }
1421 }
1422 #endif
1423
1424 #if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
1425 case AF_PACKET:
1426 {
1427 struct sockaddr_ll* addr;
1428 struct ifreq ifr;
1429 char *interfaceName;
1430 int protoNumber;
1431 int hatype = 0;
1432 int pkttype = 0;
1433 char *haddr = NULL;
1434 unsigned int halen = 0;
1435
1436 if (!PyTuple_Check(args)) {
1437 PyErr_Format(
1438 PyExc_TypeError,
1439 "getsockaddrarg: "
1440 "AF_PACKET address must be tuple, not %.500s",
1441 Py_TYPE(args)->tp_name);
1442 return 0;
1443 }
1444 if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,
1445 &protoNumber, &pkttype, &hatype,
1446 &haddr, &halen))
1447 return 0;
1448 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1449 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1450 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1451 s->errorhandler();
1452 return 0;
1453 }
1454 if (halen > 8) {
1455 PyErr_SetString(PyExc_ValueError,
1456 "Hardware address must be 8 bytes or less");
1457 return 0;
1458 }
1459 if (protoNumber < 0 || protoNumber > 0xffff) {
1460 PyErr_SetString(
1461 PyExc_OverflowError,
1462 "getsockaddrarg: protoNumber must be 0-65535.");
1463 return 0;
1464 }
1465 addr = (struct sockaddr_ll*)addr_ret;
1466 addr->sll_family = AF_PACKET;
1467 addr->sll_protocol = htons((short)protoNumber);
1468 addr->sll_ifindex = ifr.ifr_ifindex;
1469 addr->sll_pkttype = pkttype;
1470 addr->sll_hatype = hatype;
1471 if (halen != 0) {
1472 memcpy(&addr->sll_addr, haddr, halen);
1473 }
1474 addr->sll_halen = halen;
1475 *len_ret = sizeof *addr;
1476 return 1;
1477 }
1478 #endif
1479
1480 #ifdef HAVE_LINUX_TIPC_H
1481 case AF_TIPC:
1482 {
1483 unsigned int atype, v1, v2, v3;
1484 unsigned int scope = TIPC_CLUSTER_SCOPE;
1485 struct sockaddr_tipc *addr;
1486
1487 if (!PyTuple_Check(args)) {
1488 PyErr_Format(
1489 PyExc_TypeError,
1490 "getsockaddrarg: "
1491 "AF_TIPC address must be tuple, not %.500s",
1492 Py_TYPE(args)->tp_name);
1493 return 0;
1494 }
1495
1496 if (!PyArg_ParseTuple(args,
1497 "IIII|I;Invalid TIPC address format",
1498 &atype, &v1, &v2, &v3, &scope))
1499 return 0;
1500
1501 addr = (struct sockaddr_tipc *) addr_ret;
1502 memset(addr, 0, sizeof(struct sockaddr_tipc));
1503
1504 addr->family = AF_TIPC;
1505 addr->scope = scope;
1506 addr->addrtype = atype;
1507
1508 if (atype == TIPC_ADDR_NAMESEQ) {
1509 addr->addr.nameseq.type = v1;
1510 addr->addr.nameseq.lower = v2;
1511 addr->addr.nameseq.upper = v3;
1512 } else if (atype == TIPC_ADDR_NAME) {
1513 addr->addr.name.name.type = v1;
1514 addr->addr.name.name.instance = v2;
1515 } else if (atype == TIPC_ADDR_ID) {
1516 addr->addr.id.node = v1;
1517 addr->addr.id.ref = v2;
1518 } else {
1519 /* Shouldn't happen */
1520 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1521 return 0;
1522 }
1523
1524 *len_ret = sizeof(*addr);
1525
1526 return 1;
1527 }
1528 #endif
1529
1530 /* More cases here... */
1531
1532 default:
1533 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
1534 return 0;
1535
1536 }
1537 }
1538
1539
1540 /* Get the address length according to the socket object's address family.
1541 Return 1 if the family is known, 0 otherwise. The length is returned
1542 through len_ret. */
1543
1544 static int
1545 getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
1546 {
1547 switch (s->sock_family) {
1548
1549 #if defined(AF_UNIX)
1550 case AF_UNIX:
1551 {
1552 *len_ret = sizeof (struct sockaddr_un);
1553 return 1;
1554 }
1555 #endif /* AF_UNIX */
1556 #if defined(AF_NETLINK)
1557 case AF_NETLINK:
1558 {
1559 *len_ret = sizeof (struct sockaddr_nl);
1560 return 1;
1561 }
1562 #endif
1563
1564 case AF_INET:
1565 {
1566 *len_ret = sizeof (struct sockaddr_in);
1567 return 1;
1568 }
1569
1570 #ifdef ENABLE_IPV6
1571 case AF_INET6:
1572 {
1573 *len_ret = sizeof (struct sockaddr_in6);
1574 return 1;
1575 }
1576 #endif
1577
1578 #ifdef USE_BLUETOOTH
1579 case AF_BLUETOOTH:
1580 {
1581 switch(s->sock_proto)
1582 {
1583
1584 case BTPROTO_L2CAP:
1585 *len_ret = sizeof (struct sockaddr_l2);
1586 return 1;
1587 case BTPROTO_RFCOMM:
1588 *len_ret = sizeof (struct sockaddr_rc);
1589 return 1;
1590 case BTPROTO_HCI:
1591 *len_ret = sizeof (struct sockaddr_hci);
1592 return 1;
1593 #if !defined(__FreeBSD__)
1594 case BTPROTO_SCO:
1595 *len_ret = sizeof (struct sockaddr_sco);
1596 return 1;
1597 #endif
1598 default:
1599 PyErr_SetString(socket_error, "getsockaddrlen: "
1600 "unknown BT protocol");
1601 return 0;
1602
1603 }
1604 }
1605 #endif
1606
1607 #ifdef HAVE_NETPACKET_PACKET_H
1608 case AF_PACKET:
1609 {
1610 *len_ret = sizeof (struct sockaddr_ll);
1611 return 1;
1612 }
1613 #endif
1614
1615 #ifdef HAVE_LINUX_TIPC_H
1616 case AF_TIPC:
1617 {
1618 *len_ret = sizeof (struct sockaddr_tipc);
1619 return 1;
1620 }
1621 #endif
1622
1623 /* More cases here... */
1624
1625 default:
1626 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
1627 return 0;
1628
1629 }
1630 }
1631
1632
1633 /* s.accept() method */
1634
1635 static PyObject *
1636 sock_accept(PySocketSockObject *s)
1637 {
1638 sock_addr_t addrbuf;
1639 SOCKET_T newfd;
1640 socklen_t addrlen;
1641 PyObject *sock = NULL;
1642 PyObject *addr = NULL;
1643 PyObject *res = NULL;
1644 int timeout;
1645
1646 if (!getsockaddrlen(s, &addrlen))
1647 return NULL;
1648 memset(&addrbuf, 0, addrlen);
1649
1650 #ifdef MS_WINDOWS
1651 newfd = INVALID_SOCKET;
1652 #else
1653 newfd = -1;
1654 #endif
1655
1656 if (!IS_SELECTABLE(s))
1657 return select_error();
1658
1659 Py_BEGIN_ALLOW_THREADS
1660 timeout = internal_select(s, 0);
1661 if (!timeout)
1662 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
1663 Py_END_ALLOW_THREADS
1664
1665 if (timeout == 1) {
1666 PyErr_SetString(socket_timeout, "timed out");
1667 return NULL;
1668 }
1669
1670 #ifdef MS_WINDOWS
1671 if (newfd == INVALID_SOCKET)
1672 #else
1673 if (newfd < 0)
1674 #endif
1675 return s->errorhandler();
1676
1677 /* Create the new object with unspecified family,
1678 to avoid calls to bind() etc. on it. */
1679 sock = (PyObject *) new_sockobject(newfd,
1680 s->sock_family,
1681 s->sock_type,
1682 s->sock_proto);
1683
1684 if (sock == NULL) {
1685 SOCKETCLOSE(newfd);
1686 goto finally;
1687 }
1688 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
1689 addrlen, s->sock_proto);
1690 if (addr == NULL)
1691 goto finally;
1692
1693 res = PyTuple_Pack(2, sock, addr);
1694
1695 finally:
1696 Py_XDECREF(sock);
1697 Py_XDECREF(addr);
1698 return res;
1699 }
1700
1701 PyDoc_STRVAR(accept_doc,
1702 "accept() -> (socket object, address info)\n\
1703 \n\
1704 Wait for an incoming connection. Return a new socket representing the\n\
1705 connection, and the address of the client. For IP sockets, the address\n\
1706 info is a pair (hostaddr, port).");
1707
1708 /* s.setblocking(flag) method. Argument:
1709 False -- non-blocking mode; same as settimeout(0)
1710 True -- blocking mode; same as settimeout(None)
1711 */
1712
1713 static PyObject *
1714 sock_setblocking(PySocketSockObject *s, PyObject *arg)
1715 {
1716 int block;
1717
1718 block = PyInt_AsLong(arg);
1719 if (block == -1 && PyErr_Occurred())
1720 return NULL;
1721
1722 s->sock_timeout = block ? -1.0 : 0.0;
1723 internal_setblocking(s, block);
1724
1725 Py_INCREF(Py_None);
1726 return Py_None;
1727 }
1728
1729 PyDoc_STRVAR(setblocking_doc,
1730 "setblocking(flag)\n\
1731 \n\
1732 Set the socket to blocking (flag is true) or non-blocking (false).\n\
1733 setblocking(True) is equivalent to settimeout(None);\n\
1734 setblocking(False) is equivalent to settimeout(0.0).");
1735
1736 /* s.settimeout(timeout) method. Argument:
1737 None -- no timeout, blocking mode; same as setblocking(True)
1738 0.0 -- non-blocking mode; same as setblocking(False)
1739 > 0 -- timeout mode; operations time out after timeout seconds
1740 < 0 -- illegal; raises an exception
1741 */
1742 static PyObject *
1743 sock_settimeout(PySocketSockObject *s, PyObject *arg)
1744 {
1745 double timeout;
1746
1747 if (arg == Py_None)
1748 timeout = -1.0;
1749 else {
1750 timeout = PyFloat_AsDouble(arg);
1751 if (timeout < 0.0) {
1752 if (!PyErr_Occurred())
1753 PyErr_SetString(PyExc_ValueError,
1754 "Timeout value out of range");
1755 return NULL;
1756 }
1757 }
1758
1759 s->sock_timeout = timeout;
1760 internal_setblocking(s, timeout < 0.0);
1761
1762 Py_INCREF(Py_None);
1763 return Py_None;
1764 }
1765
1766 PyDoc_STRVAR(settimeout_doc,
1767 "settimeout(timeout)\n\
1768 \n\
1769 Set a timeout on socket operations. 'timeout' can be a float,\n\
1770 giving in seconds, or None. Setting a timeout of None disables\n\
1771 the timeout feature and is equivalent to setblocking(1).\n\
1772 Setting a timeout of zero is the same as setblocking(0).");
1773
1774 /* s.gettimeout() method.
1775 Returns the timeout associated with a socket. */
1776 static PyObject *
1777 sock_gettimeout(PySocketSockObject *s)
1778 {
1779 if (s->sock_timeout < 0.0) {
1780 Py_INCREF(Py_None);
1781 return Py_None;
1782 }
1783 else
1784 return PyFloat_FromDouble(s->sock_timeout);
1785 }
1786
1787 PyDoc_STRVAR(gettimeout_doc,
1788 "gettimeout() -> timeout\n\
1789 \n\
1790 Returns the timeout in seconds (float) associated with socket \n\
1791 operations. A timeout of None indicates that timeouts on socket \n\
1792 operations are disabled.");
1793
1794 #ifdef RISCOS
1795 /* s.sleeptaskw(1 | 0) method */
1796
1797 static PyObject *
1798 sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
1799 {
1800 int block;
1801 block = PyInt_AsLong(arg);
1802 if (block == -1 && PyErr_Occurred())
1803 return NULL;
1804 Py_BEGIN_ALLOW_THREADS
1805 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1806 Py_END_ALLOW_THREADS
1807
1808 Py_INCREF(Py_None);
1809 return Py_None;
1810 }
1811 PyDoc_STRVAR(sleeptaskw_doc,
1812 "sleeptaskw(flag)\n\
1813 \n\
1814 Allow sleeps in taskwindows.");
1815 #endif
1816
1817
1818 /* s.setsockopt() method.
1819 With an integer third argument, sets an integer option.
1820 With a string third argument, sets an option from a buffer;
1821 use optional built-in module 'struct' to encode the string. */
1822
1823 static PyObject *
1824 sock_setsockopt(PySocketSockObject *s, PyObject *args)
1825 {
1826 int level;
1827 int optname;
1828 int res;
1829 char *buf;
1830 int buflen;
1831 int flag;
1832
1833 if (PyArg_ParseTuple(args, "iii:setsockopt",
1834 &level, &optname, &flag)) {
1835 buf = (char *) &flag;
1836 buflen = sizeof flag;
1837 }
1838 else {
1839 PyErr_Clear();
1840 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1841 &level, &optname, &buf, &buflen))
1842 return NULL;
1843 }
1844 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
1845 if (res < 0)
1846 return s->errorhandler();
1847 Py_INCREF(Py_None);
1848 return Py_None;
1849 }
1850
1851 PyDoc_STRVAR(setsockopt_doc,
1852 "setsockopt(level, option, value)\n\
1853 \n\
1854 Set a socket option. See the Unix manual for level and option.\n\
1855 The value argument can either be an integer or a string.");
1856
1857
1858 /* s.getsockopt() method.
1859 With two arguments, retrieves an integer option.
1860 With a third integer argument, retrieves a string buffer of that size;
1861 use optional built-in module 'struct' to decode the string. */
1862
1863 static PyObject *
1864 sock_getsockopt(PySocketSockObject *s, PyObject *args)
1865 {
1866 int level;
1867 int optname;
1868 int res;
1869 PyObject *buf;
1870 socklen_t buflen = 0;
1871
1872 #ifdef __BEOS__
1873 /* We have incomplete socket support. */
1874 PyErr_SetString(socket_error, "getsockopt not supported");
1875 return NULL;
1876 #else
1877
1878 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1879 &level, &optname, &buflen))
1880 return NULL;
1881
1882 if (buflen == 0) {
1883 int flag = 0;
1884 socklen_t flagsize = sizeof flag;
1885 res = getsockopt(s->sock_fd, level, optname,
1886 (void *)&flag, &flagsize);
1887 if (res < 0)
1888 return s->errorhandler();
1889 return PyInt_FromLong(flag);
1890 }
1891 #ifdef __VMS
1892 /* socklen_t is unsigned so no negative test is needed,
1893 test buflen == 0 is previously done */
1894 if (buflen > 1024) {
1895 #else
1896 if (buflen <= 0 || buflen > 1024) {
1897 #endif
1898 PyErr_SetString(socket_error,
1899 "getsockopt buflen out of range");
1900 return NULL;
1901 }
1902 buf = PyString_FromStringAndSize((char *)NULL, buflen);
1903 if (buf == NULL)
1904 return NULL;
1905 res = getsockopt(s->sock_fd, level, optname,
1906 (void *)PyString_AS_STRING(buf), &buflen);
1907 if (res < 0) {
1908 Py_DECREF(buf);
1909 return s->errorhandler();
1910 }
1911 _PyString_Resize(&buf, buflen);
1912 return buf;
1913 #endif /* __BEOS__ */
1914 }
1915
1916 PyDoc_STRVAR(getsockopt_doc,
1917 "getsockopt(level, option[, buffersize]) -> value\n\
1918 \n\
1919 Get a socket option. See the Unix manual for level and option.\n\
1920 If a nonzero buffersize argument is given, the return value is a\n\
1921 string of that length; otherwise it is an integer.");
1922
1923
1924 /* s.bind(sockaddr) method */
1925
1926 static PyObject *
1927 sock_bind(PySocketSockObject *s, PyObject *addro)
1928 {
1929 sock_addr_t addrbuf;
1930 int addrlen;
1931 int res;
1932
1933 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
1934 return NULL;
1935 Py_BEGIN_ALLOW_THREADS
1936 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
1937 Py_END_ALLOW_THREADS
1938 if (res < 0)
1939 return s->errorhandler();
1940 Py_INCREF(Py_None);
1941 return Py_None;
1942 }
1943
1944 PyDoc_STRVAR(bind_doc,
1945 "bind(address)\n\
1946 \n\
1947 Bind the socket to a local address. For IP sockets, the address is a\n\
1948 pair (host, port); the host must refer to the local host. For raw packet\n\
1949 sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
1950
1951
1952 /* s.close() method.
1953 Set the file descriptor to -1 so operations tried subsequently
1954 will surely fail. */
1955
1956 static PyObject *
1957 sock_close(PySocketSockObject *s)
1958 {
1959 SOCKET_T fd;
1960
1961 if ((fd = s->sock_fd) != -1) {
1962 s->sock_fd = -1;
1963 Py_BEGIN_ALLOW_THREADS
1964 (void) SOCKETCLOSE(fd);
1965 Py_END_ALLOW_THREADS
1966 }
1967 Py_INCREF(Py_None);
1968 return Py_None;
1969 }
1970
1971 PyDoc_STRVAR(close_doc,
1972 "close()\n\
1973 \n\
1974 Close the socket. It cannot be used after this call.");
1975
1976 static int
1977 internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
1978 int *timeoutp)
1979 {
1980 int res, timeout;
1981
1982 timeout = 0;
1983 res = connect(s->sock_fd, addr, addrlen);
1984
1985 #ifdef MS_WINDOWS
1986
1987 if (s->sock_timeout > 0.0) {
1988 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
1989 IS_SELECTABLE(s)) {
1990 /* This is a mess. Best solution: trust select */
1991 fd_set fds;
1992 fd_set fds_exc;
1993 struct timeval tv;
1994 tv.tv_sec = (int)s->sock_timeout;
1995 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1996 FD_ZERO(&fds);
1997 FD_SET(s->sock_fd, &fds);
1998 FD_ZERO(&fds_exc);
1999 FD_SET(s->sock_fd, &fds_exc);
2000 res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);
2001 if (res == 0) {
2002 res = WSAEWOULDBLOCK;
2003 timeout = 1;
2004 } else if (res > 0) {
2005 if (FD_ISSET(s->sock_fd, &fds))
2006 /* The socket is in the writeable set - this
2007 means connected */
2008 res = 0;
2009 else {
2010 /* As per MS docs, we need to call getsockopt()
2011 to get the underlying error */
2012 int res_size = sizeof res;
2013 /* It must be in the exception set */
2014 assert(FD_ISSET(s->sock_fd, &fds_exc));
2015 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2016 (char *)&res, &res_size))
2017 /* getsockopt also clears WSAGetLastError,
2018 so reset it back. */
2019 WSASetLastError(res);
2020 else
2021 res = WSAGetLastError();
2022 }
2023 }
2024 /* else if (res < 0) an error occurred */
2025 }
2026 }
2027
2028 if (res < 0)
2029 res = WSAGetLastError();
2030
2031 #else
2032
2033 if (s->sock_timeout > 0.0) {
2034 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2035 timeout = internal_select(s, 1);
2036 if (timeout == 0) {
2037 /* Bug #1019808: in case of an EINPROGRESS,
2038 use getsockopt(SO_ERROR) to get the real
2039 error. */
2040 socklen_t res_size = sizeof res;
2041 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2042 SO_ERROR, &res, &res_size);
2043 if (res == EISCONN)
2044 res = 0;
2045 errno = res;
2046 }
2047 else if (timeout == -1) {
2048 res = errno; /* had error */
2049 }
2050 else
2051 res = EWOULDBLOCK; /* timed out */
2052 }
2053 }
2054
2055 if (res < 0)
2056 res = errno;
2057
2058 #endif
2059 *timeoutp = timeout;
2060
2061 return res;
2062 }
2063
2064 /* s.connect(sockaddr) method */
2065
2066 static PyObject *
2067 sock_connect(PySocketSockObject *s, PyObject *addro)
2068 {
2069 sock_addr_t addrbuf;
2070 int addrlen;
2071 int res;
2072 int timeout;
2073
2074 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2075 return NULL;
2076
2077 Py_BEGIN_ALLOW_THREADS
2078 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2079 Py_END_ALLOW_THREADS
2080
2081 if (timeout == 1) {
2082 PyErr_SetString(socket_timeout, "timed out");
2083 return NULL;
2084 }
2085 if (res != 0)
2086 return s->errorhandler();
2087 Py_INCREF(Py_None);
2088 return Py_None;
2089 }
2090
2091 PyDoc_STRVAR(connect_doc,
2092 "connect(address)\n\
2093 \n\
2094 Connect the socket to a remote address. For IP sockets, the address\n\
2095 is a pair (host, port).");
2096
2097
2098 /* s.connect_ex(sockaddr) method */
2099
2100 static PyObject *
2101 sock_connect_ex(PySocketSockObject *s, PyObject *addro)
2102 {
2103 sock_addr_t addrbuf;
2104 int addrlen;
2105 int res;
2106 int timeout;
2107
2108 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2109 return NULL;
2110
2111 Py_BEGIN_ALLOW_THREADS
2112 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2113 Py_END_ALLOW_THREADS
2114
2115 /* Signals are not errors (though they may raise exceptions). Adapted
2116 from PyErr_SetFromErrnoWithFilenameObject(). */
2117 #ifdef EINTR
2118 if (res == EINTR && PyErr_CheckSignals())
2119 return NULL;
2120 #endif
2121
2122 return PyInt_FromLong((long) res);
2123 }
2124
2125 PyDoc_STRVAR(connect_ex_doc,
2126 "connect_ex(address) -> errno\n\
2127 \n\
2128 This is like connect(address), but returns an error code (the errno value)\n\
2129 instead of raising an exception when an error occurs.");
2130
2131
2132 /* s.fileno() method */
2133
2134 static PyObject *
2135 sock_fileno(PySocketSockObject *s)
2136 {
2137 #if SIZEOF_SOCKET_T <= SIZEOF_LONG
2138 return PyInt_FromLong((long) s->sock_fd);
2139 #else
2140 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
2141 #endif
2142 }
2143
2144 PyDoc_STRVAR(fileno_doc,
2145 "fileno() -> integer\n\
2146 \n\
2147 Return the integer file descriptor of the socket.");
2148
2149
2150 #ifndef NO_DUP
2151 /* s.dup() method */
2152
2153 static PyObject *
2154 sock_dup(PySocketSockObject *s)
2155 {
2156 SOCKET_T newfd;
2157 PyObject *sock;
2158
2159 newfd = dup(s->sock_fd);
2160 if (newfd < 0)
2161 return s->errorhandler();
2162 sock = (PyObject *) new_sockobject(newfd,
2163 s->sock_family,
2164 s->sock_type,
2165 s->sock_proto);
2166 if (sock == NULL)
2167 SOCKETCLOSE(newfd);
2168 return sock;
2169 }
2170
2171 PyDoc_STRVAR(dup_doc,
2172 "dup() -> socket object\n\
2173 \n\
2174 Return a new socket object connected to the same system resource.");
2175
2176 #endif
2177
2178
2179 /* s.getsockname() method */
2180
2181 static PyObject *
2182 sock_getsockname(PySocketSockObject *s)
2183 {
2184 sock_addr_t addrbuf;
2185 int res;
2186 socklen_t addrlen;
2187
2188 if (!getsockaddrlen(s, &addrlen))
2189 return NULL;
2190 memset(&addrbuf, 0, addrlen);
2191 Py_BEGIN_ALLOW_THREADS
2192 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2193 Py_END_ALLOW_THREADS
2194 if (res < 0)
2195 return s->errorhandler();
2196 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2197 s->sock_proto);
2198 }
2199
2200 PyDoc_STRVAR(getsockname_doc,
2201 "getsockname() -> address info\n\
2202 \n\
2203 Return the address of the local endpoint. For IP sockets, the address\n\
2204 info is a pair (hostaddr, port).");
2205
2206
2207 #ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
2208 /* s.getpeername() method */
2209
2210 static PyObject *
2211 sock_getpeername(PySocketSockObject *s)
2212 {
2213 sock_addr_t addrbuf;
2214 int res;
2215 socklen_t addrlen;
2216
2217 if (!getsockaddrlen(s, &addrlen))
2218 return NULL;
2219 memset(&addrbuf, 0, addrlen);
2220 Py_BEGIN_ALLOW_THREADS
2221 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2222 Py_END_ALLOW_THREADS
2223 if (res < 0)
2224 return s->errorhandler();
2225 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2226 s->sock_proto);
2227 }
2228
2229 PyDoc_STRVAR(getpeername_doc,
2230 "getpeername() -> address info\n\
2231 \n\
2232 Return the address of the remote endpoint. For IP sockets, the address\n\
2233 info is a pair (hostaddr, port).");
2234
2235 #endif /* HAVE_GETPEERNAME */
2236
2237
2238 /* s.listen(n) method */
2239
2240 static PyObject *
2241 sock_listen(PySocketSockObject *s, PyObject *arg)
2242 {
2243 int backlog;
2244 int res;
2245
2246 backlog = PyInt_AsLong(arg);
2247 if (backlog == -1 && PyErr_Occurred())
2248 return NULL;
2249 Py_BEGIN_ALLOW_THREADS
2250 /* To avoid problems on systems that don't allow a negative backlog
2251 * (which doesn't make sense anyway) we force a minimum value of 0. */
2252 if (backlog < 0)
2253 backlog = 0;
2254 res = listen(s->sock_fd, backlog);
2255 Py_END_ALLOW_THREADS
2256 if (res < 0)
2257 return s->errorhandler();
2258 Py_INCREF(Py_None);
2259 return Py_None;
2260 }
2261
2262 PyDoc_STRVAR(listen_doc,
2263 "listen(backlog)\n\
2264 \n\
2265 Enable a server to accept connections. The backlog argument must be at\n\
2266 least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2267 unaccepted connections that the system will allow before refusing new\n\
2268 connections.");
2269
2270
2271 #ifndef NO_DUP
2272 /* s.makefile(mode) method.
2273 Create a new open file object referring to a dupped version of
2274 the socket's file descriptor. (The dup() call is necessary so
2275 that the open file and socket objects may be closed independent
2276 of each other.)
2277 The mode argument specifies 'r' or 'w' passed to fdopen(). */
2278
2279 static PyObject *
2280 sock_makefile(PySocketSockObject *s, PyObject *args)
2281 {
2282 extern int fclose(FILE *);
2283 char *mode = "r";
2284 int bufsize = -1;
2285 #ifdef MS_WIN32
2286 Py_intptr_t fd;
2287 #else
2288 int fd;
2289 #endif
2290 FILE *fp;
2291 PyObject *f;
2292 #ifdef __VMS
2293 char *mode_r = "r";
2294 char *mode_w = "w";
2295 #endif
2296
2297 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
2298 return NULL;
2299 #ifdef __VMS
2300 if (strcmp(mode,"rb") == 0) {
2301 mode = mode_r;
2302 }
2303 else {
2304 if (strcmp(mode,"wb") == 0) {
2305 mode = mode_w;
2306 }
2307 }
2308 #endif
2309 #ifdef MS_WIN32
2310 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
2311 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
2312 #else
2313 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
2314 #endif
2315 {
2316 if (fd >= 0)
2317 SOCKETCLOSE(fd);
2318 return s->errorhandler();
2319 }
2320 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
2321 if (f != NULL)
2322 PyFile_SetBufSize(f, bufsize);
2323 return f;
2324 }
2325
2326 PyDoc_STRVAR(makefile_doc,
2327 "makefile([mode[, buffersize]]) -> file object\n\
2328 \n\
2329 Return a regular file object corresponding to the socket.\n\
2330 The mode and buffersize arguments are as for the built-in open() function.");
2331
2332 #endif /* NO_DUP */
2333
2334 /*
2335 * This is the guts of the recv() and recv_into() methods, which reads into a
2336 * char buffer. If you have any inc/dec ref to do to the objects that contain
2337 * the buffer, do it in the caller. This function returns the number of bytes
2338 * successfully read. If there was an error, it returns -1. Note that it is
2339 * also possible that we return a number of bytes smaller than the request
2340 * bytes.
2341 */
2342 static ssize_t
2343 sock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags)
2344 {
2345 ssize_t outlen = -1;
2346 int timeout;
2347 #ifdef __VMS
2348 int remaining;
2349 char *read_buf;
2350 #endif
2351
2352 if (!IS_SELECTABLE(s)) {
2353 select_error();
2354 return -1;
2355 }
2356
2357 #ifndef __VMS
2358 Py_BEGIN_ALLOW_THREADS
2359 timeout = internal_select(s, 0);
2360 if (!timeout)
2361 outlen = recv(s->sock_fd, cbuf, len, flags);
2362 Py_END_ALLOW_THREADS
2363
2364 if (timeout == 1) {
2365 PyErr_SetString(socket_timeout, "timed out");
2366 return -1;
2367 }
2368 if (outlen < 0) {
2369 /* Note: the call to errorhandler() ALWAYS indirectly returned
2370 NULL, so ignore its return value */
2371 s->errorhandler();
2372 return -1;
2373 }
2374 #else
2375 read_buf = cbuf;
2376 remaining = len;
2377 while (remaining != 0) {
2378 unsigned int segment;
2379 int nread = -1;
2380
2381 segment = remaining /SEGMENT_SIZE;
2382 if (segment != 0) {
2383 segment = SEGMENT_SIZE;
2384 }
2385 else {
2386 segment = remaining;
2387 }
2388
2389 Py_BEGIN_ALLOW_THREADS
2390 timeout = internal_select(s, 0);
2391 if (!timeout)
2392 nread = recv(s->sock_fd, read_buf, segment, flags);
2393 Py_END_ALLOW_THREADS
2394
2395 if (timeout == 1) {
2396 PyErr_SetString(socket_timeout, "timed out");
2397 return -1;
2398 }
2399 if (nread < 0) {
2400 s->errorhandler();
2401 return -1;
2402 }
2403 if (nread != remaining) {
2404 read_buf += nread;
2405 break;
2406 }
2407
2408 remaining -= segment;
2409 read_buf += segment;
2410 }
2411 outlen = read_buf - cbuf;
2412 #endif /* !__VMS */
2413
2414 return outlen;
2415 }
2416
2417
2418 /* s.recv(nbytes [,flags]) method */
2419
2420 static PyObject *
2421 sock_recv(PySocketSockObject *s, PyObject *args)
2422 {
2423 int recvlen, flags = 0;
2424 ssize_t outlen;
2425 PyObject *buf;
2426
2427 if (!PyArg_ParseTuple(args, "i|i:recv", &recvlen, &flags))
2428 return NULL;
2429
2430 if (recvlen < 0) {
2431 PyErr_SetString(PyExc_ValueError,
2432 "negative buffersize in recv");
2433 return NULL;
2434 }
2435
2436 /* Allocate a new string. */
2437 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2438 if (buf == NULL)
2439 return NULL;
2440
2441 /* Call the guts */
2442 outlen = sock_recv_guts(s, PyString_AS_STRING(buf), recvlen, flags);
2443 if (outlen < 0) {
2444 /* An error occurred, release the string and return an
2445 error. */
2446 Py_DECREF(buf);
2447 return NULL;
2448 }
2449 if (outlen != recvlen) {
2450 /* We did not read as many bytes as we anticipated, resize the
2451 string if possible and be successful. */
2452 if (_PyString_Resize(&buf, outlen) < 0)
2453 /* Oopsy, not so successful after all. */
2454 return NULL;
2455 }
2456
2457 return buf;
2458 }
2459
2460 PyDoc_STRVAR(recv_doc,
2461 "recv(buffersize[, flags]) -> data\n\
2462 \n\
2463 Receive up to buffersize bytes from the socket. For the optional flags\n\
2464 argument, see the Unix manual. When no data is available, block until\n\
2465 at least one byte is available or until the remote end is closed. When\n\
2466 the remote end is closed and all data is read, return the empty string.");
2467
2468
2469 /* s.recv_into(buffer, [nbytes [,flags]]) method */
2470
2471 static PyObject*
2472 sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
2473 {
2474 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
2475
2476 int recvlen = 0, flags = 0;
2477 ssize_t readlen;
2478 Py_buffer buf;
2479 Py_ssize_t buflen;
2480
2481 /* Get the buffer's memory */
2482 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recv_into", kwlist,
2483 &buf, &recvlen, &flags))
2484 return NULL;
2485 buflen = buf.len;
2486 assert(buf.buf != 0 && buflen > 0);
2487
2488 if (recvlen < 0) {
2489 PyErr_SetString(PyExc_ValueError,
2490 "negative buffersize in recv_into");
2491 goto error;
2492 }
2493 if (recvlen == 0) {
2494 /* If nbytes was not specified, use the buffer's length */
2495 recvlen = buflen;
2496 }
2497
2498 /* Check if the buffer is large enough */
2499 if (buflen < recvlen) {
2500 PyErr_SetString(PyExc_ValueError,
2501 "buffer too small for requested bytes");
2502 goto error;
2503 }
2504
2505 /* Call the guts */
2506 readlen = sock_recv_guts(s, buf.buf, recvlen, flags);
2507 if (readlen < 0) {
2508 /* Return an error. */
2509 goto error;
2510 }
2511
2512 PyBuffer_Release(&buf);
2513 /* Return the number of bytes read. Note that we do not do anything
2514 special here in the case that readlen < recvlen. */
2515 return PyInt_FromSsize_t(readlen);
2516
2517 error:
2518 PyBuffer_Release(&buf);
2519 return NULL;
2520 }
2521
2522 PyDoc_STRVAR(recv_into_doc,
2523 "recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
2524 \n\
2525 A version of recv() that stores its data into a buffer rather than creating \n\
2526 a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2527 is not specified (or 0), receive up to the size available in the given buffer.\n\
2528 \n\
2529 See recv() for documentation about the flags.");
2530
2531
2532 /*
2533 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2534 * into a char buffer. If you have any inc/def ref to do to the objects that
2535 * contain the buffer, do it in the caller. This function returns the number
2536 * of bytes successfully read. If there was an error, it returns -1. Note
2537 * that it is also possible that we return a number of bytes smaller than the
2538 * request bytes.
2539 *
2540 * 'addr' is a return value for the address object. Note that you must decref
2541 * it yourself.
2542 */
2543 static ssize_t
2544 sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags,
2545 PyObject** addr)
2546 {
2547 sock_addr_t addrbuf;
2548 int timeout;
2549 ssize_t n = -1;
2550 socklen_t addrlen;
2551
2552 *addr = NULL;
2553
2554 if (!getsockaddrlen(s, &addrlen))
2555 return -1;
2556
2557 if (!IS_SELECTABLE(s)) {
2558 select_error();
2559 return -1;
2560 }
2561
2562 Py_BEGIN_ALLOW_THREADS
2563 memset(&addrbuf, 0, addrlen);
2564 timeout = internal_select(s, 0);
2565 if (!timeout) {
2566 #ifndef MS_WINDOWS
2567 #if defined(PYOS_OS2) && !defined(PYCC_GCC)
2568 n = recvfrom(s->sock_fd, cbuf, len, flags,
2569 SAS2SA(&addrbuf), &addrlen);
2570 #else
2571 n = recvfrom(s->sock_fd, cbuf, len, flags,
2572 (void *) &addrbuf, &addrlen);
2573 #endif
2574 #else
2575 n = recvfrom(s->sock_fd, cbuf, len, flags,
2576 SAS2SA(&addrbuf), &addrlen);
2577 #endif
2578 }
2579 Py_END_ALLOW_THREADS
2580
2581 if (timeout == 1) {
2582 PyErr_SetString(socket_timeout, "timed out");
2583 return -1;
2584 }
2585 if (n < 0) {
2586 s->errorhandler();
2587 return -1;
2588 }
2589
2590 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2591 addrlen, s->sock_proto)))
2592 return -1;
2593
2594 return n;
2595 }
2596
2597 /* s.recvfrom(nbytes [,flags]) method */
2598
2599 static PyObject *
2600 sock_recvfrom(PySocketSockObject *s, PyObject *args)
2601 {
2602 PyObject *buf = NULL;
2603 PyObject *addr = NULL;
2604 PyObject *ret = NULL;
2605 int recvlen, flags = 0;
2606 ssize_t outlen;
2607
2608 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &recvlen, &flags))
2609 return NULL;
2610
2611 if (recvlen < 0) {
2612 PyErr_SetString(PyExc_ValueError,
2613 "negative buffersize in recvfrom");
2614 return NULL;
2615 }
2616
2617 buf = PyString_FromStringAndSize((char *) 0, recvlen);
2618 if (buf == NULL)
2619 return NULL;
2620
2621 outlen = sock_recvfrom_guts(s, PyString_AS_STRING(buf),
2622 recvlen, flags, &addr);
2623 if (outlen < 0) {
2624 goto finally;
2625 }
2626
2627 if (outlen != recvlen) {
2628 /* We did not read as many bytes as we anticipated, resize the
2629 string if possible and be successful. */
2630 if (_PyString_Resize(&buf, outlen) < 0)
2631 /* Oopsy, not so successful after all. */
2632 goto finally;
2633 }
2634
2635 ret = PyTuple_Pack(2, buf, addr);
2636
2637 finally:
2638 Py_XDECREF(buf);
2639 Py_XDECREF(addr);
2640 return ret;
2641 }
2642
2643 PyDoc_STRVAR(recvfrom_doc,
2644 "recvfrom(buffersize[, flags]) -> (data, address info)\n\
2645 \n\
2646 Like recv(buffersize, flags) but also return the sender's address info.");
2647
2648
2649 /* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
2650
2651 static PyObject *
2652 sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
2653 {
2654 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
2655
2656 int recvlen = 0, flags = 0;
2657 ssize_t readlen;
2658 Py_buffer buf;
2659 int buflen;
2660
2661 PyObject *addr = NULL;
2662
2663 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recvfrom_into",
2664 kwlist, &buf,
2665 &recvlen, &flags))
2666 return NULL;
2667 buflen = buf.len;
2668 assert(buf.buf != 0 && buflen > 0);
2669
2670 if (recvlen < 0) {
2671 PyErr_SetString(PyExc_ValueError,
2672 "negative buffersize in recvfrom_into");
2673 goto error;
2674 }
2675 if (recvlen == 0) {
2676 /* If nbytes was not specified, use the buffer's length */
2677 recvlen = buflen;
2678 }
2679
2680 readlen = sock_recvfrom_guts(s, buf.buf, recvlen, flags, &addr);
2681 if (readlen < 0) {
2682 /* Return an error */
2683 goto error;
2684 }
2685
2686 PyBuffer_Release(&buf);
2687 /* Return the number of bytes read and the address. Note that we do
2688 not do anything special here in the case that readlen < recvlen. */
2689 return Py_BuildValue("lN", readlen, addr);
2690
2691 error:
2692 Py_XDECREF(addr);
2693 PyBuffer_Release(&buf);
2694 return NULL;
2695 }
2696
2697 PyDoc_STRVAR(recvfrom_into_doc,
2698 "recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
2699 \n\
2700 Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
2701
2702
2703 /* s.send(data [,flags]) method */
2704
2705 static PyObject *
2706 sock_send(PySocketSockObject *s, PyObject *args)
2707 {
2708 char *buf;
2709 int len, n = -1, flags = 0, timeout;
2710 Py_buffer pbuf;
2711
2712 if (!PyArg_ParseTuple(args, "s*|i:send", &pbuf, &flags))
2713 return NULL;
2714
2715 if (!IS_SELECTABLE(s)) {
2716 PyBuffer_Release(&pbuf);
2717 return select_error();
2718 }
2719 buf = pbuf.buf;
2720 len = pbuf.len;
2721
2722 Py_BEGIN_ALLOW_THREADS
2723 timeout = internal_select(s, 1);
2724 if (!timeout)
2725 #ifdef __VMS
2726 n = sendsegmented(s->sock_fd, buf, len, flags);
2727 #else
2728 n = send(s->sock_fd, buf, len, flags);
2729 #endif
2730 Py_END_ALLOW_THREADS
2731
2732 PyBuffer_Release(&pbuf);
2733
2734 if (timeout == 1) {
2735 PyErr_SetString(socket_timeout, "timed out");
2736 return NULL;
2737 }
2738 if (n < 0)
2739 return s->errorhandler();
2740 return PyInt_FromLong((long)n);
2741 }
2742
2743 PyDoc_STRVAR(send_doc,
2744 "send(data[, flags]) -> count\n\
2745 \n\
2746 Send a data string to the socket. For the optional flags\n\
2747 argument, see the Unix manual. Return the number of bytes\n\
2748 sent; this may be less than len(data) if the network is busy.");
2749
2750
2751 /* s.sendall(data [,flags]) method */
2752
2753 static PyObject *
2754 sock_sendall(PySocketSockObject *s, PyObject *args)
2755 {
2756 char *buf;
2757 int len, n = -1, flags = 0, timeout, saved_errno;
2758 Py_buffer pbuf;
2759
2760 if (!PyArg_ParseTuple(args, "s*|i:sendall", &pbuf, &flags))
2761 return NULL;
2762 buf = pbuf.buf;
2763 len = pbuf.len;
2764
2765 if (!IS_SELECTABLE(s)) {
2766 PyBuffer_Release(&pbuf);
2767 return select_error();
2768 }
2769
2770 do {
2771 Py_BEGIN_ALLOW_THREADS
2772 timeout = internal_select(s, 1);
2773 n = -1;
2774 if (!timeout) {
2775 #ifdef __VMS
2776 n = sendsegmented(s->sock_fd, buf, len, flags);
2777 #else
2778 n = send(s->sock_fd, buf, len, flags);
2779 #endif
2780 }
2781 Py_END_ALLOW_THREADS
2782 if (timeout == 1) {
2783 PyBuffer_Release(&pbuf);
2784 PyErr_SetString(socket_timeout, "timed out");
2785 return NULL;
2786 }
2787 /* PyErr_CheckSignals() might change errno */
2788 saved_errno = errno;
2789 /* We must run our signal handlers before looping again.
2790 send() can return a successful partial write when it is
2791 interrupted, so we can't restrict ourselves to EINTR. */
2792 if (PyErr_CheckSignals()) {
2793 PyBuffer_Release(&pbuf);
2794 return NULL;
2795 }
2796 if (n < 0) {
2797 /* If interrupted, try again */
2798 if (saved_errno == EINTR)
2799 continue;
2800 else
2801 break;
2802 }
2803 buf += n;
2804 len -= n;
2805 } while (len > 0);
2806 PyBuffer_Release(&pbuf);
2807
2808 if (n < 0)
2809 return s->errorhandler();
2810
2811 Py_INCREF(Py_None);
2812 return Py_None;
2813 }
2814
2815 PyDoc_STRVAR(sendall_doc,
2816 "sendall(data[, flags])\n\
2817 \n\
2818 Send a data string to the socket. For the optional flags\n\
2819 argument, see the Unix manual. This calls send() repeatedly\n\
2820 until all data is sent. If an error occurs, it's impossible\n\
2821 to tell how much data has been sent.");
2822
2823
2824 /* s.sendto(data, [flags,] sockaddr) method */
2825
2826 static PyObject *
2827 sock_sendto(PySocketSockObject *s, PyObject *args)
2828 {
2829 Py_buffer pbuf;
2830 PyObject *addro;
2831 char *buf;
2832 Py_ssize_t len;
2833 sock_addr_t addrbuf;
2834 int addrlen, n = -1, flags, timeout;
2835 int arglen;
2836
2837 flags = 0;
2838 arglen = PyTuple_Size(args);
2839 switch(arglen) {
2840 case 2:
2841 PyArg_ParseTuple(args, "s*O:sendto", &pbuf, &addro);
2842 break;
2843 case 3:
2844 PyArg_ParseTuple(args, "s*iO:sendto", &pbuf, &flags, &addro);
2845 break;
2846 default:
2847 PyErr_Format(PyExc_TypeError, "sendto() takes 2 or 3"
2848 " arguments (%d given)", arglen);
2849 }
2850 if (PyErr_Occurred())
2851 return NULL;
2852
2853 buf = pbuf.buf;
(emitted by clang-analyzer)TODO: a detailed trace is available in the data model (not yet rendered in this report)
(emitted by clang-analyzer)TODO: a detailed trace is available in the data model (not yet rendered in this report)
2854 len = pbuf.len;
2855
2856 if (!IS_SELECTABLE(s)) {
2857 PyBuffer_Release(&pbuf);
2858 return select_error();
2859 }
2860
2861 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
2862 PyBuffer_Release(&pbuf);
2863 return NULL;
2864 }
2865
2866 Py_BEGIN_ALLOW_THREADS
2867 timeout = internal_select(s, 1);
2868 if (!timeout)
2869 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
2870 Py_END_ALLOW_THREADS
2871
2872 PyBuffer_Release(&pbuf);
2873 if (timeout == 1) {
2874 PyErr_SetString(socket_timeout, "timed out");
2875 return NULL;
2876 }
2877 if (n < 0)
2878 return s->errorhandler();
2879 return PyInt_FromLong((long)n);
2880 }
2881
2882 PyDoc_STRVAR(sendto_doc,
2883 "sendto(data[, flags], address) -> count\n\
2884 \n\
2885 Like send(data, flags) but allows specifying the destination address.\n\
2886 For IP sockets, the address is a pair (hostaddr, port).");
2887
2888
2889 /* s.shutdown(how) method */
2890
2891 static PyObject *
2892 sock_shutdown(PySocketSockObject *s, PyObject *arg)
2893 {
2894 int how;
2895 int res;
2896
2897 how = PyInt_AsLong(arg);
2898 if (how == -1 && PyErr_Occurred())
2899 return NULL;
2900 Py_BEGIN_ALLOW_THREADS
2901 res = shutdown(s->sock_fd, how);
2902 Py_END_ALLOW_THREADS
2903 if (res < 0)
2904 return s->errorhandler();
2905 Py_INCREF(Py_None);
2906 return Py_None;
2907 }
2908
2909 PyDoc_STRVAR(shutdown_doc,
2910 "shutdown(flag)\n\
2911 \n\
2912 Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2913 of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
2914
2915 #if defined(MS_WINDOWS) && defined(SIO_RCVALL)
2916 static PyObject*
2917 sock_ioctl(PySocketSockObject *s, PyObject *arg)
2918 {
2919 unsigned long cmd = SIO_RCVALL;
2920 PyObject *argO;
2921 DWORD recv;
2922
2923 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
2924 return NULL;
2925
2926 switch (cmd) {
2927 case SIO_RCVALL: {
2928 unsigned int option = RCVALL_ON;
2929 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
2930 return NULL;
2931 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
2932 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
2933 return set_error();
2934 }
2935 return PyLong_FromUnsignedLong(recv); }
2936 case SIO_KEEPALIVE_VALS: {
2937 struct tcp_keepalive ka;
2938 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
2939 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
2940 return NULL;
2941 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
2942 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
2943 return set_error();
2944 }
2945 return PyLong_FromUnsignedLong(recv); }
2946 default:
2947 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
2948 return NULL;
2949 }
2950 }
2951 PyDoc_STRVAR(sock_ioctl_doc,
2952 "ioctl(cmd, option) -> long\n\
2953 \n\
2954 Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
2955 SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
2956 SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
2957
2958 #endif
2959
2960 /* List of methods for socket objects */
2961
2962 static PyMethodDef sock_methods[] = {
2963 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
2964 accept_doc},
2965 {"bind", (PyCFunction)sock_bind, METH_O,
2966 bind_doc},
2967 {"close", (PyCFunction)sock_close, METH_NOARGS,
2968 close_doc},
2969 {"connect", (PyCFunction)sock_connect, METH_O,
2970 connect_doc},
2971 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
2972 connect_ex_doc},
2973 #ifndef NO_DUP
2974 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
2975 dup_doc},
2976 #endif
2977 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
2978 fileno_doc},
2979 #ifdef HAVE_GETPEERNAME
2980 {"getpeername", (PyCFunction)sock_getpeername,
2981 METH_NOARGS, getpeername_doc},
2982 #endif
2983 {"getsockname", (PyCFunction)sock_getsockname,
2984 METH_NOARGS, getsockname_doc},
2985 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
2986 getsockopt_doc},
2987 #if defined(MS_WINDOWS) && defined(SIO_RCVALL)
2988 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
2989 sock_ioctl_doc},
2990 #endif
2991 {"listen", (PyCFunction)sock_listen, METH_O,
2992 listen_doc},
2993 #ifndef NO_DUP
2994 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
2995 makefile_doc},
2996 #endif
2997 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
2998 recv_doc},
2999 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3000 recv_into_doc},
3001 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3002 recvfrom_doc},
3003 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3004 recvfrom_into_doc},
3005 {"send", (PyCFunction)sock_send, METH_VARARGS,
3006 send_doc},
3007 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3008 sendall_doc},
3009 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3010 sendto_doc},
3011 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3012 setblocking_doc},
3013 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3014 settimeout_doc},
3015 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3016 gettimeout_doc},
3017 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3018 setsockopt_doc},
3019 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3020 shutdown_doc},
3021 #ifdef RISCOS
3022 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
3023 sleeptaskw_doc},
3024 #endif
3025 {NULL, NULL} /* sentinel */
3026 };
3027
3028 /* SockObject members */
3029 static PyMemberDef sock_memberlist[] = {
3030 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3031 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3032 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3033 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3034 {0},
3035 };
3036
3037 /* Deallocate a socket object in response to the last Py_DECREF().
3038 First close the file description. */
3039
3040 static void
3041 sock_dealloc(PySocketSockObject *s)
3042 {
3043 if (s->sock_fd != -1)
3044 (void) SOCKETCLOSE(s->sock_fd);
3045 Py_TYPE(s)->tp_free((PyObject *)s);
3046 }
3047
3048
3049 static PyObject *
3050 sock_repr(PySocketSockObject *s)
3051 {
3052 char buf[512];
3053 #if SIZEOF_SOCKET_T > SIZEOF_LONG
3054 if (s->sock_fd > LONG_MAX) {
3055 /* this can occur on Win64, and actually there is a special
3056 ugly printf formatter for decimal pointer length integer
3057 printing, only bother if necessary*/
3058 PyErr_SetString(PyExc_OverflowError,
3059 "no printf formatter to display "
3060 "the socket descriptor in decimal");
3061 return NULL;
3062 }
3063 #endif
3064 PyOS_snprintf(
3065 buf, sizeof(buf),
3066 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
3067 (long)s->sock_fd, s->sock_family,
3068 s->sock_type,
3069 s->sock_proto);
3070 return PyString_FromString(buf);
3071 }
3072
3073
3074 /* Create a new, uninitialized socket object. */
3075
3076 static PyObject *
3077 sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
3078 {
3079 PyObject *new;
3080
3081 new = type->tp_alloc(type, 0);
3082 if (new != NULL) {
3083 ((PySocketSockObject *)new)->sock_fd = -1;
3084 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3085 ((PySocketSockObject *)new)->errorhandler = &set_error;
3086 }
3087 return new;
3088 }
3089
3090
3091 /* Initialize a new socket object. */
3092
3093 /*ARGSUSED*/
3094 static int
3095 sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
3096 {
3097 PySocketSockObject *s = (PySocketSockObject *)self;
3098 SOCKET_T fd;
3099 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3100 static char *keywords[] = {"family", "type", "proto", 0};
3101
3102 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3103 "|iii:socket", keywords,
3104 &family, &type, &proto))
3105 return -1;
3106
3107 Py_BEGIN_ALLOW_THREADS
3108 fd = socket(family, type, proto);
3109 Py_END_ALLOW_THREADS
3110
3111 #ifdef MS_WINDOWS
3112 if (fd == INVALID_SOCKET)
3113 #else
3114 if (fd < 0)
3115 #endif
3116 {
3117 set_error();
3118 return -1;
3119 }
3120 init_sockobject(s, fd, family, type, proto);
3121
3122 return 0;
3123
3124 }
3125
3126
3127 /* Type object for socket objects. */
3128
3129 static PyTypeObject sock_type = {
3130 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
3131 "_socket.socket", /* tp_name */
3132 sizeof(PySocketSockObject), /* tp_basicsize */
3133 0, /* tp_itemsize */
3134 (destructor)sock_dealloc, /* tp_dealloc */
3135 0, /* tp_print */
3136 0, /* tp_getattr */
3137 0, /* tp_setattr */
3138 0, /* tp_compare */
3139 (reprfunc)sock_repr, /* tp_repr */
3140 0, /* tp_as_number */
3141 0, /* tp_as_sequence */
3142 0, /* tp_as_mapping */
3143 0, /* tp_hash */
3144 0, /* tp_call */
3145 0, /* tp_str */
3146 PyObject_GenericGetAttr, /* tp_getattro */
3147 0, /* tp_setattro */
3148 0, /* tp_as_buffer */
3149 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3150 sock_doc, /* tp_doc */
3151 0, /* tp_traverse */
3152 0, /* tp_clear */
3153 0, /* tp_richcompare */
3154 0, /* tp_weaklistoffset */
3155 0, /* tp_iter */
3156 0, /* tp_iternext */
3157 sock_methods, /* tp_methods */
3158 sock_memberlist, /* tp_members */
3159 0, /* tp_getset */
3160 0, /* tp_base */
3161 0, /* tp_dict */
3162 0, /* tp_descr_get */
3163 0, /* tp_descr_set */
3164 0, /* tp_dictoffset */
3165 sock_initobj, /* tp_init */
3166 PyType_GenericAlloc, /* tp_alloc */
3167 sock_new, /* tp_new */
3168 PyObject_Del, /* tp_free */
3169 };
3170
3171
3172 /* Python interface to gethostname(). */
3173
3174 /*ARGSUSED*/
3175 static PyObject *
3176 socket_gethostname(PyObject *self, PyObject *unused)
3177 {
3178 char buf[1024];
3179 int res;
3180 Py_BEGIN_ALLOW_THREADS
3181 res = gethostname(buf, (int) sizeof buf - 1);
3182 Py_END_ALLOW_THREADS
3183 if (res < 0)
3184 return set_error();
3185 buf[sizeof buf - 1] = '\0';
3186 return PyString_FromString(buf);
3187 }
3188
3189 PyDoc_STRVAR(gethostname_doc,
3190 "gethostname() -> string\n\
3191 \n\
3192 Return the current host name.");
3193
3194
3195 /* Python interface to gethostbyname(name). */
3196
3197 /*ARGSUSED*/
3198 static PyObject *
3199 socket_gethostbyname(PyObject *self, PyObject *args)
3200 {
3201 char *name;
3202 sock_addr_t addrbuf;
3203
3204 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
3205 return NULL;
3206 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
3207 return NULL;
3208 return makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
3209 }
3210
3211 PyDoc_STRVAR(gethostbyname_doc,
3212 "gethostbyname(host) -> address\n\
3213 \n\
3214 Return the IP address (a string of the form '255.255.255.255') for a host.");
3215
3216
3217 /* Convenience function common to gethostbyname_ex and gethostbyaddr */
3218
3219 static PyObject *
3220 gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
3221 {
3222 char **pch;
3223 PyObject *rtn_tuple = (PyObject *)NULL;
3224 PyObject *name_list = (PyObject *)NULL;
3225 PyObject *addr_list = (PyObject *)NULL;
3226 PyObject *tmp;
3227
3228 if (h == NULL) {
3229 /* Let's get real error message to return */
3230 #ifndef RISCOS
3231 set_herror(h_errno);
3232 #else
3233 PyErr_SetString(socket_error, "host not found");
3234 #endif
3235 return NULL;
3236 }
3237
3238 if (h->h_addrtype != af) {
3239 /* Let's get real error message to return */
3240 PyErr_SetString(socket_error,
3241 (char *)strerror(EAFNOSUPPORT));
3242
3243 return NULL;
3244 }
3245
3246 switch (af) {
3247
3248 case AF_INET:
3249 if (alen < sizeof(struct sockaddr_in))
3250 return NULL;
3251 break;
3252
3253 #ifdef ENABLE_IPV6
3254 case AF_INET6:
3255 if (alen < sizeof(struct sockaddr_in6))
3256 return NULL;
3257 break;
3258 #endif
3259
3260 }
3261
3262 if ((name_list = PyList_New(0)) == NULL)
3263 goto err;
3264
3265 if ((addr_list = PyList_New(0)) == NULL)
3266 goto err;
3267
3268 /* SF #1511317: h_aliases can be NULL */
3269 if (h->h_aliases) {
3270 for (pch = h->h_aliases; *pch != NULL; pch++) {
3271 int status;
3272 tmp = PyString_FromString(*pch);
3273 if (tmp == NULL)
3274 goto err;
3275
3276 status = PyList_Append(name_list, tmp);
3277 Py_DECREF(tmp);
3278
3279 if (status)
3280 goto err;
3281 }
3282 }
3283
3284 for (pch = h->h_addr_list; *pch != NULL; pch++) {
3285 int status;
3286
3287 switch (af) {
3288
3289 case AF_INET:
3290 {
3291 struct sockaddr_in sin;
3292 memset(&sin, 0, sizeof(sin));
3293 sin.sin_family = af;
3294 #ifdef HAVE_SOCKADDR_SA_LEN
3295 sin.sin_len = sizeof(sin);
3296 #endif
3297 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
3298 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
3299
3300 if (pch == h->h_addr_list && alen >= sizeof(sin))
3301 memcpy((char *) addr, &sin, sizeof(sin));
3302 break;
3303 }
3304
3305 #ifdef ENABLE_IPV6
3306 case AF_INET6:
3307 {
3308 struct sockaddr_in6 sin6;
3309 memset(&sin6, 0, sizeof(sin6));
3310 sin6.sin6_family = af;
3311 #ifdef HAVE_SOCKADDR_SA_LEN
3312 sin6.sin6_len = sizeof(sin6);
3313 #endif
3314 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
3315 tmp = makeipaddr((struct sockaddr *)&sin6,
3316 sizeof(sin6));
3317
3318 if (pch == h->h_addr_list && alen >= sizeof(sin6))
3319 memcpy((char *) addr, &sin6, sizeof(sin6));
3320 break;
3321 }
3322 #endif
3323
3324 default: /* can't happen */
3325 PyErr_SetString(socket_error,
3326 "unsupported address family");
3327 return NULL;
3328 }
3329
3330 if (tmp == NULL)
3331 goto err;
3332
3333 status = PyList_Append(addr_list, tmp);
3334 Py_DECREF(tmp);
3335
3336 if (status)
3337 goto err;
3338 }
3339
3340 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
3341
3342 err:
3343 Py_XDECREF(name_list);
3344 Py_XDECREF(addr_list);
3345 return rtn_tuple;
3346 }
3347
3348
3349 /* Python interface to gethostbyname_ex(name). */
3350
3351 /*ARGSUSED*/
3352 static PyObject *
3353 socket_gethostbyname_ex(PyObject *self, PyObject *args)
3354 {
3355 char *name;
3356 struct hostent *h;
3357 #ifdef ENABLE_IPV6
3358 struct sockaddr_storage addr;
3359 #else
3360 struct sockaddr_in addr;
3361 #endif
3362 struct sockaddr *sa;
3363 PyObject *ret;
3364 #ifdef HAVE_GETHOSTBYNAME_R
3365 struct hostent hp_allocated;
3366 #ifdef HAVE_GETHOSTBYNAME_R_3_ARG
3367 struct hostent_data data;
3368 #else
3369 char buf[16384];
3370 int buf_len = (sizeof buf) - 1;
3371 int errnop;
3372 #endif
3373 #if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
3374 int result;
(emitted by gcc) (emitted by gcc) 3375 #endif
3376 #endif /* HAVE_GETHOSTBYNAME_R */
3377
3378 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
3379 return NULL;
3380 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
3381 return NULL;
3382 Py_BEGIN_ALLOW_THREADS
3383 #ifdef HAVE_GETHOSTBYNAME_R
3384 #if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
3385 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
(emitted by clang-analyzer)TODO: a detailed trace is available in the data model (not yet rendered in this report)
(emitted by clang-analyzer)TODO: a detailed trace is available in the data model (not yet rendered in this report)
3386 &h, &errnop);
3387 #elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
3388 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
3389 #else /* HAVE_GETHOSTBYNAME_R_3_ARG */
3390 memset((void *) &data, '\0', sizeof(data));
3391 result = gethostbyname_r(name, &hp_allocated, &data);
3392 h = (result != 0) ? NULL : &hp_allocated;
3393 #endif
3394 #else /* not HAVE_GETHOSTBYNAME_R */
3395 #ifdef USE_GETHOSTBYNAME_LOCK
3396 PyThread_acquire_lock(netdb_lock, 1);
3397 #endif
3398 h = gethostbyname(name);
3399 #endif /* HAVE_GETHOSTBYNAME_R */
3400 Py_END_ALLOW_THREADS
3401 /* Some C libraries would require addr.__ss_family instead of
3402 addr.ss_family.
3403 Therefore, we cast the sockaddr_storage into sockaddr to
3404 access sa_family. */
3405 sa = (struct sockaddr*)&addr;
3406 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
3407 sa->sa_family);
3408 #ifdef USE_GETHOSTBYNAME_LOCK
3409 PyThread_release_lock(netdb_lock);
3410 #endif
3411 return ret;
3412 }
3413
3414 PyDoc_STRVAR(ghbn_ex_doc,
3415 "gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
3416 \n\
3417 Return the true host name, a list of aliases, and a list of IP addresses,\n\
3418 for a host. The host argument is a string giving a host name or IP number.");
3419
3420
3421 /* Python interface to gethostbyaddr(IP). */
3422
3423 /*ARGSUSED*/
3424 static PyObject *
3425 socket_gethostbyaddr(PyObject *self, PyObject *args)
3426 {
3427 #ifdef ENABLE_IPV6
3428 struct sockaddr_storage addr;
3429 #else
3430 struct sockaddr_in addr;
3431 #endif
3432 struct sockaddr *sa = (struct sockaddr *)&addr;
3433 char *ip_num;
3434 struct hostent *h;
3435 PyObject *ret;
3436 #ifdef HAVE_GETHOSTBYNAME_R
3437 struct hostent hp_allocated;
3438 #ifdef HAVE_GETHOSTBYNAME_R_3_ARG
3439 struct hostent_data data;
3440 #else
3441 /* glibcs up to 2.10 assume that the buf argument to
3442 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
3443 does not ensure. The attribute below instructs the compiler
3444 to maintain this alignment. */
3445 char buf[16384] Py_ALIGNED(8);
3446 int buf_len = (sizeof buf) - 1;
3447 int errnop;
3448 #endif
3449 #if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
3450 int result;
(emitted by gcc) (emitted by gcc) 3451 #endif
3452 #endif /* HAVE_GETHOSTBYNAME_R */
3453 char *ap;
3454 int al;
3455 int af;
3456
3457 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
3458 return NULL;
3459 af = AF_UNSPEC;
3460 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
3461 return NULL;
3462 af = sa->sa_family;
3463 ap = NULL;
3464 switch (af) {
3465 case AF_INET:
3466 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
3467 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
3468 break;
3469 #ifdef ENABLE_IPV6
3470 case AF_INET6:
3471 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
3472 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
3473 break;
3474 #endif
3475 default:
3476 PyErr_SetString(socket_error, "unsupported address family");
3477 return NULL;
3478 }
3479 Py_BEGIN_ALLOW_THREADS
3480 #ifdef HAVE_GETHOSTBYNAME_R
3481 #if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
3482 result = gethostbyaddr_r(ap, al, af,
(emitted by clang-analyzer)TODO: a detailed trace is available in the data model (not yet rendered in this report)
(emitted by clang-analyzer)TODO: a detailed trace is available in the data model (not yet rendered in this report)
3483 &hp_allocated, buf, buf_len,
3484 &h, &errnop);
3485 #elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
3486 h = gethostbyaddr_r(ap, al, af,
3487 &hp_allocated, buf, buf_len, &errnop);
3488 #else /* HAVE_GETHOSTBYNAME_R_3_ARG */
3489 memset((void *) &data, '\0', sizeof(data));
3490 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
3491 h = (result != 0) ? NULL : &hp_allocated;
3492 #endif
3493 #else /* not HAVE_GETHOSTBYNAME_R */
3494 #ifdef USE_GETHOSTBYNAME_LOCK
3495 PyThread_acquire_lock(netdb_lock, 1);
3496 #endif
3497 h = gethostbyaddr(ap, al, af);
3498 #endif /* HAVE_GETHOSTBYNAME_R */
3499 Py_END_ALLOW_THREADS
3500 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
3501 #ifdef USE_GETHOSTBYNAME_LOCK
3502 PyThread_release_lock(netdb_lock);
3503 #endif
3504 return ret;
3505 }
3506
3507 PyDoc_STRVAR(gethostbyaddr_doc,
3508 "gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
3509 \n\
3510 Return the true host name, a list of aliases, and a list of IP addresses,\n\
3511 for a host. The host argument is a string giving a host name or IP number.");
3512
3513
3514 /* Python interface to getservbyname(name).
3515 This only returns the port number, since the other info is already
3516 known or not useful (like the list of aliases). */
3517
3518 /*ARGSUSED*/
3519 static PyObject *
3520 socket_getservbyname(PyObject *self, PyObject *args)
3521 {
3522 char *name, *proto=NULL;
3523 struct servent *sp;
3524 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
3525 return NULL;
3526 Py_BEGIN_ALLOW_THREADS
3527 sp = getservbyname(name, proto);
3528 Py_END_ALLOW_THREADS
3529 if (sp == NULL) {
3530 PyErr_SetString(socket_error, "service/proto not found");
3531 return NULL;
3532 }
3533 return PyInt_FromLong((long) ntohs(sp->s_port));
3534 }
3535
3536 PyDoc_STRVAR(getservbyname_doc,
3537 "getservbyname(servicename[, protocolname]) -> integer\n\
3538 \n\
3539 Return a port number from a service name and protocol name.\n\
3540 The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3541 otherwise any protocol will match.");
3542
3543
3544 /* Python interface to getservbyport(port).
3545 This only returns the service name, since the other info is already
3546 known or not useful (like the list of aliases). */
3547
3548 /*ARGSUSED*/
3549 static PyObject *
3550 socket_getservbyport(PyObject *self, PyObject *args)
3551 {
3552 int port;
3553 char *proto=NULL;
3554 struct servent *sp;
3555 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
3556 return NULL;
3557 if (port < 0 || port > 0xffff) {
3558 PyErr_SetString(
3559 PyExc_OverflowError,
3560 "getservbyport: port must be 0-65535.");
3561 return NULL;
3562 }
3563 Py_BEGIN_ALLOW_THREADS
3564 sp = getservbyport(htons((short)port), proto);
3565 Py_END_ALLOW_THREADS
3566 if (sp == NULL) {
3567 PyErr_SetString(socket_error, "port/proto not found");
3568 return NULL;
3569 }
3570 return PyString_FromString(sp->s_name);
3571 }
3572
3573 PyDoc_STRVAR(getservbyport_doc,
3574 "getservbyport(port[, protocolname]) -> string\n\
3575 \n\
3576 Return the service name from a port number and protocol name.\n\
3577 The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3578 otherwise any protocol will match.");
3579
3580 /* Python interface to getprotobyname(name).
3581 This only returns the protocol number, since the other info is
3582 already known or not useful (like the list of aliases). */
3583
3584 /*ARGSUSED*/
3585 static PyObject *
3586 socket_getprotobyname(PyObject *self, PyObject *args)
3587 {
3588 char *name;
3589 struct protoent *sp;
3590 #ifdef __BEOS__
3591 /* Not available in BeOS yet. - [cjh] */
3592 PyErr_SetString(socket_error, "getprotobyname not supported");
3593 return NULL;
3594 #else
3595 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
3596 return NULL;
3597 Py_BEGIN_ALLOW_THREADS
3598 sp = getprotobyname(name);
3599 Py_END_ALLOW_THREADS
3600 if (sp == NULL) {
3601 PyErr_SetString(socket_error, "protocol not found");
3602 return NULL;
3603 }
3604 return PyInt_FromLong((long) sp->p_proto);
3605 #endif
3606 }
3607
3608 PyDoc_STRVAR(getprotobyname_doc,
3609 "getprotobyname(name) -> integer\n\
3610 \n\
3611 Return the protocol number for the named protocol. (Rarely used.)");
3612
3613
3614 #ifdef HAVE_SOCKETPAIR
3615 /* Create a pair of sockets using the socketpair() function.
3616 Arguments as for socket() except the default family is AF_UNIX if
3617 defined on the platform; otherwise, the default is AF_INET. */
3618
3619 /*ARGSUSED*/
3620 static PyObject *
3621 socket_socketpair(PyObject *self, PyObject *args)
3622 {
3623 PySocketSockObject *s0 = NULL, *s1 = NULL;
3624 SOCKET_T sv[2];
3625 int family, type = SOCK_STREAM, proto = 0;
3626 PyObject *res = NULL;
3627
3628 #if defined(AF_UNIX)
3629 family = AF_UNIX;
3630 #else
3631 family = AF_INET;
3632 #endif
3633 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3634 &family, &type, &proto))
3635 return NULL;
3636 /* Create a pair of socket fds */
3637 if (socketpair(family, type, proto, sv) < 0)
3638 return set_error();
3639 s0 = new_sockobject(sv[0], family, type, proto);
3640 if (s0 == NULL)
3641 goto finally;
3642 s1 = new_sockobject(sv[1], family, type, proto);
3643 if (s1 == NULL)
3644 goto finally;
3645 res = PyTuple_Pack(2, s0, s1);
3646
3647 finally:
3648 if (res == NULL) {
3649 if (s0 == NULL)
3650 SOCKETCLOSE(sv[0]);
3651 if (s1 == NULL)
3652 SOCKETCLOSE(sv[1]);
3653 }
3654 Py_XDECREF(s0);
3655 Py_XDECREF(s1);
3656 return res;
3657 }
3658
3659 PyDoc_STRVAR(socketpair_doc,
3660 "socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3661 \n\
3662 Create a pair of socket objects from the sockets returned by the platform\n\
3663 socketpair() function.\n\
3664 The arguments are the same as for socket() except the default family is\n\
3665 AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
3666
3667 #endif /* HAVE_SOCKETPAIR */
3668
3669
3670 #ifndef NO_DUP
3671 /* Create a socket object from a numeric file description.
3672 Useful e.g. if stdin is a socket.
3673 Additional arguments as for socket(). */
3674
3675 /*ARGSUSED*/
3676 static PyObject *
3677 socket_fromfd(PyObject *self, PyObject *args)
3678 {
3679 PySocketSockObject *s;
3680 SOCKET_T fd;
3681 int family, type, proto = 0;
3682 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
3683 &fd, &family, &type, &proto))
3684 return NULL;
3685 /* Dup the fd so it and the socket can be closed independently */
3686 fd = dup(fd);
3687 if (fd < 0)
3688 return set_error();
3689 s = new_sockobject(fd, family, type, proto);
3690 return (PyObject *) s;
3691 }
3692
3693 PyDoc_STRVAR(fromfd_doc,
3694 "fromfd(fd, family, type[, proto]) -> socket object\n\
3695 \n\
3696 Create a socket object from a duplicate of the given\n\
3697 file descriptor.\n\
3698 The remaining arguments are the same as for socket().");
3699
3700 #endif /* NO_DUP */
3701
3702
3703 static PyObject *
3704 socket_ntohs(PyObject *self, PyObject *args)
3705 {
3706 int x1, x2;
3707
3708 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
3709 return NULL;
3710 }
3711 if (x1 < 0) {
3712 PyErr_SetString(PyExc_OverflowError,
3713 "can't convert negative number to unsigned long");
3714 return NULL;
3715 }
3716 x2 = (unsigned int)ntohs((unsigned short)x1);
3717 return PyInt_FromLong(x2);
3718 }
3719
3720 PyDoc_STRVAR(ntohs_doc,
3721 "ntohs(integer) -> integer\n\
3722 \n\
3723 Convert a 16-bit integer from network to host byte order.");
3724
3725
3726 static PyObject *
3727 socket_ntohl(PyObject *self, PyObject *arg)
3728 {
3729 unsigned long x;
3730
3731 if (PyInt_Check(arg)) {
3732 x = PyInt_AS_LONG(arg);
3733 if (x == (unsigned long) -1 && PyErr_Occurred())
3734 return NULL;
3735 if ((long)x < 0) {
3736 PyErr_SetString(PyExc_OverflowError,
3737 "can't convert negative number to unsigned long");
3738 return NULL;
3739 }
3740 }
3741 else if (PyLong_Check(arg)) {
3742 x = PyLong_AsUnsignedLong(arg);
3743 if (x == (unsigned long) -1 && PyErr_Occurred())
3744 return NULL;
3745 #if SIZEOF_LONG > 4
3746 {
3747 unsigned long y;
3748 /* only want the trailing 32 bits */
3749 y = x & 0xFFFFFFFFUL;
3750 if (y ^ x)
3751 return PyErr_Format(PyExc_OverflowError,
3752 "long int larger than 32 bits");
3753 x = y;
3754 }
3755 #endif
3756 }
3757 else
3758 return PyErr_Format(PyExc_TypeError,
3759 "expected int/long, %s found",
3760 Py_TYPE(arg)->tp_name);
3761 if (x == (unsigned long) -1 && PyErr_Occurred())
3762 return NULL;
3763 return PyLong_FromUnsignedLong(ntohl(x));
3764 }
3765
3766 PyDoc_STRVAR(ntohl_doc,
3767 "ntohl(integer) -> integer\n\
3768 \n\
3769 Convert a 32-bit integer from network to host byte order.");
3770
3771
3772 static PyObject *
3773 socket_htons(PyObject *self, PyObject *args)
3774 {
3775 int x1, x2;
3776
3777 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
3778 return NULL;
3779 }
3780 if (x1 < 0) {
3781 PyErr_SetString(PyExc_OverflowError,
3782 "can't convert negative number to unsigned long");
3783 return NULL;
3784 }
3785 x2 = (unsigned int)htons((unsigned short)x1);
3786 return PyInt_FromLong(x2);
3787 }
3788
3789 PyDoc_STRVAR(htons_doc,
3790 "htons(integer) -> integer\n\
3791 \n\
3792 Convert a 16-bit integer from host to network byte order.");
3793
3794
3795 static PyObject *
3796 socket_htonl(PyObject *self, PyObject *arg)
3797 {
3798 unsigned long x;
3799
3800 if (PyInt_Check(arg)) {
3801 x = PyInt_AS_LONG(arg);
3802 if (x == (unsigned long) -1 && PyErr_Occurred())
3803 return NULL;
3804 if ((long)x < 0) {
3805 PyErr_SetString(PyExc_OverflowError,
3806 "can't convert negative number to unsigned long");
3807 return NULL;
3808 }
3809 }
3810 else if (PyLong_Check(arg)) {
3811 x = PyLong_AsUnsignedLong(arg);
3812 if (x == (unsigned long) -1 && PyErr_Occurred())
3813 return NULL;
3814 #if SIZEOF_LONG > 4
3815 {
3816 unsigned long y;
3817 /* only want the trailing 32 bits */
3818 y = x & 0xFFFFFFFFUL;
3819 if (y ^ x)
3820 return PyErr_Format(PyExc_OverflowError,
3821 "long int larger than 32 bits");
3822 x = y;
3823 }
3824 #endif
3825 }
3826 else
3827 return PyErr_Format(PyExc_TypeError,
3828 "expected int/long, %s found",
3829 Py_TYPE(arg)->tp_name);
3830 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
3831 }
3832
3833 PyDoc_STRVAR(htonl_doc,
3834 "htonl(integer) -> integer\n\
3835 \n\
3836 Convert a 32-bit integer from host to network byte order.");
3837
3838 /* socket.inet_aton() and socket.inet_ntoa() functions. */
3839
3840 PyDoc_STRVAR(inet_aton_doc,
3841 "inet_aton(string) -> packed 32-bit IP representation\n\
3842 \n\
3843 Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
3844 binary format used in low-level network functions.");
3845
3846 static PyObject*
3847 socket_inet_aton(PyObject *self, PyObject *args)
3848 {
3849 #ifndef INADDR_NONE
3850 #define INADDR_NONE (-1)
3851 #endif
3852 #ifdef HAVE_INET_ATON
3853 struct in_addr buf;
3854 #endif
3855
3856 #if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
3857 #if (SIZEOF_INT != 4)
3858 #error "Not sure if in_addr_t exists and int is not 32-bits."
3859 #endif
3860 /* Have to use inet_addr() instead */
3861 unsigned int packed_addr;
3862 #endif
3863 char *ip_addr;
3864
3865 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
3866 return NULL;
3867
3868
3869 #ifdef HAVE_INET_ATON
3870
3871 #ifdef USE_INET_ATON_WEAKLINK
3872 if (inet_aton != NULL) {
3873 #endif
3874 if (inet_aton(ip_addr, &buf))
3875 return PyString_FromStringAndSize((char *)(&buf),
3876 sizeof(buf));
3877
3878 PyErr_SetString(socket_error,
3879 "illegal IP address string passed to inet_aton");
3880 return NULL;
3881
3882 #ifdef USE_INET_ATON_WEAKLINK
3883 } else {
3884 #endif
3885
3886 #endif
3887
3888 #if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
3889
3890 /* special-case this address as inet_addr might return INADDR_NONE
3891 * for this */
3892 if (strcmp(ip_addr, "255.255.255.255") == 0) {
3893 packed_addr = 0xFFFFFFFF;
3894 } else {
3895
3896 packed_addr = inet_addr(ip_addr);
3897
3898 if (packed_addr == INADDR_NONE) { /* invalid address */
3899 PyErr_SetString(socket_error,
3900 "illegal IP address string passed to inet_aton");
3901 return NULL;
3902 }
3903 }
3904 return PyString_FromStringAndSize((char *) &packed_addr,
3905 sizeof(packed_addr));
3906
3907 #ifdef USE_INET_ATON_WEAKLINK
3908 }
3909 #endif
3910
3911 #endif
3912 }
3913
3914 PyDoc_STRVAR(inet_ntoa_doc,
3915 "inet_ntoa(packed_ip) -> ip_address_string\n\
3916 \n\
3917 Convert an IP address from 32-bit packed binary format to string format");
3918
3919 static PyObject*
3920 socket_inet_ntoa(PyObject *self, PyObject *args)
3921 {
3922 char *packed_str;
3923 int addr_len;
3924 struct in_addr packed_addr;
3925
3926 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
3927 return NULL;
3928 }
3929
3930 if (addr_len != sizeof(packed_addr)) {
3931 PyErr_SetString(socket_error,
3932 "packed IP wrong length for inet_ntoa");
3933 return NULL;
3934 }
3935
3936 memcpy(&packed_addr, packed_str, addr_len);
3937
3938 return PyString_FromString(inet_ntoa(packed_addr));
3939 }
3940
3941 #ifdef HAVE_INET_PTON
3942
3943 PyDoc_STRVAR(inet_pton_doc,
3944 "inet_pton(af, ip) -> packed IP address string\n\
3945 \n\
3946 Convert an IP address from string format to a packed string suitable\n\
3947 for use with low-level network functions.");
3948
3949 static PyObject *
3950 socket_inet_pton(PyObject *self, PyObject *args)
3951 {
3952 int af;
3953 char* ip;
3954 int retval;
3955 #ifdef ENABLE_IPV6
3956 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
3957 #else
3958 char packed[sizeof(struct in_addr)];
3959 #endif
3960 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3961 return NULL;
3962 }
3963
3964 #if !defined(ENABLE_IPV6) && defined(AF_INET6)
3965 if(af == AF_INET6) {
3966 PyErr_SetString(socket_error,
3967 "can't use AF_INET6, IPv6 is disabled");
3968 return NULL;
3969 }
3970 #endif
3971
3972 retval = inet_pton(af, ip, packed);
3973 if (retval < 0) {
3974 PyErr_SetFromErrno(socket_error);
3975 return NULL;
3976 } else if (retval == 0) {
3977 PyErr_SetString(socket_error,
3978 "illegal IP address string passed to inet_pton");
3979 return NULL;
3980 } else if (af == AF_INET) {
3981 return PyString_FromStringAndSize(packed,
3982 sizeof(struct in_addr));
3983 #ifdef ENABLE_IPV6
3984 } else if (af == AF_INET6) {
3985 return PyString_FromStringAndSize(packed,
3986 sizeof(struct in6_addr));
3987 #endif
3988 } else {
3989 PyErr_SetString(socket_error, "unknown address family");
3990 return NULL;
3991 }
3992 }
3993
3994 PyDoc_STRVAR(inet_ntop_doc,
3995 "inet_ntop(af, packed_ip) -> string formatted IP address\n\
3996 \n\
3997 Convert a packed IP address of the given family to string format.");
3998
3999 static PyObject *
4000 socket_inet_ntop(PyObject *self, PyObject *args)
4001 {
4002 int af;
4003 char* packed;
4004 int len;
4005 const char* retval;
4006 #ifdef ENABLE_IPV6
4007 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
4008 #else
4009 char ip[INET_ADDRSTRLEN + 1];
4010 #endif
4011
4012 /* Guarantee NUL-termination for PyString_FromString() below */
4013 memset((void *) &ip[0], '\0', sizeof(ip));
4014
4015 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
4016 return NULL;
4017 }
4018
4019 if (af == AF_INET) {
4020 if (len != sizeof(struct in_addr)) {
4021 PyErr_SetString(PyExc_ValueError,
4022 "invalid length of packed IP address string");
4023 return NULL;
4024 }
4025 #ifdef ENABLE_IPV6
4026 } else if (af == AF_INET6) {
4027 if (len != sizeof(struct in6_addr)) {
4028 PyErr_SetString(PyExc_ValueError,
4029 "invalid length of packed IP address string");
4030 return NULL;
4031 }
4032 #endif
4033 } else {
4034 PyErr_Format(PyExc_ValueError,
4035 "unknown address family %d", af);
4036 return NULL;
4037 }
4038
4039 retval = inet_ntop(af, packed, ip, sizeof(ip));
4040 if (!retval) {
4041 PyErr_SetFromErrno(socket_error);
4042 return NULL;
4043 } else {
4044 return PyString_FromString(retval);
4045 }
4046
4047 /* NOTREACHED */
4048 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
4049 return NULL;
4050 }
4051
4052 #endif /* HAVE_INET_PTON */
4053
4054 /* Python interface to getaddrinfo(host, port). */
4055
4056 /*ARGSUSED*/
4057 static PyObject *
4058 socket_getaddrinfo(PyObject *self, PyObject *args)
4059 {
4060 struct addrinfo hints, *res;
4061 struct addrinfo *res0 = NULL;
4062 PyObject *hobj = NULL;
4063 PyObject *pobj = (PyObject *)NULL;
4064 char pbuf[30];
4065 char *hptr, *pptr;
4066 int family, socktype, protocol, flags;
4067 int error;
4068 PyObject *all = (PyObject *)NULL;
4069 PyObject *single = (PyObject *)NULL;
4070 PyObject *idna = NULL;
4071
4072 family = socktype = protocol = flags = 0;
4073 family = AF_UNSPEC;
4074 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
4075 &hobj, &pobj, &family, &socktype,
4076 &protocol, &flags)) {
4077 return NULL;
4078 }
4079 if (hobj == Py_None) {
4080 hptr = NULL;
4081 } else if (PyUnicode_Check(hobj)) {
4082 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
4083 if (!idna)
4084 return NULL;
4085 hptr = PyString_AsString(idna);
4086 } else if (PyString_Check(hobj)) {
4087 hptr = PyString_AsString(hobj);
4088 } else {
4089 PyErr_SetString(PyExc_TypeError,
4090 "getaddrinfo() argument 1 must be string or None");
4091 return NULL;
4092 }
4093 if (PyInt_Check(pobj)) {
4094 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
4095 pptr = pbuf;
4096 } else if (PyString_Check(pobj)) {
4097 pptr = PyString_AsString(pobj);
4098 } else if (pobj == Py_None) {
4099 pptr = (char *)NULL;
4100 } else {
4101 PyErr_SetString(socket_error, "Int or String expected");
4102 goto err;
4103 }
4104 memset(&hints, 0, sizeof(hints));
4105 hints.ai_family = family;
4106 hints.ai_socktype = socktype;
4107 hints.ai_protocol = protocol;
4108 hints.ai_flags = flags;
4109 Py_BEGIN_ALLOW_THREADS
4110 ACQUIRE_GETADDRINFO_LOCK
4111 error = getaddrinfo(hptr, pptr, &hints, &res0);
4112 Py_END_ALLOW_THREADS
4113 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4114 if (error) {
4115 set_gaierror(error);
4116 goto err;
4117 }
4118
4119 if ((all = PyList_New(0)) == NULL)
4120 goto err;
4121 for (res = res0; res; res = res->ai_next) {
4122 PyObject *addr =
4123 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
4124 if (addr == NULL)
4125 goto err;
4126 single = Py_BuildValue("iiisO", res->ai_family,
4127 res->ai_socktype, res->ai_protocol,
4128 res->ai_canonname ? res->ai_canonname : "",
4129 addr);
4130 Py_DECREF(addr);
4131 if (single == NULL)
4132 goto err;
4133
4134 if (PyList_Append(all, single))
4135 goto err;
4136 Py_XDECREF(single);
4137 }
4138 Py_XDECREF(idna);
4139 if (res0)
4140 freeaddrinfo(res0);
4141 return all;
4142 err:
4143 Py_XDECREF(single);
4144 Py_XDECREF(all);
4145 Py_XDECREF(idna);
4146 if (res0)
4147 freeaddrinfo(res0);
4148 return (PyObject *)NULL;
4149 }
4150
4151 PyDoc_STRVAR(getaddrinfo_doc,
4152 "getaddrinfo(host, port [, family, socktype, proto, flags])\n\
4153 -> list of (family, socktype, proto, canonname, sockaddr)\n\
4154 \n\
4155 Resolve host and port into addrinfo struct.");
4156
4157 /* Python interface to getnameinfo(sa, flags). */
4158
4159 /*ARGSUSED*/
4160 static PyObject *
4161 socket_getnameinfo(PyObject *self, PyObject *args)
4162 {
4163 PyObject *sa = (PyObject *)NULL;
4164 int flags;
4165 char *hostp;
4166 int port;
4167 unsigned int flowinfo, scope_id;
4168 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
4169 struct addrinfo hints, *res = NULL;
4170 int error;
4171 PyObject *ret = (PyObject *)NULL;
4172
4173 flags = flowinfo = scope_id = 0;
4174 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
4175 return NULL;
4176 if (!PyTuple_Check(sa)) {
4177 PyErr_SetString(PyExc_TypeError,
4178 "getnameinfo() argument 1 must be a tuple");
4179 return NULL;
4180 }
4181 if (!PyArg_ParseTuple(sa, "si|II",
4182 &hostp, &port, &flowinfo, &scope_id))
4183 return NULL;
4184 if (flowinfo < 0 || flowinfo > 0xfffff) {
4185 PyErr_SetString(PyExc_OverflowError,
4186 "getsockaddrarg: flowinfo must be 0-1048575.");
4187 return NULL;
4188 }
4189 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
4190 memset(&hints, 0, sizeof(hints));
4191 hints.ai_family = AF_UNSPEC;
4192 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
4193 Py_BEGIN_ALLOW_THREADS
4194 ACQUIRE_GETADDRINFO_LOCK
4195 error = getaddrinfo(hostp, pbuf, &hints, &res);
4196 Py_END_ALLOW_THREADS
4197 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
4198 if (error) {
4199 set_gaierror(error);
4200 goto fail;
4201 }
4202 if (res->ai_next) {
4203 PyErr_SetString(socket_error,
4204 "sockaddr resolved to multiple addresses");
4205 goto fail;
4206 }
4207 switch (res->ai_family) {
4208 case AF_INET:
4209 {
4210 if (PyTuple_GET_SIZE(sa) != 2) {
4211 PyErr_SetString(socket_error,
4212 "IPv4 sockaddr must be 2 tuple");
4213 goto fail;
4214 }
4215 break;
4216 }
4217 #ifdef ENABLE_IPV6
4218 case AF_INET6:
4219 {
4220 struct sockaddr_in6 *sin6;
4221 sin6 = (struct sockaddr_in6 *)res->ai_addr;
4222 sin6->sin6_flowinfo = htonl(flowinfo);
4223 sin6->sin6_scope_id = scope_id;
4224 break;
4225 }
4226 #endif
4227 }
4228 error = getnameinfo(res->ai_addr, res->ai_addrlen,
4229 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
4230 if (error) {
4231 set_gaierror(error);
4232 goto fail;
4233 }
4234 ret = Py_BuildValue("ss", hbuf, pbuf);
4235
4236 fail:
4237 if (res)
4238 freeaddrinfo(res);
4239 return ret;
4240 }
4241
4242 PyDoc_STRVAR(getnameinfo_doc,
4243 "getnameinfo(sockaddr, flags) --> (host, port)\n\
4244 \n\
4245 Get host and port for a sockaddr.");
4246
4247
4248 /* Python API to getting and setting the default timeout value. */
4249
4250 static PyObject *
4251 socket_getdefaulttimeout(PyObject *self)
4252 {
4253 if (defaulttimeout < 0.0) {
4254 Py_INCREF(Py_None);
4255 return Py_None;
4256 }
4257 else
4258 return PyFloat_FromDouble(defaulttimeout);
4259 }
4260
4261 PyDoc_STRVAR(getdefaulttimeout_doc,
4262 "getdefaulttimeout() -> timeout\n\
4263 \n\
4264 Returns the default timeout in seconds (float) for new socket objects.\n\
4265 A value of None indicates that new socket objects have no timeout.\n\
4266 When the socket module is first imported, the default is None.");
4267
4268 static PyObject *
4269 socket_setdefaulttimeout(PyObject *self, PyObject *arg)
4270 {
4271 double timeout;
4272
4273 if (arg == Py_None)
4274 timeout = -1.0;
4275 else {
4276 timeout = PyFloat_AsDouble(arg);
4277 if (timeout < 0.0) {
4278 if (!PyErr_Occurred())
4279 PyErr_SetString(PyExc_ValueError,
4280 "Timeout value out of range");
4281 return NULL;
4282 }
4283 }
4284
4285 defaulttimeout = timeout;
4286
4287 Py_INCREF(Py_None);
4288 return Py_None;
4289 }
4290
4291 PyDoc_STRVAR(setdefaulttimeout_doc,
4292 "setdefaulttimeout(timeout)\n\
4293 \n\
4294 Set the default timeout in seconds (float) for new socket objects.\n\
4295 A value of None indicates that new socket objects have no timeout.\n\
4296 When the socket module is first imported, the default is None.");
4297
4298
4299 /* List of functions exported by this module. */
4300
4301 static PyMethodDef socket_methods[] = {
4302 {"gethostbyname", socket_gethostbyname,
4303 METH_VARARGS, gethostbyname_doc},
4304 {"gethostbyname_ex", socket_gethostbyname_ex,
4305 METH_VARARGS, ghbn_ex_doc},
4306 {"gethostbyaddr", socket_gethostbyaddr,
4307 METH_VARARGS, gethostbyaddr_doc},
4308 {"gethostname", socket_gethostname,
4309 METH_NOARGS, gethostname_doc},
4310 {"getservbyname", socket_getservbyname,
4311 METH_VARARGS, getservbyname_doc},
4312 {"getservbyport", socket_getservbyport,
4313 METH_VARARGS, getservbyport_doc},
4314 {"getprotobyname", socket_getprotobyname,
4315 METH_VARARGS, getprotobyname_doc},
4316 #ifndef NO_DUP
4317 {"fromfd", socket_fromfd,
4318 METH_VARARGS, fromfd_doc},
4319 #endif
4320 #ifdef HAVE_SOCKETPAIR
4321 {"socketpair", socket_socketpair,
4322 METH_VARARGS, socketpair_doc},
4323 #endif
4324 {"ntohs", socket_ntohs,
4325 METH_VARARGS, ntohs_doc},
4326 {"ntohl", socket_ntohl,
4327 METH_O, ntohl_doc},
4328 {"htons", socket_htons,
4329 METH_VARARGS, htons_doc},
4330 {"htonl", socket_htonl,
4331 METH_O, htonl_doc},
4332 {"inet_aton", socket_inet_aton,
4333 METH_VARARGS, inet_aton_doc},
4334 {"inet_ntoa", socket_inet_ntoa,
4335 METH_VARARGS, inet_ntoa_doc},
4336 #ifdef HAVE_INET_PTON
4337 {"inet_pton", socket_inet_pton,
4338 METH_VARARGS, inet_pton_doc},
4339 {"inet_ntop", socket_inet_ntop,
4340 METH_VARARGS, inet_ntop_doc},
4341 #endif
4342 {"getaddrinfo", socket_getaddrinfo,
4343 METH_VARARGS, getaddrinfo_doc},
4344 {"getnameinfo", socket_getnameinfo,
4345 METH_VARARGS, getnameinfo_doc},
4346 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
4347 METH_NOARGS, getdefaulttimeout_doc},
4348 {"setdefaulttimeout", socket_setdefaulttimeout,
4349 METH_O, setdefaulttimeout_doc},
4350 {NULL, NULL} /* Sentinel */
4351 };
4352
4353
4354 #ifdef RISCOS
4355 #define OS_INIT_DEFINED
4356
4357 static int
4358 os_init(void)
4359 {
4360 _kernel_swi_regs r;
4361
4362 r.r[0] = 0;
4363 _kernel_swi(0x43380, &r, &r);
4364 taskwindow = r.r[0];
4365
4366 return 1;
4367 }
4368
4369 #endif /* RISCOS */
4370
4371
4372 #ifdef MS_WINDOWS
4373 #define OS_INIT_DEFINED
4374
4375 /* Additional initialization and cleanup for Windows */
4376
4377 static void
4378 os_cleanup(void)
4379 {
4380 WSACleanup();
4381 }
4382
4383 static int
4384 os_init(void)
4385 {
4386 WSADATA WSAData;
4387 int ret;
4388 char buf[100];
4389 ret = WSAStartup(0x0101, &WSAData);
4390 switch (ret) {
4391 case 0: /* No error */
4392 Py_AtExit(os_cleanup);
4393 return 1; /* Success */
4394 case WSASYSNOTREADY:
4395 PyErr_SetString(PyExc_ImportError,
4396 "WSAStartup failed: network not ready");
4397 break;
4398 case WSAVERNOTSUPPORTED:
4399 case WSAEINVAL:
4400 PyErr_SetString(
4401 PyExc_ImportError,
4402 "WSAStartup failed: requested version not supported");
4403 break;
4404 default:
4405 PyOS_snprintf(buf, sizeof(buf),
4406 "WSAStartup failed: error code %d", ret);
4407 PyErr_SetString(PyExc_ImportError, buf);
4408 break;
4409 }
4410 return 0; /* Failure */
4411 }
4412
4413 #endif /* MS_WINDOWS */
4414
4415
4416 #ifdef PYOS_OS2
4417 #define OS_INIT_DEFINED
4418
4419 /* Additional initialization for OS/2 */
4420
4421 static int
4422 os_init(void)
4423 {
4424 #ifndef PYCC_GCC
4425 char reason[64];
4426 int rc = sock_init();
4427
4428 if (rc == 0) {
4429 return 1; /* Success */
4430 }
4431
4432 PyOS_snprintf(reason, sizeof(reason),
4433 "OS/2 TCP/IP Error# %d", sock_errno());
4434 PyErr_SetString(PyExc_ImportError, reason);
4435
4436 return 0; /* Failure */
4437 #else
4438 /* No need to initialize sockets with GCC/EMX */
4439 return 1; /* Success */
4440 #endif
4441 }
4442
4443 #endif /* PYOS_OS2 */
4444
4445
4446 #ifndef OS_INIT_DEFINED
4447 static int
4448 os_init(void)
4449 {
4450 return 1; /* Success */
4451 }
4452 #endif
4453
4454
4455 /* C API table - always add new things to the end for binary
4456 compatibility. */
4457 static
4458 PySocketModule_APIObject PySocketModuleAPI =
4459 {
4460 &sock_type,
4461 NULL
4462 };
4463
4464
4465 /* Initialize the _socket module.
4466
4467 This module is actually called "_socket", and there's a wrapper
4468 "socket.py" which implements some additional functionality. On some
4469 platforms (e.g. Windows and OS/2), socket.py also implements a
4470 wrapper for the socket type that provides missing functionality such
4471 as makefile(), dup() and fromfd(). The import of "_socket" may fail
4472 with an ImportError exception if os-specific initialization fails.
4473 On Windows, this does WINSOCK initialization. When WINSOCK is
4474 initialized successfully, a call to WSACleanup() is scheduled to be
4475 made at exit time.
4476 */
4477
4478 PyDoc_STRVAR(socket_doc,
4479 "Implementation module for socket operations.\n\
4480 \n\
4481 See the socket module for documentation.");
4482
4483 PyMODINIT_FUNC
4484 init_socket(void)
4485 {
4486 PyObject *m, *has_ipv6;
4487
4488 if (!os_init())
4489 return;
4490
4491 Py_TYPE(&sock_type) = &PyType_Type;
4492 m = Py_InitModule3(PySocket_MODULE_NAME,
4493 socket_methods,
4494 socket_doc);
4495 if (m == NULL)
4496 return;
4497
4498 socket_error = PyErr_NewException("socket.error",
4499 PyExc_IOError, NULL);
4500 if (socket_error == NULL)
4501 return;
4502 PySocketModuleAPI.error = socket_error;
4503 Py_INCREF(socket_error);
4504 PyModule_AddObject(m, "error", socket_error);
4505 socket_herror = PyErr_NewException("socket.herror",
4506 socket_error, NULL);
4507 if (socket_herror == NULL)
4508 return;
4509 Py_INCREF(socket_herror);
4510 PyModule_AddObject(m, "herror", socket_herror);
4511 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
4512 NULL);
4513 if (socket_gaierror == NULL)
4514 return;
4515 Py_INCREF(socket_gaierror);
4516 PyModule_AddObject(m, "gaierror", socket_gaierror);
4517 socket_timeout = PyErr_NewException("socket.timeout",
4518 socket_error, NULL);
4519 if (socket_timeout == NULL)
4520 return;
4521 Py_INCREF(socket_timeout);
4522 PyModule_AddObject(m, "timeout", socket_timeout);
4523 Py_INCREF((PyObject *)&sock_type);
4524 if (PyModule_AddObject(m, "SocketType",
4525 (PyObject *)&sock_type) != 0)
4526 return;
4527 Py_INCREF((PyObject *)&sock_type);
4528 if (PyModule_AddObject(m, "socket",
4529 (PyObject *)&sock_type) != 0)
4530 return;
4531
4532 #ifdef ENABLE_IPV6
4533 has_ipv6 = Py_True;
4534 #else
4535 has_ipv6 = Py_False;
4536 #endif
4537 Py_INCREF(has_ipv6);
4538 PyModule_AddObject(m, "has_ipv6", has_ipv6);
4539
4540 /* Export C API */
4541 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
4542 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
4543 ) != 0)
4544 return;
4545
4546 /* Address families (we only support AF_INET and AF_UNIX) */
4547 #ifdef AF_UNSPEC
4548 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
4549 #endif
4550 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
4551 #ifdef AF_INET6
4552 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
4553 #endif /* AF_INET6 */
4554 #if defined(AF_UNIX)
4555 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
4556 #endif /* AF_UNIX */
4557 #ifdef AF_AX25
4558 /* Amateur Radio AX.25 */
4559 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
4560 #endif
4561 #ifdef AF_IPX
4562 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
4563 #endif
4564 #ifdef AF_APPLETALK
4565 /* Appletalk DDP */
4566 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
4567 #endif
4568 #ifdef AF_NETROM
4569 /* Amateur radio NetROM */
4570 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
4571 #endif
4572 #ifdef AF_BRIDGE
4573 /* Multiprotocol bridge */
4574 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
4575 #endif
4576 #ifdef AF_ATMPVC
4577 /* ATM PVCs */
4578 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
4579 #endif
4580 #ifdef AF_AAL5
4581 /* Reserved for Werner's ATM */
4582 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
4583 #endif
4584 #ifdef AF_X25
4585 /* Reserved for X.25 project */
4586 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
4587 #endif
4588 #ifdef AF_INET6
4589 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
4590 #endif
4591 #ifdef AF_ROSE
4592 /* Amateur Radio X.25 PLP */
4593 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
4594 #endif
4595 #ifdef AF_DECnet
4596 /* Reserved for DECnet project */
4597 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
4598 #endif
4599 #ifdef AF_NETBEUI
4600 /* Reserved for 802.2LLC project */
4601 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
4602 #endif
4603 #ifdef AF_SECURITY
4604 /* Security callback pseudo AF */
4605 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
4606 #endif
4607 #ifdef AF_KEY
4608 /* PF_KEY key management API */
4609 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
4610 #endif
4611 #ifdef AF_NETLINK
4612 /* */
4613 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
4614 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
4615 #ifdef NETLINK_SKIP
4616 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
4617 #endif
4618 #ifdef NETLINK_W1
4619 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
4620 #endif
4621 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
4622 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
4623 #ifdef NETLINK_TCPDIAG
4624 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
4625 #endif
4626 #ifdef NETLINK_NFLOG
4627 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
4628 #endif
4629 #ifdef NETLINK_XFRM
4630 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
4631 #endif
4632 #ifdef NETLINK_ARPD
4633 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
4634 #endif
4635 #ifdef NETLINK_ROUTE6
4636 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
4637 #endif
4638 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
4639 #ifdef NETLINK_DNRTMSG
4640 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
4641 #endif
4642 #ifdef NETLINK_TAPBASE
4643 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
4644 #endif
4645 #endif /* AF_NETLINK */
4646 #ifdef AF_ROUTE
4647 /* Alias to emulate 4.4BSD */
4648 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
4649 #endif
4650 #ifdef AF_ASH
4651 /* Ash */
4652 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
4653 #endif
4654 #ifdef AF_ECONET
4655 /* Acorn Econet */
4656 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
4657 #endif
4658 #ifdef AF_ATMSVC
4659 /* ATM SVCs */
4660 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
4661 #endif
4662 #ifdef AF_SNA
4663 /* Linux SNA Project (nutters!) */
4664 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
4665 #endif
4666 #ifdef AF_IRDA
4667 /* IRDA sockets */
4668 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
4669 #endif
4670 #ifdef AF_PPPOX
4671 /* PPPoX sockets */
4672 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
4673 #endif
4674 #ifdef AF_WANPIPE
4675 /* Wanpipe API Sockets */
4676 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
4677 #endif
4678 #ifdef AF_LLC
4679 /* Linux LLC */
4680 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
4681 #endif
4682
4683 #ifdef USE_BLUETOOTH
4684 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
4685 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
4686 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
4687 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
4688 #if !defined(__NetBSD__) && !defined(__DragonFly__)
4689 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
4690 #endif
4691 #if !defined(__FreeBSD__)
4692 #if !defined(__NetBSD__) && !defined(__DragonFly__)
4693 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
4694 #endif
4695 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
4696 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
4697 #endif
4698 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
4699 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
4700 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
4701 #endif
4702
4703 #ifdef AF_PACKET
4704 PyModule_AddIntMacro(m, AF_PACKET);
4705 #endif
4706 #ifdef PF_PACKET
4707 PyModule_AddIntMacro(m, PF_PACKET);
4708 #endif
4709 #ifdef PACKET_HOST
4710 PyModule_AddIntMacro(m, PACKET_HOST);
4711 #endif
4712 #ifdef PACKET_BROADCAST
4713 PyModule_AddIntMacro(m, PACKET_BROADCAST);
4714 #endif
4715 #ifdef PACKET_MULTICAST
4716 PyModule_AddIntMacro(m, PACKET_MULTICAST);
4717 #endif
4718 #ifdef PACKET_OTHERHOST
4719 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
4720 #endif
4721 #ifdef PACKET_OUTGOING
4722 PyModule_AddIntMacro(m, PACKET_OUTGOING);
4723 #endif
4724 #ifdef PACKET_LOOPBACK
4725 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
4726 #endif
4727 #ifdef PACKET_FASTROUTE
4728 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
4729 #endif
4730
4731 #ifdef HAVE_LINUX_TIPC_H
4732 PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);
4733
4734 /* for addresses */
4735 PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);
4736 PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);
4737 PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);
4738
4739 PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);
4740 PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);
4741 PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);
4742
4743 /* for setsockopt() */
4744 PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);
4745 PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);
4746 PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);
4747 PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",
4748 TIPC_DEST_DROPPABLE);
4749 PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);
4750
4751 PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",
4752 TIPC_LOW_IMPORTANCE);
4753 PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",
4754 TIPC_MEDIUM_IMPORTANCE);
4755 PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",
4756 TIPC_HIGH_IMPORTANCE);
4757 PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",
4758 TIPC_CRITICAL_IMPORTANCE);
4759
4760 /* for subscriptions */
4761 PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);
4762 PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);
4763 #ifdef TIPC_SUB_CANCEL
4764 /* doesn't seem to be available everywhere */
4765 PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);
4766 #endif
4767 PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);
4768 PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);
4769 PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);
4770 PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);
4771 PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);
4772 PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);
4773 #endif
4774
4775 /* Socket types */
4776 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4777 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
4778 #ifndef __BEOS__
4779 /* We have incomplete socket support. */
4780 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4781 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
4782 #if defined(SOCK_RDM)
4783 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
4784 #endif
4785 #endif
4786
4787 #ifdef SO_DEBUG
4788 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
4789 #endif
4790 #ifdef SO_ACCEPTCONN
4791 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
4792 #endif
4793 #ifdef SO_REUSEADDR
4794 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
4795 #endif
4796 #ifdef SO_EXCLUSIVEADDRUSE
4797 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
4798 #endif
4799
4800 #ifdef SO_KEEPALIVE
4801 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
4802 #endif
4803 #ifdef SO_DONTROUTE
4804 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
4805 #endif
4806 #ifdef SO_BROADCAST
4807 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
4808 #endif
4809 #ifdef SO_USELOOPBACK
4810 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
4811 #endif
4812 #ifdef SO_LINGER
4813 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
4814 #endif
4815 #ifdef SO_OOBINLINE
4816 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
4817 #endif
4818 #ifdef SO_REUSEPORT
4819 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
4820 #endif
4821 #ifdef SO_SNDBUF
4822 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
4823 #endif
4824 #ifdef SO_RCVBUF
4825 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
4826 #endif
4827 #ifdef SO_SNDLOWAT
4828 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
4829 #endif
4830 #ifdef SO_RCVLOWAT
4831 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
4832 #endif
4833 #ifdef SO_SNDTIMEO
4834 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
4835 #endif
4836 #ifdef SO_RCVTIMEO
4837 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
4838 #endif
4839 #ifdef SO_ERROR
4840 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
4841 #endif
4842 #ifdef SO_TYPE
4843 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
4844 #endif
4845 #ifdef SO_SETFIB
4846 PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
4847 #endif
4848
4849 #ifdef SO_SNDBUFFORCE
4850 PyModule_AddIntConstant(m, "SO_SNDBUFFORCE", SO_SNDBUFFORCE);
4851 #endif
4852 #ifdef SO_RCVBUFFORCE
4853 PyModule_AddIntConstant(m, "SO_RCVBUFFORCE", SO_RCVBUFFORCE);
4854 #endif
4855 #ifdef SO_NO_CHECK
4856 PyModule_AddIntConstant(m, "SO_NO_CHECK", SO_NO_CHECK);
4857 #endif
4858 #ifdef SO_PRIORITY
4859 PyModule_AddIntConstant(m, "SO_PRIORITY", SO_PRIORITY);
4860 #endif
4861 #ifdef SO_BSDCOMPAT
4862 PyModule_AddIntConstant(m, "SO_BSDCOMPAT", SO_BSDCOMPAT);
4863 #endif
4864 #ifdef SO_PASSCRED
4865 PyModule_AddIntConstant(m, "SO_PASSCRED", SO_PASSCRED);
4866 #endif
4867 #ifdef SO_PEERCRED
4868 PyModule_AddIntConstant(m, "SO_PEERCRED", SO_PEERCRED);
4869 #endif
4870 #ifdef SO_SECURITY_AUTHENTICATION
4871 PyModule_AddIntConstant(m, "SO_SECURITY_AUTHENTICATION", SO_SECURITY_AUTHENTICATION);
4872 #endif
4873 #ifdef SO_SECURITY_ENCRYPTION_TRANSPORT
4874 PyModule_AddIntConstant(m, "SO_SECURITY_ENCRYPTION_TRANSPORT", SO_SECURITY_ENCRYPTION_TRANSPORT);
4875 #endif
4876 #ifdef SO_SECURITY_ENCRYPTION_NETWORK
4877 PyModule_AddIntConstant(m, "SO_SECURITY_ENCRYPTION_NETWORK", SO_SECURITY_ENCRYPTION_NETWORK);
4878 #endif
4879 #ifdef SO_BINDTODEVICE
4880 PyModule_AddIntConstant(m, "SO_BINDTODEVICE", SO_BINDTODEVICE);
4881 #endif
4882 #ifdef SO_ATTACH_FILTER
4883 PyModule_AddIntConstant(m, "SO_ATTACH_FILTER", SO_ATTACH_FILTER);
4884 #endif
4885 #ifdef SO_DETACH_FILTER
4886 PyModule_AddIntConstant(m, "SO_DETACH_FILTER", SO_DETACH_FILTER);
4887 #endif
4888 #ifdef SO_PEERNAME
4889 PyModule_AddIntConstant(m, "SO_PEERNAME", SO_PEERNAME);
4890 #endif
4891 #ifdef SO_TIMESTAMP
4892 PyModule_AddIntConstant(m, "SO_TIMESTAMP", SO_TIMESTAMP);
4893 #endif
4894 #ifdef SO_PEERSEC
4895 PyModule_AddIntConstant(m, "SO_PEERSEC", SO_PEERSEC);
4896 #endif
4897 #ifdef SO_PASSSEC
4898 PyModule_AddIntConstant(m, "SO_PASSSEC", SO_PASSSEC);
4899 #endif
4900 #ifdef SO_TIMESTAMPNS
4901 PyModule_AddIntConstant(m, "SO_TIMESTAMPNS", SO_TIMESTAMPNS);
4902 #endif
4903
4904 /* Maximum number of connections for "listen" */
4905 #ifdef SOMAXCONN
4906 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
4907 #else
4908 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
4909 #endif
4910
4911 /* Flags for send, recv */
4912 #ifdef MSG_OOB
4913 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
4914 #endif
4915 #ifdef MSG_PEEK
4916 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
4917 #endif
4918 #ifdef MSG_DONTROUTE
4919 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
4920 #endif
4921 #ifdef MSG_DONTWAIT
4922 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
4923 #endif
4924 #ifdef MSG_EOR
4925 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
4926 #endif
4927 #ifdef MSG_TRUNC
4928 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
4929 #endif
4930 #ifdef MSG_CTRUNC
4931 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
4932 #endif
4933 #ifdef MSG_WAITALL
4934 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
4935 #endif
4936 #ifdef MSG_BTAG
4937 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
4938 #endif
4939 #ifdef MSG_ETAG
4940 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
4941 #endif
4942
4943 /* Protocol level and numbers, usable for [gs]etsockopt */
4944 #ifdef SOL_SOCKET
4945 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
4946 #endif
4947 #ifdef SOL_IP
4948 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
4949 #else
4950 PyModule_AddIntConstant(m, "SOL_IP", 0);
4951 #endif
4952 #ifdef SOL_IPX
4953 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
4954 #endif
4955 #ifdef SOL_AX25
4956 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
4957 #endif
4958 #ifdef SOL_ATALK
4959 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
4960 #endif
4961 #ifdef SOL_NETROM
4962 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
4963 #endif
4964 #ifdef SOL_ROSE
4965 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
4966 #endif
4967 #ifdef SOL_TCP
4968 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
4969 #else
4970 PyModule_AddIntConstant(m, "SOL_TCP", 6);
4971 #endif
4972 #ifdef SOL_UDP
4973 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
4974 #else
4975 PyModule_AddIntConstant(m, "SOL_UDP", 17);
4976 #endif
4977 #ifdef IPPROTO_IP
4978 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
4979 #else
4980 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
4981 #endif
4982 #ifdef IPPROTO_HOPOPTS
4983 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
4984 #endif
4985 #ifdef IPPROTO_ICMP
4986 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
4987 #else
4988 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
4989 #endif
4990 #ifdef IPPROTO_IGMP
4991 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
4992 #endif
4993 #ifdef IPPROTO_GGP
4994 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
4995 #endif
4996 #ifdef IPPROTO_IPV4
4997 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
4998 #endif
4999 #ifdef IPPROTO_IPV6
5000 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
5001 #endif
5002 #ifdef IPPROTO_IPIP
5003 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
5004 #endif
5005 #ifdef IPPROTO_TCP
5006 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
5007 #else
5008 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
5009 #endif
5010 #ifdef IPPROTO_EGP
5011 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
5012 #endif
5013 #ifdef IPPROTO_PUP
5014 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
5015 #endif
5016 #ifdef IPPROTO_UDP
5017 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
5018 #else
5019 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
5020 #endif
5021 #ifdef IPPROTO_IDP
5022 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
5023 #endif
5024 #ifdef IPPROTO_HELLO
5025 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
5026 #endif
5027 #ifdef IPPROTO_ND
5028 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
5029 #endif
5030 #ifdef IPPROTO_TP
5031 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
5032 #endif
5033 #ifdef IPPROTO_IPV6
5034 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
5035 #endif
5036 #ifdef IPPROTO_ROUTING
5037 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
5038 #endif
5039 #ifdef IPPROTO_FRAGMENT
5040 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
5041 #endif
5042 #ifdef IPPROTO_RSVP
5043 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
5044 #endif
5045 #ifdef IPPROTO_GRE
5046 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
5047 #endif
5048 #ifdef IPPROTO_ESP
5049 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
5050 #endif
5051 #ifdef IPPROTO_AH
5052 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
5053 #endif
5054 #ifdef IPPROTO_MOBILE
5055 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
5056 #endif
5057 #ifdef IPPROTO_ICMPV6
5058 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
5059 #endif
5060 #ifdef IPPROTO_NONE
5061 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
5062 #endif
5063 #ifdef IPPROTO_DSTOPTS
5064 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
5065 #endif
5066 #ifdef IPPROTO_XTP
5067 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
5068 #endif
5069 #ifdef IPPROTO_EON
5070 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
5071 #endif
5072 #ifdef IPPROTO_PIM
5073 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
5074 #endif
5075 #ifdef IPPROTO_IPCOMP
5076 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
5077 #endif
5078 #ifdef IPPROTO_VRRP
5079 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
5080 #endif
5081 #ifdef IPPROTO_BIP
5082 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
5083 #endif
5084 /**/
5085 #ifdef IPPROTO_RAW
5086 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
5087 #else
5088 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
5089 #endif
5090 #ifdef IPPROTO_MAX
5091 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
5092 #endif
5093
5094 /* Some port configuration */
5095 #ifdef IPPORT_RESERVED
5096 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
5097 #else
5098 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
5099 #endif
5100 #ifdef IPPORT_USERRESERVED
5101 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
5102 #else
5103 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
5104 #endif
5105
5106 /* Some reserved IP v.4 addresses */
5107 #ifdef INADDR_ANY
5108 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
5109 #else
5110 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
5111 #endif
5112 #ifdef INADDR_BROADCAST
5113 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
5114 #else
5115 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
5116 #endif
5117 #ifdef INADDR_LOOPBACK
5118 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
5119 #else
5120 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
5121 #endif
5122 #ifdef INADDR_UNSPEC_GROUP
5123 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
5124 #else
5125 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
5126 #endif
5127 #ifdef INADDR_ALLHOSTS_GROUP
5128 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
5129 INADDR_ALLHOSTS_GROUP);
5130 #else
5131 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
5132 #endif
5133 #ifdef INADDR_MAX_LOCAL_GROUP
5134 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
5135 INADDR_MAX_LOCAL_GROUP);
5136 #else
5137 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
5138 #endif
5139 #ifdef INADDR_NONE
5140 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
5141 #else
5142 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
5143 #endif
5144
5145 /* IPv4 [gs]etsockopt options */
5146 #ifdef IP_OPTIONS
5147 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
5148 #endif
5149 #ifdef IP_HDRINCL
5150 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
5151 #endif
5152 #ifdef IP_TOS
5153 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
5154 #endif
5155 #ifdef IP_TTL
5156 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
5157 #endif
5158 #ifdef IP_RECVOPTS
5159 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
5160 #endif
5161 #ifdef IP_RECVRETOPTS
5162 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
5163 #endif
5164 #ifdef IP_RECVDSTADDR
5165 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
5166 #endif
5167 #ifdef IP_RETOPTS
5168 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
5169 #endif
5170 #ifdef IP_MULTICAST_IF
5171 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
5172 #endif
5173 #ifdef IP_MULTICAST_TTL
5174 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
5175 #endif
5176 #ifdef IP_MULTICAST_LOOP
5177 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
5178 #endif
5179 #ifdef IP_ADD_MEMBERSHIP
5180 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
5181 #endif
5182 #ifdef IP_DROP_MEMBERSHIP
5183 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
5184 #endif
5185 #ifdef IP_DEFAULT_MULTICAST_TTL
5186 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
5187 IP_DEFAULT_MULTICAST_TTL);
5188 #endif
5189 #ifdef IP_DEFAULT_MULTICAST_LOOP
5190 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
5191 IP_DEFAULT_MULTICAST_LOOP);
5192 #endif
5193 #ifdef IP_MAX_MEMBERSHIPS
5194 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
5195 #endif
5196
5197 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
5198 #ifdef IPV6_JOIN_GROUP
5199 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
5200 #endif
5201 #ifdef IPV6_LEAVE_GROUP
5202 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
5203 #endif
5204 #ifdef IPV6_MULTICAST_HOPS
5205 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
5206 #endif
5207 #ifdef IPV6_MULTICAST_IF
5208 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
5209 #endif
5210 #ifdef IPV6_MULTICAST_LOOP
5211 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
5212 #endif
5213 #ifdef IPV6_UNICAST_HOPS
5214 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
5215 #endif
5216 /* Additional IPV6 socket options, defined in RFC 3493 */
5217 #ifdef IPV6_V6ONLY
5218 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
5219 #endif
5220 /* Advanced IPV6 socket options, from RFC 3542 */
5221 #ifdef IPV6_CHECKSUM
5222 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
5223 #endif
5224 #ifdef IPV6_DONTFRAG
5225 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
5226 #endif
5227 #ifdef IPV6_DSTOPTS
5228 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
5229 #endif
5230 #ifdef IPV6_HOPLIMIT
5231 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
5232 #endif
5233 #ifdef IPV6_HOPOPTS
5234 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
5235 #endif
5236 #ifdef IPV6_NEXTHOP
5237 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
5238 #endif
5239 #ifdef IPV6_PATHMTU
5240 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
5241 #endif
5242 #ifdef IPV6_PKTINFO
5243 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
5244 #endif
5245 #ifdef IPV6_RECVDSTOPTS
5246 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
5247 #endif
5248 #ifdef IPV6_RECVHOPLIMIT
5249 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
5250 #endif
5251 #ifdef IPV6_RECVHOPOPTS
5252 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
5253 #endif
5254 #ifdef IPV6_RECVPKTINFO
5255 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
5256 #endif
5257 #ifdef IPV6_RECVRTHDR
5258 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
5259 #endif
5260 #ifdef IPV6_RECVTCLASS
5261 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
5262 #endif
5263 #ifdef IPV6_RTHDR
5264 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
5265 #endif
5266 #ifdef IPV6_RTHDRDSTOPTS
5267 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
5268 #endif
5269 #ifdef IPV6_RTHDR_TYPE_0
5270 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
5271 #endif
5272 #ifdef IPV6_RECVPATHMTU
5273 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
5274 #endif
5275 #ifdef IPV6_TCLASS
5276 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
5277 #endif
5278 #ifdef IPV6_USE_MIN_MTU
5279 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
5280 #endif
5281
5282 /* TCP options */
5283 #ifdef TCP_NODELAY
5284 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
5285 #endif
5286 #ifdef TCP_MAXSEG
5287 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
5288 #endif
5289 #ifdef TCP_CORK
5290 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
5291 #endif
5292 #ifdef TCP_KEEPIDLE
5293 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
5294 #endif
5295 #ifdef TCP_KEEPINTVL
5296 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
5297 #endif
5298 #ifdef TCP_KEEPCNT
5299 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
5300 #endif
5301 #ifdef TCP_SYNCNT
5302 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
5303 #endif
5304 #ifdef TCP_LINGER2
5305 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
5306 #endif
5307 #ifdef TCP_DEFER_ACCEPT
5308 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
5309 #endif
5310 #ifdef TCP_WINDOW_CLAMP
5311 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
5312 #endif
5313 #ifdef TCP_INFO
5314 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
5315 #endif
5316 #ifdef TCP_QUICKACK
5317 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
5318 #endif
5319 #ifdef TCP_CONGESTION
5320 PyModule_AddIntConstant(m, "TCP_CONGESTION", TCP_CONGESTION);
5321 #endif
5322 #ifdef TCP_MD5SIG
5323 PyModule_AddIntConstant(m, "TCP_MD5SIG", TCP_MD5SIG);
5324 #endif
5325 #ifdef TCP_MD5SIG_MAXKEYLEN
5326 PyModule_AddIntConstant(m, "TCP_MD5SIG_MAXKEYLEN", TCP_MD5SIG_MAXKEYLEN);
5327 #endif
5328
5329
5330 /* IPX options */
5331 #ifdef IPX_TYPE
5332 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
5333 #endif
5334
5335 /* get{addr,name}info parameters */
5336 #ifdef EAI_ADDRFAMILY
5337 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
5338 #endif
5339 #ifdef EAI_AGAIN
5340 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
5341 #endif
5342 #ifdef EAI_BADFLAGS
5343 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
5344 #endif
5345 #ifdef EAI_FAIL
5346 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
5347 #endif
5348 #ifdef EAI_FAMILY
5349 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
5350 #endif
5351 #ifdef EAI_MEMORY
5352 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
5353 #endif
5354 #ifdef EAI_NODATA
5355 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
5356 #endif
5357 #ifdef EAI_NONAME
5358 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
5359 #endif
5360 #ifdef EAI_OVERFLOW
5361 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
5362 #endif
5363 #ifdef EAI_SERVICE
5364 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
5365 #endif
5366 #ifdef EAI_SOCKTYPE
5367 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
5368 #endif
5369 #ifdef EAI_SYSTEM
5370 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
5371 #endif
5372 #ifdef EAI_BADHINTS
5373 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
5374 #endif
5375 #ifdef EAI_PROTOCOL
5376 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
5377 #endif
5378 #ifdef EAI_MAX
5379 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
5380 #endif
5381 #ifdef AI_PASSIVE
5382 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
5383 #endif
5384 #ifdef AI_CANONNAME
5385 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
5386 #endif
5387 #ifdef AI_NUMERICHOST
5388 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
5389 #endif
5390 #ifdef AI_NUMERICSERV
5391 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
5392 #endif
5393 #ifdef AI_MASK
5394 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
5395 #endif
5396 #ifdef AI_ALL
5397 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
5398 #endif
5399 #ifdef AI_V4MAPPED_CFG
5400 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
5401 #endif
5402 #ifdef AI_ADDRCONFIG
5403 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
5404 #endif
5405 #ifdef AI_V4MAPPED
5406 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
5407 #endif
5408 #ifdef AI_DEFAULT
5409 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
5410 #endif
5411 #ifdef NI_MAXHOST
5412 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
5413 #endif
5414 #ifdef NI_MAXSERV
5415 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
5416 #endif
5417 #ifdef NI_NOFQDN
5418 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
5419 #endif
5420 #ifdef NI_NUMERICHOST
5421 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
5422 #endif
5423 #ifdef NI_NAMEREQD
5424 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
5425 #endif
5426 #ifdef NI_NUMERICSERV
5427 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
5428 #endif
5429 #ifdef NI_DGRAM
5430 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
5431 #endif
5432
5433 /* shutdown() parameters */
5434 #ifdef SHUT_RD
5435 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
5436 #elif defined(SD_RECEIVE)
5437 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
5438 #else
5439 PyModule_AddIntConstant(m, "SHUT_RD", 0);
5440 #endif
5441 #ifdef SHUT_WR
5442 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
5443 #elif defined(SD_SEND)
5444 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
5445 #else
5446 PyModule_AddIntConstant(m, "SHUT_WR", 1);
5447 #endif
5448 #ifdef SHUT_RDWR
5449 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
5450 #elif defined(SD_BOTH)
5451 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
5452 #else
5453 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
5454 #endif
5455
5456 #ifdef SIO_RCVALL
5457 {
5458 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
5459 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
5460 int i;
5461 for(i = 0; i<sizeof(codes)/sizeof(*codes); ++i) {
5462 PyObject *tmp;
5463 tmp = PyLong_FromUnsignedLong(codes[i]);
5464 if (tmp == NULL)
5465 return;
5466 PyModule_AddObject(m, names[i], tmp);
5467 }
5468 }
5469 PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);
5470 PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);
5471 PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);
5472 #ifdef RCVALL_IPLEVEL
5473 PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);
5474 #endif
5475 #ifdef RCVALL_MAX
5476 PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);
5477 #endif
5478 #endif /* _MSTCPIP_ */
5479
5480 /* Initialize gethostbyname lock */
5481 #if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
5482 netdb_lock = PyThread_allocate_lock();
5483 #endif
5484 }
5485
5486
5487 #ifndef HAVE_INET_PTON
5488 #if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
5489
5490 /* Simplistic emulation code for inet_pton that only works for IPv4 */
5491 /* These are not exposed because they do not set errno properly */
5492
5493 int
5494 inet_pton(int af, const char *src, void *dst)
5495 {
5496 if (af == AF_INET) {
5497 #if (SIZEOF_INT != 4)
5498 #error "Not sure if in_addr_t exists and int is not 32-bits."
5499 #endif
5500 unsigned int packed_addr;
5501 packed_addr = inet_addr(src);
5502 if (packed_addr == INADDR_NONE)
5503 return 0;
5504 memcpy(dst, &packed_addr, 4);
5505 return 1;
5506 }
5507 /* Should set errno to EAFNOSUPPORT */
5508 return -1;
5509 }
5510
5511 const char *
5512 inet_ntop(int af, const void *src, char *dst, socklen_t size)
5513 {
5514 if (af == AF_INET) {
5515 struct in_addr packed_addr;
5516 if (size < 16)
5517 /* Should set errno to ENOSPC. */
5518 return NULL;
5519 memcpy(&packed_addr, src, sizeof(packed_addr));
5520 return strncpy(dst, inet_ntoa(packed_addr), size);
5521 }
5522 /* Should set errno to EAFNOSUPPORT */
5523 return NULL;
5524 }
5525
5526 #endif
5527 #endif