xref: /third_party/python/Lib/socket.py (revision 7db96d56)
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