17db96d56Sopenharmony_ci# Wrapper module for _socket, providing some additional facilities 27db96d56Sopenharmony_ci# implemented in Python. 37db96d56Sopenharmony_ci 47db96d56Sopenharmony_ci"""\ 57db96d56Sopenharmony_ciThis module provides socket operations and some related functions. 67db96d56Sopenharmony_ciOn Unix, it supports IP (Internet Protocol) and Unix domain sockets. 77db96d56Sopenharmony_ciOn other systems, it only supports IP. Functions specific for a 87db96d56Sopenharmony_cisocket are available as methods of the socket object. 97db96d56Sopenharmony_ci 107db96d56Sopenharmony_ciFunctions: 117db96d56Sopenharmony_ci 127db96d56Sopenharmony_cisocket() -- create a new socket object 137db96d56Sopenharmony_cisocketpair() -- create a pair of new socket objects [*] 147db96d56Sopenharmony_cifromfd() -- create a socket object from an open file descriptor [*] 157db96d56Sopenharmony_cisend_fds() -- Send file descriptor to the socket. 167db96d56Sopenharmony_cirecv_fds() -- Receive file descriptors from the socket. 177db96d56Sopenharmony_cifromshare() -- create a socket object from data received from socket.share() [*] 187db96d56Sopenharmony_cigethostname() -- return the current hostname 197db96d56Sopenharmony_cigethostbyname() -- map a hostname to its IP number 207db96d56Sopenharmony_cigethostbyaddr() -- map an IP number or hostname to DNS info 217db96d56Sopenharmony_cigetservbyname() -- map a service name and a protocol name to a port number 227db96d56Sopenharmony_cigetprotobyname() -- map a protocol name (e.g. 'tcp') to a number 237db96d56Sopenharmony_cintohs(), ntohl() -- convert 16, 32 bit int from network to host byte order 247db96d56Sopenharmony_cihtons(), htonl() -- convert 16, 32 bit int from host to network byte order 257db96d56Sopenharmony_ciinet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format 267db96d56Sopenharmony_ciinet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89) 277db96d56Sopenharmony_cisocket.getdefaulttimeout() -- get the default timeout value 287db96d56Sopenharmony_cisocket.setdefaulttimeout() -- set the default timeout value 297db96d56Sopenharmony_cicreate_connection() -- connects to an address, with an optional timeout and 307db96d56Sopenharmony_ci optional source address. 317db96d56Sopenharmony_ci 327db96d56Sopenharmony_ci [*] not available on all platforms! 337db96d56Sopenharmony_ci 347db96d56Sopenharmony_ciSpecial objects: 357db96d56Sopenharmony_ci 367db96d56Sopenharmony_ciSocketType -- type object for socket objects 377db96d56Sopenharmony_cierror -- exception raised for I/O errors 387db96d56Sopenharmony_cihas_ipv6 -- boolean value indicating if IPv6 is supported 397db96d56Sopenharmony_ci 407db96d56Sopenharmony_ciIntEnum constants: 417db96d56Sopenharmony_ci 427db96d56Sopenharmony_ciAF_INET, AF_UNIX -- socket domains (first argument to socket() call) 437db96d56Sopenharmony_ciSOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument) 447db96d56Sopenharmony_ci 457db96d56Sopenharmony_ciInteger constants: 467db96d56Sopenharmony_ci 477db96d56Sopenharmony_ciMany other constants may be defined; these may be used in calls to 487db96d56Sopenharmony_cithe setsockopt() and getsockopt() methods. 497db96d56Sopenharmony_ci""" 507db96d56Sopenharmony_ci 517db96d56Sopenharmony_ciimport _socket 527db96d56Sopenharmony_cifrom _socket import * 537db96d56Sopenharmony_ci 547db96d56Sopenharmony_ciimport os, sys, io, selectors 557db96d56Sopenharmony_cifrom enum import IntEnum, IntFlag 567db96d56Sopenharmony_ci 577db96d56Sopenharmony_citry: 587db96d56Sopenharmony_ci import errno 597db96d56Sopenharmony_ciexcept ImportError: 607db96d56Sopenharmony_ci errno = None 617db96d56Sopenharmony_ciEBADF = getattr(errno, 'EBADF', 9) 627db96d56Sopenharmony_ciEAGAIN = getattr(errno, 'EAGAIN', 11) 637db96d56Sopenharmony_ciEWOULDBLOCK = getattr(errno, 'EWOULDBLOCK', 11) 647db96d56Sopenharmony_ci 657db96d56Sopenharmony_ci__all__ = ["fromfd", "getfqdn", "create_connection", "create_server", 667db96d56Sopenharmony_ci "has_dualstack_ipv6", "AddressFamily", "SocketKind"] 677db96d56Sopenharmony_ci__all__.extend(os._get_exports_list(_socket)) 687db96d56Sopenharmony_ci 697db96d56Sopenharmony_ci# Set up the socket.AF_* socket.SOCK_* constants as members of IntEnums for 707db96d56Sopenharmony_ci# nicer string representations. 717db96d56Sopenharmony_ci# Note that _socket only knows about the integer values. The public interface 727db96d56Sopenharmony_ci# in this module understands the enums and translates them back from integers 737db96d56Sopenharmony_ci# where needed (e.g. .family property of a socket object). 747db96d56Sopenharmony_ci 757db96d56Sopenharmony_ciIntEnum._convert_( 767db96d56Sopenharmony_ci 'AddressFamily', 777db96d56Sopenharmony_ci __name__, 787db96d56Sopenharmony_ci lambda C: C.isupper() and C.startswith('AF_')) 797db96d56Sopenharmony_ci 807db96d56Sopenharmony_ciIntEnum._convert_( 817db96d56Sopenharmony_ci 'SocketKind', 827db96d56Sopenharmony_ci __name__, 837db96d56Sopenharmony_ci lambda C: C.isupper() and C.startswith('SOCK_')) 847db96d56Sopenharmony_ci 857db96d56Sopenharmony_ciIntFlag._convert_( 867db96d56Sopenharmony_ci 'MsgFlag', 877db96d56Sopenharmony_ci __name__, 887db96d56Sopenharmony_ci lambda C: C.isupper() and C.startswith('MSG_')) 897db96d56Sopenharmony_ci 907db96d56Sopenharmony_ciIntFlag._convert_( 917db96d56Sopenharmony_ci 'AddressInfo', 927db96d56Sopenharmony_ci __name__, 937db96d56Sopenharmony_ci lambda C: C.isupper() and C.startswith('AI_')) 947db96d56Sopenharmony_ci 957db96d56Sopenharmony_ci_LOCALHOST = '127.0.0.1' 967db96d56Sopenharmony_ci_LOCALHOST_V6 = '::1' 977db96d56Sopenharmony_ci 987db96d56Sopenharmony_ci 997db96d56Sopenharmony_cidef _intenum_converter(value, enum_klass): 1007db96d56Sopenharmony_ci """Convert a numeric family value to an IntEnum member. 1017db96d56Sopenharmony_ci 1027db96d56Sopenharmony_ci If it's not a known member, return the numeric value itself. 1037db96d56Sopenharmony_ci """ 1047db96d56Sopenharmony_ci try: 1057db96d56Sopenharmony_ci return enum_klass(value) 1067db96d56Sopenharmony_ci except ValueError: 1077db96d56Sopenharmony_ci return value 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ci 1107db96d56Sopenharmony_ci# WSA error codes 1117db96d56Sopenharmony_ciif sys.platform.lower().startswith("win"): 1127db96d56Sopenharmony_ci errorTab = {} 1137db96d56Sopenharmony_ci errorTab[6] = "Specified event object handle is invalid." 1147db96d56Sopenharmony_ci errorTab[8] = "Insufficient memory available." 1157db96d56Sopenharmony_ci errorTab[87] = "One or more parameters are invalid." 1167db96d56Sopenharmony_ci errorTab[995] = "Overlapped operation aborted." 1177db96d56Sopenharmony_ci errorTab[996] = "Overlapped I/O event object not in signaled state." 1187db96d56Sopenharmony_ci errorTab[997] = "Overlapped operation will complete later." 1197db96d56Sopenharmony_ci errorTab[10004] = "The operation was interrupted." 1207db96d56Sopenharmony_ci errorTab[10009] = "A bad file handle was passed." 1217db96d56Sopenharmony_ci errorTab[10013] = "Permission denied." 1227db96d56Sopenharmony_ci errorTab[10014] = "A fault occurred on the network??" # WSAEFAULT 1237db96d56Sopenharmony_ci errorTab[10022] = "An invalid operation was attempted." 1247db96d56Sopenharmony_ci errorTab[10024] = "Too many open files." 1257db96d56Sopenharmony_ci errorTab[10035] = "The socket operation would block." 1267db96d56Sopenharmony_ci errorTab[10036] = "A blocking operation is already in progress." 1277db96d56Sopenharmony_ci errorTab[10037] = "Operation already in progress." 1287db96d56Sopenharmony_ci errorTab[10038] = "Socket operation on nonsocket." 1297db96d56Sopenharmony_ci errorTab[10039] = "Destination address required." 1307db96d56Sopenharmony_ci errorTab[10040] = "Message too long." 1317db96d56Sopenharmony_ci errorTab[10041] = "Protocol wrong type for socket." 1327db96d56Sopenharmony_ci errorTab[10042] = "Bad protocol option." 1337db96d56Sopenharmony_ci errorTab[10043] = "Protocol not supported." 1347db96d56Sopenharmony_ci errorTab[10044] = "Socket type not supported." 1357db96d56Sopenharmony_ci errorTab[10045] = "Operation not supported." 1367db96d56Sopenharmony_ci errorTab[10046] = "Protocol family not supported." 1377db96d56Sopenharmony_ci errorTab[10047] = "Address family not supported by protocol family." 1387db96d56Sopenharmony_ci errorTab[10048] = "The network address is in use." 1397db96d56Sopenharmony_ci errorTab[10049] = "Cannot assign requested address." 1407db96d56Sopenharmony_ci errorTab[10050] = "Network is down." 1417db96d56Sopenharmony_ci errorTab[10051] = "Network is unreachable." 1427db96d56Sopenharmony_ci errorTab[10052] = "Network dropped connection on reset." 1437db96d56Sopenharmony_ci errorTab[10053] = "Software caused connection abort." 1447db96d56Sopenharmony_ci errorTab[10054] = "The connection has been reset." 1457db96d56Sopenharmony_ci errorTab[10055] = "No buffer space available." 1467db96d56Sopenharmony_ci errorTab[10056] = "Socket is already connected." 1477db96d56Sopenharmony_ci errorTab[10057] = "Socket is not connected." 1487db96d56Sopenharmony_ci errorTab[10058] = "The network has been shut down." 1497db96d56Sopenharmony_ci errorTab[10059] = "Too many references." 1507db96d56Sopenharmony_ci errorTab[10060] = "The operation timed out." 1517db96d56Sopenharmony_ci errorTab[10061] = "Connection refused." 1527db96d56Sopenharmony_ci errorTab[10062] = "Cannot translate name." 1537db96d56Sopenharmony_ci errorTab[10063] = "The name is too long." 1547db96d56Sopenharmony_ci errorTab[10064] = "The host is down." 1557db96d56Sopenharmony_ci errorTab[10065] = "The host is unreachable." 1567db96d56Sopenharmony_ci errorTab[10066] = "Directory not empty." 1577db96d56Sopenharmony_ci errorTab[10067] = "Too many processes." 1587db96d56Sopenharmony_ci errorTab[10068] = "User quota exceeded." 1597db96d56Sopenharmony_ci errorTab[10069] = "Disk quota exceeded." 1607db96d56Sopenharmony_ci errorTab[10070] = "Stale file handle reference." 1617db96d56Sopenharmony_ci errorTab[10071] = "Item is remote." 1627db96d56Sopenharmony_ci errorTab[10091] = "Network subsystem is unavailable." 1637db96d56Sopenharmony_ci errorTab[10092] = "Winsock.dll version out of range." 1647db96d56Sopenharmony_ci errorTab[10093] = "Successful WSAStartup not yet performed." 1657db96d56Sopenharmony_ci errorTab[10101] = "Graceful shutdown in progress." 1667db96d56Sopenharmony_ci errorTab[10102] = "No more results from WSALookupServiceNext." 1677db96d56Sopenharmony_ci errorTab[10103] = "Call has been canceled." 1687db96d56Sopenharmony_ci errorTab[10104] = "Procedure call table is invalid." 1697db96d56Sopenharmony_ci errorTab[10105] = "Service provider is invalid." 1707db96d56Sopenharmony_ci errorTab[10106] = "Service provider failed to initialize." 1717db96d56Sopenharmony_ci errorTab[10107] = "System call failure." 1727db96d56Sopenharmony_ci errorTab[10108] = "Service not found." 1737db96d56Sopenharmony_ci errorTab[10109] = "Class type not found." 1747db96d56Sopenharmony_ci errorTab[10110] = "No more results from WSALookupServiceNext." 1757db96d56Sopenharmony_ci errorTab[10111] = "Call was canceled." 1767db96d56Sopenharmony_ci errorTab[10112] = "Database query was refused." 1777db96d56Sopenharmony_ci errorTab[11001] = "Host not found." 1787db96d56Sopenharmony_ci errorTab[11002] = "Nonauthoritative host not found." 1797db96d56Sopenharmony_ci errorTab[11003] = "This is a nonrecoverable error." 1807db96d56Sopenharmony_ci errorTab[11004] = "Valid name, no data record requested type." 1817db96d56Sopenharmony_ci errorTab[11005] = "QoS receivers." 1827db96d56Sopenharmony_ci errorTab[11006] = "QoS senders." 1837db96d56Sopenharmony_ci errorTab[11007] = "No QoS senders." 1847db96d56Sopenharmony_ci errorTab[11008] = "QoS no receivers." 1857db96d56Sopenharmony_ci errorTab[11009] = "QoS request confirmed." 1867db96d56Sopenharmony_ci errorTab[11010] = "QoS admission error." 1877db96d56Sopenharmony_ci errorTab[11011] = "QoS policy failure." 1887db96d56Sopenharmony_ci errorTab[11012] = "QoS bad style." 1897db96d56Sopenharmony_ci errorTab[11013] = "QoS bad object." 1907db96d56Sopenharmony_ci errorTab[11014] = "QoS traffic control error." 1917db96d56Sopenharmony_ci errorTab[11015] = "QoS generic error." 1927db96d56Sopenharmony_ci errorTab[11016] = "QoS service type error." 1937db96d56Sopenharmony_ci errorTab[11017] = "QoS flowspec error." 1947db96d56Sopenharmony_ci errorTab[11018] = "Invalid QoS provider buffer." 1957db96d56Sopenharmony_ci errorTab[11019] = "Invalid QoS filter style." 1967db96d56Sopenharmony_ci errorTab[11020] = "Invalid QoS filter style." 1977db96d56Sopenharmony_ci errorTab[11021] = "Incorrect QoS filter count." 1987db96d56Sopenharmony_ci errorTab[11022] = "Invalid QoS object length." 1997db96d56Sopenharmony_ci errorTab[11023] = "Incorrect QoS flow count." 2007db96d56Sopenharmony_ci errorTab[11024] = "Unrecognized QoS object." 2017db96d56Sopenharmony_ci errorTab[11025] = "Invalid QoS policy object." 2027db96d56Sopenharmony_ci errorTab[11026] = "Invalid QoS flow descriptor." 2037db96d56Sopenharmony_ci errorTab[11027] = "Invalid QoS provider-specific flowspec." 2047db96d56Sopenharmony_ci errorTab[11028] = "Invalid QoS provider-specific filterspec." 2057db96d56Sopenharmony_ci errorTab[11029] = "Invalid QoS shape discard mode object." 2067db96d56Sopenharmony_ci errorTab[11030] = "Invalid QoS shaping rate object." 2077db96d56Sopenharmony_ci errorTab[11031] = "Reserved policy QoS element type." 2087db96d56Sopenharmony_ci __all__.append("errorTab") 2097db96d56Sopenharmony_ci 2107db96d56Sopenharmony_ci 2117db96d56Sopenharmony_ciclass _GiveupOnSendfile(Exception): pass 2127db96d56Sopenharmony_ci 2137db96d56Sopenharmony_ci 2147db96d56Sopenharmony_ciclass socket(_socket.socket): 2157db96d56Sopenharmony_ci 2167db96d56Sopenharmony_ci """A subclass of _socket.socket adding the makefile() method.""" 2177db96d56Sopenharmony_ci 2187db96d56Sopenharmony_ci __slots__ = ["__weakref__", "_io_refs", "_closed"] 2197db96d56Sopenharmony_ci 2207db96d56Sopenharmony_ci def __init__(self, family=-1, type=-1, proto=-1, fileno=None): 2217db96d56Sopenharmony_ci # For user code address family and type values are IntEnum members, but 2227db96d56Sopenharmony_ci # for the underlying _socket.socket they're just integers. The 2237db96d56Sopenharmony_ci # constructor of _socket.socket converts the given argument to an 2247db96d56Sopenharmony_ci # integer automatically. 2257db96d56Sopenharmony_ci if fileno is None: 2267db96d56Sopenharmony_ci if family == -1: 2277db96d56Sopenharmony_ci family = AF_INET 2287db96d56Sopenharmony_ci if type == -1: 2297db96d56Sopenharmony_ci type = SOCK_STREAM 2307db96d56Sopenharmony_ci if proto == -1: 2317db96d56Sopenharmony_ci proto = 0 2327db96d56Sopenharmony_ci _socket.socket.__init__(self, family, type, proto, fileno) 2337db96d56Sopenharmony_ci self._io_refs = 0 2347db96d56Sopenharmony_ci self._closed = False 2357db96d56Sopenharmony_ci 2367db96d56Sopenharmony_ci def __enter__(self): 2377db96d56Sopenharmony_ci return self 2387db96d56Sopenharmony_ci 2397db96d56Sopenharmony_ci def __exit__(self, *args): 2407db96d56Sopenharmony_ci if not self._closed: 2417db96d56Sopenharmony_ci self.close() 2427db96d56Sopenharmony_ci 2437db96d56Sopenharmony_ci def __repr__(self): 2447db96d56Sopenharmony_ci """Wrap __repr__() to reveal the real class name and socket 2457db96d56Sopenharmony_ci address(es). 2467db96d56Sopenharmony_ci """ 2477db96d56Sopenharmony_ci closed = getattr(self, '_closed', False) 2487db96d56Sopenharmony_ci s = "<%s.%s%s fd=%i, family=%s, type=%s, proto=%i" \ 2497db96d56Sopenharmony_ci % (self.__class__.__module__, 2507db96d56Sopenharmony_ci self.__class__.__qualname__, 2517db96d56Sopenharmony_ci " [closed]" if closed else "", 2527db96d56Sopenharmony_ci self.fileno(), 2537db96d56Sopenharmony_ci self.family, 2547db96d56Sopenharmony_ci self.type, 2557db96d56Sopenharmony_ci self.proto) 2567db96d56Sopenharmony_ci if not closed: 2577db96d56Sopenharmony_ci # getsockname and getpeername may not be available on WASI. 2587db96d56Sopenharmony_ci try: 2597db96d56Sopenharmony_ci laddr = self.getsockname() 2607db96d56Sopenharmony_ci if laddr: 2617db96d56Sopenharmony_ci s += ", laddr=%s" % str(laddr) 2627db96d56Sopenharmony_ci except (error, AttributeError): 2637db96d56Sopenharmony_ci pass 2647db96d56Sopenharmony_ci try: 2657db96d56Sopenharmony_ci raddr = self.getpeername() 2667db96d56Sopenharmony_ci if raddr: 2677db96d56Sopenharmony_ci s += ", raddr=%s" % str(raddr) 2687db96d56Sopenharmony_ci except (error, AttributeError): 2697db96d56Sopenharmony_ci pass 2707db96d56Sopenharmony_ci s += '>' 2717db96d56Sopenharmony_ci return s 2727db96d56Sopenharmony_ci 2737db96d56Sopenharmony_ci def __getstate__(self): 2747db96d56Sopenharmony_ci raise TypeError(f"cannot pickle {self.__class__.__name__!r} object") 2757db96d56Sopenharmony_ci 2767db96d56Sopenharmony_ci def dup(self): 2777db96d56Sopenharmony_ci """dup() -> socket object 2787db96d56Sopenharmony_ci 2797db96d56Sopenharmony_ci Duplicate the socket. Return a new socket object connected to the same 2807db96d56Sopenharmony_ci system resource. The new socket is non-inheritable. 2817db96d56Sopenharmony_ci """ 2827db96d56Sopenharmony_ci fd = dup(self.fileno()) 2837db96d56Sopenharmony_ci sock = self.__class__(self.family, self.type, self.proto, fileno=fd) 2847db96d56Sopenharmony_ci sock.settimeout(self.gettimeout()) 2857db96d56Sopenharmony_ci return sock 2867db96d56Sopenharmony_ci 2877db96d56Sopenharmony_ci def accept(self): 2887db96d56Sopenharmony_ci """accept() -> (socket object, address info) 2897db96d56Sopenharmony_ci 2907db96d56Sopenharmony_ci Wait for an incoming connection. Return a new socket 2917db96d56Sopenharmony_ci representing the connection, and the address of the client. 2927db96d56Sopenharmony_ci For IP sockets, the address info is a pair (hostaddr, port). 2937db96d56Sopenharmony_ci """ 2947db96d56Sopenharmony_ci fd, addr = self._accept() 2957db96d56Sopenharmony_ci sock = socket(self.family, self.type, self.proto, fileno=fd) 2967db96d56Sopenharmony_ci # Issue #7995: if no default timeout is set and the listening 2977db96d56Sopenharmony_ci # socket had a (non-zero) timeout, force the new socket in blocking 2987db96d56Sopenharmony_ci # mode to override platform-specific socket flags inheritance. 2997db96d56Sopenharmony_ci if getdefaulttimeout() is None and self.gettimeout(): 3007db96d56Sopenharmony_ci sock.setblocking(True) 3017db96d56Sopenharmony_ci return sock, addr 3027db96d56Sopenharmony_ci 3037db96d56Sopenharmony_ci def makefile(self, mode="r", buffering=None, *, 3047db96d56Sopenharmony_ci encoding=None, errors=None, newline=None): 3057db96d56Sopenharmony_ci """makefile(...) -> an I/O stream connected to the socket 3067db96d56Sopenharmony_ci 3077db96d56Sopenharmony_ci The arguments are as for io.open() after the filename, except the only 3087db96d56Sopenharmony_ci supported mode values are 'r' (default), 'w' and 'b'. 3097db96d56Sopenharmony_ci """ 3107db96d56Sopenharmony_ci # XXX refactor to share code? 3117db96d56Sopenharmony_ci if not set(mode) <= {"r", "w", "b"}: 3127db96d56Sopenharmony_ci raise ValueError("invalid mode %r (only r, w, b allowed)" % (mode,)) 3137db96d56Sopenharmony_ci writing = "w" in mode 3147db96d56Sopenharmony_ci reading = "r" in mode or not writing 3157db96d56Sopenharmony_ci assert reading or writing 3167db96d56Sopenharmony_ci binary = "b" in mode 3177db96d56Sopenharmony_ci rawmode = "" 3187db96d56Sopenharmony_ci if reading: 3197db96d56Sopenharmony_ci rawmode += "r" 3207db96d56Sopenharmony_ci if writing: 3217db96d56Sopenharmony_ci rawmode += "w" 3227db96d56Sopenharmony_ci raw = SocketIO(self, rawmode) 3237db96d56Sopenharmony_ci self._io_refs += 1 3247db96d56Sopenharmony_ci if buffering is None: 3257db96d56Sopenharmony_ci buffering = -1 3267db96d56Sopenharmony_ci if buffering < 0: 3277db96d56Sopenharmony_ci buffering = io.DEFAULT_BUFFER_SIZE 3287db96d56Sopenharmony_ci if buffering == 0: 3297db96d56Sopenharmony_ci if not binary: 3307db96d56Sopenharmony_ci raise ValueError("unbuffered streams must be binary") 3317db96d56Sopenharmony_ci return raw 3327db96d56Sopenharmony_ci if reading and writing: 3337db96d56Sopenharmony_ci buffer = io.BufferedRWPair(raw, raw, buffering) 3347db96d56Sopenharmony_ci elif reading: 3357db96d56Sopenharmony_ci buffer = io.BufferedReader(raw, buffering) 3367db96d56Sopenharmony_ci else: 3377db96d56Sopenharmony_ci assert writing 3387db96d56Sopenharmony_ci buffer = io.BufferedWriter(raw, buffering) 3397db96d56Sopenharmony_ci if binary: 3407db96d56Sopenharmony_ci return buffer 3417db96d56Sopenharmony_ci encoding = io.text_encoding(encoding) 3427db96d56Sopenharmony_ci text = io.TextIOWrapper(buffer, encoding, errors, newline) 3437db96d56Sopenharmony_ci text.mode = mode 3447db96d56Sopenharmony_ci return text 3457db96d56Sopenharmony_ci 3467db96d56Sopenharmony_ci if hasattr(os, 'sendfile'): 3477db96d56Sopenharmony_ci 3487db96d56Sopenharmony_ci def _sendfile_use_sendfile(self, file, offset=0, count=None): 3497db96d56Sopenharmony_ci self._check_sendfile_params(file, offset, count) 3507db96d56Sopenharmony_ci sockno = self.fileno() 3517db96d56Sopenharmony_ci try: 3527db96d56Sopenharmony_ci fileno = file.fileno() 3537db96d56Sopenharmony_ci except (AttributeError, io.UnsupportedOperation) as err: 3547db96d56Sopenharmony_ci raise _GiveupOnSendfile(err) # not a regular file 3557db96d56Sopenharmony_ci try: 3567db96d56Sopenharmony_ci fsize = os.fstat(fileno).st_size 3577db96d56Sopenharmony_ci except OSError as err: 3587db96d56Sopenharmony_ci raise _GiveupOnSendfile(err) # not a regular file 3597db96d56Sopenharmony_ci if not fsize: 3607db96d56Sopenharmony_ci return 0 # empty file 3617db96d56Sopenharmony_ci # Truncate to 1GiB to avoid OverflowError, see bpo-38319. 3627db96d56Sopenharmony_ci blocksize = min(count or fsize, 2 ** 30) 3637db96d56Sopenharmony_ci timeout = self.gettimeout() 3647db96d56Sopenharmony_ci if timeout == 0: 3657db96d56Sopenharmony_ci raise ValueError("non-blocking sockets are not supported") 3667db96d56Sopenharmony_ci # poll/select have the advantage of not requiring any 3677db96d56Sopenharmony_ci # extra file descriptor, contrarily to epoll/kqueue 3687db96d56Sopenharmony_ci # (also, they require a single syscall). 3697db96d56Sopenharmony_ci if hasattr(selectors, 'PollSelector'): 3707db96d56Sopenharmony_ci selector = selectors.PollSelector() 3717db96d56Sopenharmony_ci else: 3727db96d56Sopenharmony_ci selector = selectors.SelectSelector() 3737db96d56Sopenharmony_ci selector.register(sockno, selectors.EVENT_WRITE) 3747db96d56Sopenharmony_ci 3757db96d56Sopenharmony_ci total_sent = 0 3767db96d56Sopenharmony_ci # localize variable access to minimize overhead 3777db96d56Sopenharmony_ci selector_select = selector.select 3787db96d56Sopenharmony_ci os_sendfile = os.sendfile 3797db96d56Sopenharmony_ci try: 3807db96d56Sopenharmony_ci while True: 3817db96d56Sopenharmony_ci if timeout and not selector_select(timeout): 3827db96d56Sopenharmony_ci raise TimeoutError('timed out') 3837db96d56Sopenharmony_ci if count: 3847db96d56Sopenharmony_ci blocksize = count - total_sent 3857db96d56Sopenharmony_ci if blocksize <= 0: 3867db96d56Sopenharmony_ci break 3877db96d56Sopenharmony_ci try: 3887db96d56Sopenharmony_ci sent = os_sendfile(sockno, fileno, offset, blocksize) 3897db96d56Sopenharmony_ci except BlockingIOError: 3907db96d56Sopenharmony_ci if not timeout: 3917db96d56Sopenharmony_ci # Block until the socket is ready to send some 3927db96d56Sopenharmony_ci # data; avoids hogging CPU resources. 3937db96d56Sopenharmony_ci selector_select() 3947db96d56Sopenharmony_ci continue 3957db96d56Sopenharmony_ci except OSError as err: 3967db96d56Sopenharmony_ci if total_sent == 0: 3977db96d56Sopenharmony_ci # We can get here for different reasons, the main 3987db96d56Sopenharmony_ci # one being 'file' is not a regular mmap(2)-like 3997db96d56Sopenharmony_ci # file, in which case we'll fall back on using 4007db96d56Sopenharmony_ci # plain send(). 4017db96d56Sopenharmony_ci raise _GiveupOnSendfile(err) 4027db96d56Sopenharmony_ci raise err from None 4037db96d56Sopenharmony_ci else: 4047db96d56Sopenharmony_ci if sent == 0: 4057db96d56Sopenharmony_ci break # EOF 4067db96d56Sopenharmony_ci offset += sent 4077db96d56Sopenharmony_ci total_sent += sent 4087db96d56Sopenharmony_ci return total_sent 4097db96d56Sopenharmony_ci finally: 4107db96d56Sopenharmony_ci if total_sent > 0 and hasattr(file, 'seek'): 4117db96d56Sopenharmony_ci file.seek(offset) 4127db96d56Sopenharmony_ci else: 4137db96d56Sopenharmony_ci def _sendfile_use_sendfile(self, file, offset=0, count=None): 4147db96d56Sopenharmony_ci raise _GiveupOnSendfile( 4157db96d56Sopenharmony_ci "os.sendfile() not available on this platform") 4167db96d56Sopenharmony_ci 4177db96d56Sopenharmony_ci def _sendfile_use_send(self, file, offset=0, count=None): 4187db96d56Sopenharmony_ci self._check_sendfile_params(file, offset, count) 4197db96d56Sopenharmony_ci if self.gettimeout() == 0: 4207db96d56Sopenharmony_ci raise ValueError("non-blocking sockets are not supported") 4217db96d56Sopenharmony_ci if offset: 4227db96d56Sopenharmony_ci file.seek(offset) 4237db96d56Sopenharmony_ci blocksize = min(count, 8192) if count else 8192 4247db96d56Sopenharmony_ci total_sent = 0 4257db96d56Sopenharmony_ci # localize variable access to minimize overhead 4267db96d56Sopenharmony_ci file_read = file.read 4277db96d56Sopenharmony_ci sock_send = self.send 4287db96d56Sopenharmony_ci try: 4297db96d56Sopenharmony_ci while True: 4307db96d56Sopenharmony_ci if count: 4317db96d56Sopenharmony_ci blocksize = min(count - total_sent, blocksize) 4327db96d56Sopenharmony_ci if blocksize <= 0: 4337db96d56Sopenharmony_ci break 4347db96d56Sopenharmony_ci data = memoryview(file_read(blocksize)) 4357db96d56Sopenharmony_ci if not data: 4367db96d56Sopenharmony_ci break # EOF 4377db96d56Sopenharmony_ci while True: 4387db96d56Sopenharmony_ci try: 4397db96d56Sopenharmony_ci sent = sock_send(data) 4407db96d56Sopenharmony_ci except BlockingIOError: 4417db96d56Sopenharmony_ci continue 4427db96d56Sopenharmony_ci else: 4437db96d56Sopenharmony_ci total_sent += sent 4447db96d56Sopenharmony_ci if sent < len(data): 4457db96d56Sopenharmony_ci data = data[sent:] 4467db96d56Sopenharmony_ci else: 4477db96d56Sopenharmony_ci break 4487db96d56Sopenharmony_ci return total_sent 4497db96d56Sopenharmony_ci finally: 4507db96d56Sopenharmony_ci if total_sent > 0 and hasattr(file, 'seek'): 4517db96d56Sopenharmony_ci file.seek(offset + total_sent) 4527db96d56Sopenharmony_ci 4537db96d56Sopenharmony_ci def _check_sendfile_params(self, file, offset, count): 4547db96d56Sopenharmony_ci if 'b' not in getattr(file, 'mode', 'b'): 4557db96d56Sopenharmony_ci raise ValueError("file should be opened in binary mode") 4567db96d56Sopenharmony_ci if not self.type & SOCK_STREAM: 4577db96d56Sopenharmony_ci raise ValueError("only SOCK_STREAM type sockets are supported") 4587db96d56Sopenharmony_ci if count is not None: 4597db96d56Sopenharmony_ci if not isinstance(count, int): 4607db96d56Sopenharmony_ci raise TypeError( 4617db96d56Sopenharmony_ci "count must be a positive integer (got {!r})".format(count)) 4627db96d56Sopenharmony_ci if count <= 0: 4637db96d56Sopenharmony_ci raise ValueError( 4647db96d56Sopenharmony_ci "count must be a positive integer (got {!r})".format(count)) 4657db96d56Sopenharmony_ci 4667db96d56Sopenharmony_ci def sendfile(self, file, offset=0, count=None): 4677db96d56Sopenharmony_ci """sendfile(file[, offset[, count]]) -> sent 4687db96d56Sopenharmony_ci 4697db96d56Sopenharmony_ci Send a file until EOF is reached by using high-performance 4707db96d56Sopenharmony_ci os.sendfile() and return the total number of bytes which 4717db96d56Sopenharmony_ci were sent. 4727db96d56Sopenharmony_ci *file* must be a regular file object opened in binary mode. 4737db96d56Sopenharmony_ci If os.sendfile() is not available (e.g. Windows) or file is 4747db96d56Sopenharmony_ci not a regular file socket.send() will be used instead. 4757db96d56Sopenharmony_ci *offset* tells from where to start reading the file. 4767db96d56Sopenharmony_ci If specified, *count* is the total number of bytes to transmit 4777db96d56Sopenharmony_ci as opposed to sending the file until EOF is reached. 4787db96d56Sopenharmony_ci File position is updated on return or also in case of error in 4797db96d56Sopenharmony_ci which case file.tell() can be used to figure out the number of 4807db96d56Sopenharmony_ci bytes which were sent. 4817db96d56Sopenharmony_ci The socket must be of SOCK_STREAM type. 4827db96d56Sopenharmony_ci Non-blocking sockets are not supported. 4837db96d56Sopenharmony_ci """ 4847db96d56Sopenharmony_ci try: 4857db96d56Sopenharmony_ci return self._sendfile_use_sendfile(file, offset, count) 4867db96d56Sopenharmony_ci except _GiveupOnSendfile: 4877db96d56Sopenharmony_ci return self._sendfile_use_send(file, offset, count) 4887db96d56Sopenharmony_ci 4897db96d56Sopenharmony_ci def _decref_socketios(self): 4907db96d56Sopenharmony_ci if self._io_refs > 0: 4917db96d56Sopenharmony_ci self._io_refs -= 1 4927db96d56Sopenharmony_ci if self._closed: 4937db96d56Sopenharmony_ci self.close() 4947db96d56Sopenharmony_ci 4957db96d56Sopenharmony_ci def _real_close(self, _ss=_socket.socket): 4967db96d56Sopenharmony_ci # This function should not reference any globals. See issue #808164. 4977db96d56Sopenharmony_ci _ss.close(self) 4987db96d56Sopenharmony_ci 4997db96d56Sopenharmony_ci def close(self): 5007db96d56Sopenharmony_ci # This function should not reference any globals. See issue #808164. 5017db96d56Sopenharmony_ci self._closed = True 5027db96d56Sopenharmony_ci if self._io_refs <= 0: 5037db96d56Sopenharmony_ci self._real_close() 5047db96d56Sopenharmony_ci 5057db96d56Sopenharmony_ci def detach(self): 5067db96d56Sopenharmony_ci """detach() -> file descriptor 5077db96d56Sopenharmony_ci 5087db96d56Sopenharmony_ci Close the socket object without closing the underlying file descriptor. 5097db96d56Sopenharmony_ci The object cannot be used after this call, but the file descriptor 5107db96d56Sopenharmony_ci can be reused for other purposes. The file descriptor is returned. 5117db96d56Sopenharmony_ci """ 5127db96d56Sopenharmony_ci self._closed = True 5137db96d56Sopenharmony_ci return super().detach() 5147db96d56Sopenharmony_ci 5157db96d56Sopenharmony_ci @property 5167db96d56Sopenharmony_ci def family(self): 5177db96d56Sopenharmony_ci """Read-only access to the address family for this socket. 5187db96d56Sopenharmony_ci """ 5197db96d56Sopenharmony_ci return _intenum_converter(super().family, AddressFamily) 5207db96d56Sopenharmony_ci 5217db96d56Sopenharmony_ci @property 5227db96d56Sopenharmony_ci def type(self): 5237db96d56Sopenharmony_ci """Read-only access to the socket type. 5247db96d56Sopenharmony_ci """ 5257db96d56Sopenharmony_ci return _intenum_converter(super().type, SocketKind) 5267db96d56Sopenharmony_ci 5277db96d56Sopenharmony_ci if os.name == 'nt': 5287db96d56Sopenharmony_ci def get_inheritable(self): 5297db96d56Sopenharmony_ci return os.get_handle_inheritable(self.fileno()) 5307db96d56Sopenharmony_ci def set_inheritable(self, inheritable): 5317db96d56Sopenharmony_ci os.set_handle_inheritable(self.fileno(), inheritable) 5327db96d56Sopenharmony_ci else: 5337db96d56Sopenharmony_ci def get_inheritable(self): 5347db96d56Sopenharmony_ci return os.get_inheritable(self.fileno()) 5357db96d56Sopenharmony_ci def set_inheritable(self, inheritable): 5367db96d56Sopenharmony_ci os.set_inheritable(self.fileno(), inheritable) 5377db96d56Sopenharmony_ci get_inheritable.__doc__ = "Get the inheritable flag of the socket" 5387db96d56Sopenharmony_ci set_inheritable.__doc__ = "Set the inheritable flag of the socket" 5397db96d56Sopenharmony_ci 5407db96d56Sopenharmony_cidef fromfd(fd, family, type, proto=0): 5417db96d56Sopenharmony_ci """ fromfd(fd, family, type[, proto]) -> socket object 5427db96d56Sopenharmony_ci 5437db96d56Sopenharmony_ci Create a socket object from a duplicate of the given file 5447db96d56Sopenharmony_ci descriptor. The remaining arguments are the same as for socket(). 5457db96d56Sopenharmony_ci """ 5467db96d56Sopenharmony_ci nfd = dup(fd) 5477db96d56Sopenharmony_ci return socket(family, type, proto, nfd) 5487db96d56Sopenharmony_ci 5497db96d56Sopenharmony_ciif hasattr(_socket.socket, "sendmsg"): 5507db96d56Sopenharmony_ci import array 5517db96d56Sopenharmony_ci 5527db96d56Sopenharmony_ci def send_fds(sock, buffers, fds, flags=0, address=None): 5537db96d56Sopenharmony_ci """ send_fds(sock, buffers, fds[, flags[, address]]) -> integer 5547db96d56Sopenharmony_ci 5557db96d56Sopenharmony_ci Send the list of file descriptors fds over an AF_UNIX socket. 5567db96d56Sopenharmony_ci """ 5577db96d56Sopenharmony_ci return sock.sendmsg(buffers, [(_socket.SOL_SOCKET, 5587db96d56Sopenharmony_ci _socket.SCM_RIGHTS, array.array("i", fds))]) 5597db96d56Sopenharmony_ci __all__.append("send_fds") 5607db96d56Sopenharmony_ci 5617db96d56Sopenharmony_ciif hasattr(_socket.socket, "recvmsg"): 5627db96d56Sopenharmony_ci import array 5637db96d56Sopenharmony_ci 5647db96d56Sopenharmony_ci def recv_fds(sock, bufsize, maxfds, flags=0): 5657db96d56Sopenharmony_ci """ recv_fds(sock, bufsize, maxfds[, flags]) -> (data, list of file 5667db96d56Sopenharmony_ci descriptors, msg_flags, address) 5677db96d56Sopenharmony_ci 5687db96d56Sopenharmony_ci Receive up to maxfds file descriptors returning the message 5697db96d56Sopenharmony_ci data and a list containing the descriptors. 5707db96d56Sopenharmony_ci """ 5717db96d56Sopenharmony_ci # Array of ints 5727db96d56Sopenharmony_ci fds = array.array("i") 5737db96d56Sopenharmony_ci msg, ancdata, flags, addr = sock.recvmsg(bufsize, 5747db96d56Sopenharmony_ci _socket.CMSG_LEN(maxfds * fds.itemsize)) 5757db96d56Sopenharmony_ci for cmsg_level, cmsg_type, cmsg_data in ancdata: 5767db96d56Sopenharmony_ci if (cmsg_level == _socket.SOL_SOCKET and cmsg_type == _socket.SCM_RIGHTS): 5777db96d56Sopenharmony_ci fds.frombytes(cmsg_data[: 5787db96d56Sopenharmony_ci len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) 5797db96d56Sopenharmony_ci 5807db96d56Sopenharmony_ci return msg, list(fds), flags, addr 5817db96d56Sopenharmony_ci __all__.append("recv_fds") 5827db96d56Sopenharmony_ci 5837db96d56Sopenharmony_ciif hasattr(_socket.socket, "share"): 5847db96d56Sopenharmony_ci def fromshare(info): 5857db96d56Sopenharmony_ci """ fromshare(info) -> socket object 5867db96d56Sopenharmony_ci 5877db96d56Sopenharmony_ci Create a socket object from the bytes object returned by 5887db96d56Sopenharmony_ci socket.share(pid). 5897db96d56Sopenharmony_ci """ 5907db96d56Sopenharmony_ci return socket(0, 0, 0, info) 5917db96d56Sopenharmony_ci __all__.append("fromshare") 5927db96d56Sopenharmony_ci 5937db96d56Sopenharmony_ciif hasattr(_socket, "socketpair"): 5947db96d56Sopenharmony_ci 5957db96d56Sopenharmony_ci def socketpair(family=None, type=SOCK_STREAM, proto=0): 5967db96d56Sopenharmony_ci """socketpair([family[, type[, proto]]]) -> (socket object, socket object) 5977db96d56Sopenharmony_ci 5987db96d56Sopenharmony_ci Create a pair of socket objects from the sockets returned by the platform 5997db96d56Sopenharmony_ci socketpair() function. 6007db96d56Sopenharmony_ci The arguments are the same as for socket() except the default family is 6017db96d56Sopenharmony_ci AF_UNIX if defined on the platform; otherwise, the default is AF_INET. 6027db96d56Sopenharmony_ci """ 6037db96d56Sopenharmony_ci if family is None: 6047db96d56Sopenharmony_ci try: 6057db96d56Sopenharmony_ci family = AF_UNIX 6067db96d56Sopenharmony_ci except NameError: 6077db96d56Sopenharmony_ci family = AF_INET 6087db96d56Sopenharmony_ci a, b = _socket.socketpair(family, type, proto) 6097db96d56Sopenharmony_ci a = socket(family, type, proto, a.detach()) 6107db96d56Sopenharmony_ci b = socket(family, type, proto, b.detach()) 6117db96d56Sopenharmony_ci return a, b 6127db96d56Sopenharmony_ci 6137db96d56Sopenharmony_cielse: 6147db96d56Sopenharmony_ci 6157db96d56Sopenharmony_ci # Origin: https://gist.github.com/4325783, by Geert Jansen. Public domain. 6167db96d56Sopenharmony_ci def socketpair(family=AF_INET, type=SOCK_STREAM, proto=0): 6177db96d56Sopenharmony_ci if family == AF_INET: 6187db96d56Sopenharmony_ci host = _LOCALHOST 6197db96d56Sopenharmony_ci elif family == AF_INET6: 6207db96d56Sopenharmony_ci host = _LOCALHOST_V6 6217db96d56Sopenharmony_ci else: 6227db96d56Sopenharmony_ci raise ValueError("Only AF_INET and AF_INET6 socket address families " 6237db96d56Sopenharmony_ci "are supported") 6247db96d56Sopenharmony_ci if type != SOCK_STREAM: 6257db96d56Sopenharmony_ci raise ValueError("Only SOCK_STREAM socket type is supported") 6267db96d56Sopenharmony_ci if proto != 0: 6277db96d56Sopenharmony_ci raise ValueError("Only protocol zero is supported") 6287db96d56Sopenharmony_ci 6297db96d56Sopenharmony_ci # We create a connected TCP socket. Note the trick with 6307db96d56Sopenharmony_ci # setblocking(False) that prevents us from having to create a thread. 6317db96d56Sopenharmony_ci lsock = socket(family, type, proto) 6327db96d56Sopenharmony_ci try: 6337db96d56Sopenharmony_ci lsock.bind((host, 0)) 6347db96d56Sopenharmony_ci lsock.listen() 6357db96d56Sopenharmony_ci # On IPv6, ignore flow_info and scope_id 6367db96d56Sopenharmony_ci addr, port = lsock.getsockname()[:2] 6377db96d56Sopenharmony_ci csock = socket(family, type, proto) 6387db96d56Sopenharmony_ci try: 6397db96d56Sopenharmony_ci csock.setblocking(False) 6407db96d56Sopenharmony_ci try: 6417db96d56Sopenharmony_ci csock.connect((addr, port)) 6427db96d56Sopenharmony_ci except (BlockingIOError, InterruptedError): 6437db96d56Sopenharmony_ci pass 6447db96d56Sopenharmony_ci csock.setblocking(True) 6457db96d56Sopenharmony_ci ssock, _ = lsock.accept() 6467db96d56Sopenharmony_ci except: 6477db96d56Sopenharmony_ci csock.close() 6487db96d56Sopenharmony_ci raise 6497db96d56Sopenharmony_ci finally: 6507db96d56Sopenharmony_ci lsock.close() 6517db96d56Sopenharmony_ci return (ssock, csock) 6527db96d56Sopenharmony_ci __all__.append("socketpair") 6537db96d56Sopenharmony_ci 6547db96d56Sopenharmony_cisocketpair.__doc__ = """socketpair([family[, type[, proto]]]) -> (socket object, socket object) 6557db96d56Sopenharmony_ciCreate a pair of socket objects from the sockets returned by the platform 6567db96d56Sopenharmony_cisocketpair() function. 6577db96d56Sopenharmony_ciThe arguments are the same as for socket() except the default family is AF_UNIX 6587db96d56Sopenharmony_ciif defined on the platform; otherwise, the default is AF_INET. 6597db96d56Sopenharmony_ci""" 6607db96d56Sopenharmony_ci 6617db96d56Sopenharmony_ci_blocking_errnos = { EAGAIN, EWOULDBLOCK } 6627db96d56Sopenharmony_ci 6637db96d56Sopenharmony_ciclass SocketIO(io.RawIOBase): 6647db96d56Sopenharmony_ci 6657db96d56Sopenharmony_ci """Raw I/O implementation for stream sockets. 6667db96d56Sopenharmony_ci 6677db96d56Sopenharmony_ci This class supports the makefile() method on sockets. It provides 6687db96d56Sopenharmony_ci the raw I/O interface on top of a socket object. 6697db96d56Sopenharmony_ci """ 6707db96d56Sopenharmony_ci 6717db96d56Sopenharmony_ci # One might wonder why not let FileIO do the job instead. There are two 6727db96d56Sopenharmony_ci # main reasons why FileIO is not adapted: 6737db96d56Sopenharmony_ci # - it wouldn't work under Windows (where you can't used read() and 6747db96d56Sopenharmony_ci # write() on a socket handle) 6757db96d56Sopenharmony_ci # - it wouldn't work with socket timeouts (FileIO would ignore the 6767db96d56Sopenharmony_ci # timeout and consider the socket non-blocking) 6777db96d56Sopenharmony_ci 6787db96d56Sopenharmony_ci # XXX More docs 6797db96d56Sopenharmony_ci 6807db96d56Sopenharmony_ci def __init__(self, sock, mode): 6817db96d56Sopenharmony_ci if mode not in ("r", "w", "rw", "rb", "wb", "rwb"): 6827db96d56Sopenharmony_ci raise ValueError("invalid mode: %r" % mode) 6837db96d56Sopenharmony_ci io.RawIOBase.__init__(self) 6847db96d56Sopenharmony_ci self._sock = sock 6857db96d56Sopenharmony_ci if "b" not in mode: 6867db96d56Sopenharmony_ci mode += "b" 6877db96d56Sopenharmony_ci self._mode = mode 6887db96d56Sopenharmony_ci self._reading = "r" in mode 6897db96d56Sopenharmony_ci self._writing = "w" in mode 6907db96d56Sopenharmony_ci self._timeout_occurred = False 6917db96d56Sopenharmony_ci 6927db96d56Sopenharmony_ci def readinto(self, b): 6937db96d56Sopenharmony_ci """Read up to len(b) bytes into the writable buffer *b* and return 6947db96d56Sopenharmony_ci the number of bytes read. If the socket is non-blocking and no bytes 6957db96d56Sopenharmony_ci are available, None is returned. 6967db96d56Sopenharmony_ci 6977db96d56Sopenharmony_ci If *b* is non-empty, a 0 return value indicates that the connection 6987db96d56Sopenharmony_ci was shutdown at the other end. 6997db96d56Sopenharmony_ci """ 7007db96d56Sopenharmony_ci self._checkClosed() 7017db96d56Sopenharmony_ci self._checkReadable() 7027db96d56Sopenharmony_ci if self._timeout_occurred: 7037db96d56Sopenharmony_ci raise OSError("cannot read from timed out object") 7047db96d56Sopenharmony_ci while True: 7057db96d56Sopenharmony_ci try: 7067db96d56Sopenharmony_ci return self._sock.recv_into(b) 7077db96d56Sopenharmony_ci except timeout: 7087db96d56Sopenharmony_ci self._timeout_occurred = True 7097db96d56Sopenharmony_ci raise 7107db96d56Sopenharmony_ci except error as e: 7117db96d56Sopenharmony_ci if e.errno in _blocking_errnos: 7127db96d56Sopenharmony_ci return None 7137db96d56Sopenharmony_ci raise 7147db96d56Sopenharmony_ci 7157db96d56Sopenharmony_ci def write(self, b): 7167db96d56Sopenharmony_ci """Write the given bytes or bytearray object *b* to the socket 7177db96d56Sopenharmony_ci and return the number of bytes written. This can be less than 7187db96d56Sopenharmony_ci len(b) if not all data could be written. If the socket is 7197db96d56Sopenharmony_ci non-blocking and no bytes could be written None is returned. 7207db96d56Sopenharmony_ci """ 7217db96d56Sopenharmony_ci self._checkClosed() 7227db96d56Sopenharmony_ci self._checkWritable() 7237db96d56Sopenharmony_ci try: 7247db96d56Sopenharmony_ci return self._sock.send(b) 7257db96d56Sopenharmony_ci except error as e: 7267db96d56Sopenharmony_ci # XXX what about EINTR? 7277db96d56Sopenharmony_ci if e.errno in _blocking_errnos: 7287db96d56Sopenharmony_ci return None 7297db96d56Sopenharmony_ci raise 7307db96d56Sopenharmony_ci 7317db96d56Sopenharmony_ci def readable(self): 7327db96d56Sopenharmony_ci """True if the SocketIO is open for reading. 7337db96d56Sopenharmony_ci """ 7347db96d56Sopenharmony_ci if self.closed: 7357db96d56Sopenharmony_ci raise ValueError("I/O operation on closed socket.") 7367db96d56Sopenharmony_ci return self._reading 7377db96d56Sopenharmony_ci 7387db96d56Sopenharmony_ci def writable(self): 7397db96d56Sopenharmony_ci """True if the SocketIO is open for writing. 7407db96d56Sopenharmony_ci """ 7417db96d56Sopenharmony_ci if self.closed: 7427db96d56Sopenharmony_ci raise ValueError("I/O operation on closed socket.") 7437db96d56Sopenharmony_ci return self._writing 7447db96d56Sopenharmony_ci 7457db96d56Sopenharmony_ci def seekable(self): 7467db96d56Sopenharmony_ci """True if the SocketIO is open for seeking. 7477db96d56Sopenharmony_ci """ 7487db96d56Sopenharmony_ci if self.closed: 7497db96d56Sopenharmony_ci raise ValueError("I/O operation on closed socket.") 7507db96d56Sopenharmony_ci return super().seekable() 7517db96d56Sopenharmony_ci 7527db96d56Sopenharmony_ci def fileno(self): 7537db96d56Sopenharmony_ci """Return the file descriptor of the underlying socket. 7547db96d56Sopenharmony_ci """ 7557db96d56Sopenharmony_ci self._checkClosed() 7567db96d56Sopenharmony_ci return self._sock.fileno() 7577db96d56Sopenharmony_ci 7587db96d56Sopenharmony_ci @property 7597db96d56Sopenharmony_ci def name(self): 7607db96d56Sopenharmony_ci if not self.closed: 7617db96d56Sopenharmony_ci return self.fileno() 7627db96d56Sopenharmony_ci else: 7637db96d56Sopenharmony_ci return -1 7647db96d56Sopenharmony_ci 7657db96d56Sopenharmony_ci @property 7667db96d56Sopenharmony_ci def mode(self): 7677db96d56Sopenharmony_ci return self._mode 7687db96d56Sopenharmony_ci 7697db96d56Sopenharmony_ci def close(self): 7707db96d56Sopenharmony_ci """Close the SocketIO object. This doesn't close the underlying 7717db96d56Sopenharmony_ci socket, except if all references to it have disappeared. 7727db96d56Sopenharmony_ci """ 7737db96d56Sopenharmony_ci if self.closed: 7747db96d56Sopenharmony_ci return 7757db96d56Sopenharmony_ci io.RawIOBase.close(self) 7767db96d56Sopenharmony_ci self._sock._decref_socketios() 7777db96d56Sopenharmony_ci self._sock = None 7787db96d56Sopenharmony_ci 7797db96d56Sopenharmony_ci 7807db96d56Sopenharmony_cidef getfqdn(name=''): 7817db96d56Sopenharmony_ci """Get fully qualified domain name from name. 7827db96d56Sopenharmony_ci 7837db96d56Sopenharmony_ci An empty argument is interpreted as meaning the local host. 7847db96d56Sopenharmony_ci 7857db96d56Sopenharmony_ci First the hostname returned by gethostbyaddr() is checked, then 7867db96d56Sopenharmony_ci possibly existing aliases. In case no FQDN is available and `name` 7877db96d56Sopenharmony_ci was given, it is returned unchanged. If `name` was empty, '0.0.0.0' or '::', 7887db96d56Sopenharmony_ci hostname from gethostname() is returned. 7897db96d56Sopenharmony_ci """ 7907db96d56Sopenharmony_ci name = name.strip() 7917db96d56Sopenharmony_ci if not name or name in ('0.0.0.0', '::'): 7927db96d56Sopenharmony_ci name = gethostname() 7937db96d56Sopenharmony_ci try: 7947db96d56Sopenharmony_ci hostname, aliases, ipaddrs = gethostbyaddr(name) 7957db96d56Sopenharmony_ci except error: 7967db96d56Sopenharmony_ci pass 7977db96d56Sopenharmony_ci else: 7987db96d56Sopenharmony_ci aliases.insert(0, hostname) 7997db96d56Sopenharmony_ci for name in aliases: 8007db96d56Sopenharmony_ci if '.' in name: 8017db96d56Sopenharmony_ci break 8027db96d56Sopenharmony_ci else: 8037db96d56Sopenharmony_ci name = hostname 8047db96d56Sopenharmony_ci return name 8057db96d56Sopenharmony_ci 8067db96d56Sopenharmony_ci 8077db96d56Sopenharmony_ci_GLOBAL_DEFAULT_TIMEOUT = object() 8087db96d56Sopenharmony_ci 8097db96d56Sopenharmony_cidef create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT, 8107db96d56Sopenharmony_ci source_address=None, *, all_errors=False): 8117db96d56Sopenharmony_ci """Connect to *address* and return the socket object. 8127db96d56Sopenharmony_ci 8137db96d56Sopenharmony_ci Convenience function. Connect to *address* (a 2-tuple ``(host, 8147db96d56Sopenharmony_ci port)``) and return the socket object. Passing the optional 8157db96d56Sopenharmony_ci *timeout* parameter will set the timeout on the socket instance 8167db96d56Sopenharmony_ci before attempting to connect. If no *timeout* is supplied, the 8177db96d56Sopenharmony_ci global default timeout setting returned by :func:`getdefaulttimeout` 8187db96d56Sopenharmony_ci is used. If *source_address* is set it must be a tuple of (host, port) 8197db96d56Sopenharmony_ci for the socket to bind as a source address before making the connection. 8207db96d56Sopenharmony_ci A host of '' or port 0 tells the OS to use the default. When a connection 8217db96d56Sopenharmony_ci cannot be created, raises the last error if *all_errors* is False, 8227db96d56Sopenharmony_ci and an ExceptionGroup of all errors if *all_errors* is True. 8237db96d56Sopenharmony_ci """ 8247db96d56Sopenharmony_ci 8257db96d56Sopenharmony_ci host, port = address 8267db96d56Sopenharmony_ci exceptions = [] 8277db96d56Sopenharmony_ci for res in getaddrinfo(host, port, 0, SOCK_STREAM): 8287db96d56Sopenharmony_ci af, socktype, proto, canonname, sa = res 8297db96d56Sopenharmony_ci sock = None 8307db96d56Sopenharmony_ci try: 8317db96d56Sopenharmony_ci sock = socket(af, socktype, proto) 8327db96d56Sopenharmony_ci if timeout is not _GLOBAL_DEFAULT_TIMEOUT: 8337db96d56Sopenharmony_ci sock.settimeout(timeout) 8347db96d56Sopenharmony_ci if source_address: 8357db96d56Sopenharmony_ci sock.bind(source_address) 8367db96d56Sopenharmony_ci sock.connect(sa) 8377db96d56Sopenharmony_ci # Break explicitly a reference cycle 8387db96d56Sopenharmony_ci exceptions.clear() 8397db96d56Sopenharmony_ci return sock 8407db96d56Sopenharmony_ci 8417db96d56Sopenharmony_ci except error as exc: 8427db96d56Sopenharmony_ci if not all_errors: 8437db96d56Sopenharmony_ci exceptions.clear() # raise only the last error 8447db96d56Sopenharmony_ci exceptions.append(exc) 8457db96d56Sopenharmony_ci if sock is not None: 8467db96d56Sopenharmony_ci sock.close() 8477db96d56Sopenharmony_ci 8487db96d56Sopenharmony_ci if len(exceptions): 8497db96d56Sopenharmony_ci try: 8507db96d56Sopenharmony_ci if not all_errors: 8517db96d56Sopenharmony_ci raise exceptions[0] 8527db96d56Sopenharmony_ci raise ExceptionGroup("create_connection failed", exceptions) 8537db96d56Sopenharmony_ci finally: 8547db96d56Sopenharmony_ci # Break explicitly a reference cycle 8557db96d56Sopenharmony_ci exceptions.clear() 8567db96d56Sopenharmony_ci else: 8577db96d56Sopenharmony_ci raise error("getaddrinfo returns an empty list") 8587db96d56Sopenharmony_ci 8597db96d56Sopenharmony_ci 8607db96d56Sopenharmony_cidef has_dualstack_ipv6(): 8617db96d56Sopenharmony_ci """Return True if the platform supports creating a SOCK_STREAM socket 8627db96d56Sopenharmony_ci which can handle both AF_INET and AF_INET6 (IPv4 / IPv6) connections. 8637db96d56Sopenharmony_ci """ 8647db96d56Sopenharmony_ci if not has_ipv6 \ 8657db96d56Sopenharmony_ci or not hasattr(_socket, 'IPPROTO_IPV6') \ 8667db96d56Sopenharmony_ci or not hasattr(_socket, 'IPV6_V6ONLY'): 8677db96d56Sopenharmony_ci return False 8687db96d56Sopenharmony_ci try: 8697db96d56Sopenharmony_ci with socket(AF_INET6, SOCK_STREAM) as sock: 8707db96d56Sopenharmony_ci sock.setsockopt(IPPROTO_IPV6, IPV6_V6ONLY, 0) 8717db96d56Sopenharmony_ci return True 8727db96d56Sopenharmony_ci except error: 8737db96d56Sopenharmony_ci return False 8747db96d56Sopenharmony_ci 8757db96d56Sopenharmony_ci 8767db96d56Sopenharmony_cidef create_server(address, *, family=AF_INET, backlog=None, reuse_port=False, 8777db96d56Sopenharmony_ci dualstack_ipv6=False): 8787db96d56Sopenharmony_ci """Convenience function which creates a SOCK_STREAM type socket 8797db96d56Sopenharmony_ci bound to *address* (a 2-tuple (host, port)) and return the socket 8807db96d56Sopenharmony_ci object. 8817db96d56Sopenharmony_ci 8827db96d56Sopenharmony_ci *family* should be either AF_INET or AF_INET6. 8837db96d56Sopenharmony_ci *backlog* is the queue size passed to socket.listen(). 8847db96d56Sopenharmony_ci *reuse_port* dictates whether to use the SO_REUSEPORT socket option. 8857db96d56Sopenharmony_ci *dualstack_ipv6*: if true and the platform supports it, it will 8867db96d56Sopenharmony_ci create an AF_INET6 socket able to accept both IPv4 or IPv6 8877db96d56Sopenharmony_ci connections. When false it will explicitly disable this option on 8887db96d56Sopenharmony_ci platforms that enable it by default (e.g. Linux). 8897db96d56Sopenharmony_ci 8907db96d56Sopenharmony_ci >>> with create_server(('', 8000)) as server: 8917db96d56Sopenharmony_ci ... while True: 8927db96d56Sopenharmony_ci ... conn, addr = server.accept() 8937db96d56Sopenharmony_ci ... # handle new connection 8947db96d56Sopenharmony_ci """ 8957db96d56Sopenharmony_ci if reuse_port and not hasattr(_socket, "SO_REUSEPORT"): 8967db96d56Sopenharmony_ci raise ValueError("SO_REUSEPORT not supported on this platform") 8977db96d56Sopenharmony_ci if dualstack_ipv6: 8987db96d56Sopenharmony_ci if not has_dualstack_ipv6(): 8997db96d56Sopenharmony_ci raise ValueError("dualstack_ipv6 not supported on this platform") 9007db96d56Sopenharmony_ci if family != AF_INET6: 9017db96d56Sopenharmony_ci raise ValueError("dualstack_ipv6 requires AF_INET6 family") 9027db96d56Sopenharmony_ci sock = socket(family, SOCK_STREAM) 9037db96d56Sopenharmony_ci try: 9047db96d56Sopenharmony_ci # Note about Windows. We don't set SO_REUSEADDR because: 9057db96d56Sopenharmony_ci # 1) It's unnecessary: bind() will succeed even in case of a 9067db96d56Sopenharmony_ci # previous closed socket on the same address and still in 9077db96d56Sopenharmony_ci # TIME_WAIT state. 9087db96d56Sopenharmony_ci # 2) If set, another socket is free to bind() on the same 9097db96d56Sopenharmony_ci # address, effectively preventing this one from accepting 9107db96d56Sopenharmony_ci # connections. Also, it may set the process in a state where 9117db96d56Sopenharmony_ci # it'll no longer respond to any signals or graceful kills. 9127db96d56Sopenharmony_ci # See: https://learn.microsoft.com/windows/win32/winsock/using-so-reuseaddr-and-so-exclusiveaddruse 9137db96d56Sopenharmony_ci if os.name not in ('nt', 'cygwin') and \ 9147db96d56Sopenharmony_ci hasattr(_socket, 'SO_REUSEADDR'): 9157db96d56Sopenharmony_ci try: 9167db96d56Sopenharmony_ci sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) 9177db96d56Sopenharmony_ci except error: 9187db96d56Sopenharmony_ci # Fail later on bind(), for platforms which may not 9197db96d56Sopenharmony_ci # support this option. 9207db96d56Sopenharmony_ci pass 9217db96d56Sopenharmony_ci if reuse_port: 9227db96d56Sopenharmony_ci sock.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1) 9237db96d56Sopenharmony_ci if has_ipv6 and family == AF_INET6: 9247db96d56Sopenharmony_ci if dualstack_ipv6: 9257db96d56Sopenharmony_ci sock.setsockopt(IPPROTO_IPV6, IPV6_V6ONLY, 0) 9267db96d56Sopenharmony_ci elif hasattr(_socket, "IPV6_V6ONLY") and \ 9277db96d56Sopenharmony_ci hasattr(_socket, "IPPROTO_IPV6"): 9287db96d56Sopenharmony_ci sock.setsockopt(IPPROTO_IPV6, IPV6_V6ONLY, 1) 9297db96d56Sopenharmony_ci try: 9307db96d56Sopenharmony_ci sock.bind(address) 9317db96d56Sopenharmony_ci except error as err: 9327db96d56Sopenharmony_ci msg = '%s (while attempting to bind on address %r)' % \ 9337db96d56Sopenharmony_ci (err.strerror, address) 9347db96d56Sopenharmony_ci raise error(err.errno, msg) from None 9357db96d56Sopenharmony_ci if backlog is None: 9367db96d56Sopenharmony_ci sock.listen() 9377db96d56Sopenharmony_ci else: 9387db96d56Sopenharmony_ci sock.listen(backlog) 9397db96d56Sopenharmony_ci return sock 9407db96d56Sopenharmony_ci except error: 9417db96d56Sopenharmony_ci sock.close() 9427db96d56Sopenharmony_ci raise 9437db96d56Sopenharmony_ci 9447db96d56Sopenharmony_ci 9457db96d56Sopenharmony_cidef getaddrinfo(host, port, family=0, type=0, proto=0, flags=0): 9467db96d56Sopenharmony_ci """Resolve host and port into list of address info entries. 9477db96d56Sopenharmony_ci 9487db96d56Sopenharmony_ci Translate the host/port argument into a sequence of 5-tuples that contain 9497db96d56Sopenharmony_ci all the necessary arguments for creating a socket connected to that service. 9507db96d56Sopenharmony_ci host is a domain name, a string representation of an IPv4/v6 address or 9517db96d56Sopenharmony_ci None. port is a string service name such as 'http', a numeric port number or 9527db96d56Sopenharmony_ci None. By passing None as the value of host and port, you can pass NULL to 9537db96d56Sopenharmony_ci the underlying C API. 9547db96d56Sopenharmony_ci 9557db96d56Sopenharmony_ci The family, type and proto arguments can be optionally specified in order to 9567db96d56Sopenharmony_ci narrow the list of addresses returned. Passing zero as a value for each of 9577db96d56Sopenharmony_ci these arguments selects the full range of results. 9587db96d56Sopenharmony_ci """ 9597db96d56Sopenharmony_ci # We override this function since we want to translate the numeric family 9607db96d56Sopenharmony_ci # and socket type values to enum constants. 9617db96d56Sopenharmony_ci addrlist = [] 9627db96d56Sopenharmony_ci for res in _socket.getaddrinfo(host, port, family, type, proto, flags): 9637db96d56Sopenharmony_ci af, socktype, proto, canonname, sa = res 9647db96d56Sopenharmony_ci addrlist.append((_intenum_converter(af, AddressFamily), 9657db96d56Sopenharmony_ci _intenum_converter(socktype, SocketKind), 9667db96d56Sopenharmony_ci proto, canonname, sa)) 9677db96d56Sopenharmony_ci return addrlist 968