U
    g                  	   @  s  U d dl mZ d dlZd dlZd dlZd dlZd dlmZ d dlm	Z	m
Z
 d dlmZmZmZmZmZmZmZmZmZ d dlZd dlZd dlmZ ddlmZ erd d	lmZ d d
lm Z  d dl!m"Z"m#Z#m$Z$m%Z%m&Z& ddl'm(Z(m)Z) e$dZ*edZ+eZ,de-d< G dd dZ.e/dZ0de-d< e/dZ1de-d< dddddZ2ddddd Z3ej4ej5B Z6dgd!d"d#d#d#d#d$d%d&d'Z7d(d#d)d*d+d,Z8d-d#d.d/d0Z9d1d2d3d4d5Z:eej;d6d6d7ej<ej=d fd8d9d:d#d2d;d<d=Z;ej>d>ksese?ed?reej@d6d6d7d@d2dAdBd?Z@ej>d>krJeAZBde-dC< eAZCde-dD< ej<ZDn8dZDdEe-dF< eeAe	df ZBde-dC< eejeAf ZCde-dD< eejEd6d6d7eDe
j=d fdCdDd#dGdHdIdJZEeejd6d6d7ej<ej=d dfd9d:d#dKd2dLdMdNZd9d:d#dKdOdPdQdRZFeGedSd eGedTd B  ZHdhdVdWdXdYdZd[d\ZId#d]d#d^ddXd_d`dadbZJG dcd2 d2ZKeKjLM D ]b\ZNZOeNPdds\eOjQr|q\ejejKfD ]&ZReGeReNdZSeSreSjQr qqq\eSjQeO_Qq\G dedf dfeKZTdS )i    )annotationsN)index)AddressFamily
SocketKind)	TYPE_CHECKINGAny	AwaitableCallableLiteralSupportsIndexTypeVarUnionoverload)wraps   )_core)Iterable)TracebackType)BufferConcatenate	ParamSpecSelf	TypeAlias)HostnameResolverSocketFactoryPTr   AddressFormatc                   @  sN   e Zd ZdddddZdddd	d
ZddddZdddddddZdS )	_try_syncNz&Callable[[BaseException], bool] | None)blocking_exc_overridec                 C  s
   || _ d S N)_blocking_exc_override)selfr    r#   0/tmp/pip-unpacked-wheel-ks04xdmi/trio/_socket.py__init__@   s    z_try_sync.__init__BaseExceptionboolexcreturnc                 C  s"   | j d krt|tS |  |S d S r    )r!   
isinstanceBlockingIOError)r"   r)   r#   r#   r$   _is_blocking_io_errorF   s    

z_try_sync._is_blocking_io_errorNoner*   c                   s   t j I d H  d S r    )triolowlevelZcheckpoint_if_cancelledr"   r#   r#   r$   
__aenter__L   s    z_try_sync.__aenter__type[BaseException] | NoneBaseException | NoneTracebackType | Noneexc_type	exc_value	tracebackr*   c                   s.   |d k	r|  |rdS tj I d H  dS d S )NTF)r-   r0   r1   Zcancel_shielded_checkpointr"   r8   r9   r:   r#   r#   r$   	__aexit__O   s    z_try_sync.__aexit__)N)__name__
__module____qualname__r%   r-   r3   r<   r#   r#   r#   r$   r   ?   s
    r   hostname_resolverz%_core.RunVar[HostnameResolver | None]	_resolversocket_factoryz"_core.RunVar[SocketFactory | None]_socket_factoryzHostnameResolver | None)r@   r*   c                 C  s   t d}t |  |S )a\  Set a custom hostname resolver.

    By default, Trio's :func:`getaddrinfo` and :func:`getnameinfo` functions
    use the standard system resolver functions. This function allows you to
    customize that behavior. The main intended use case is for testing, but it
    might also be useful for using third-party resolvers like `c-ares
    <https://c-ares.haxx.se/>`__ (though be warned that these rarely make
    perfect drop-in replacements for the system resolver). See
    :class:`trio.abc.HostnameResolver` for more details.

    Setting a custom hostname resolver affects all future calls to
    :func:`getaddrinfo` and :func:`getnameinfo` within the enclosing call to
    :func:`trio.run`. All other hostname resolution in Trio is implemented in
    terms of these functions.

    Generally you should call this function just once, right at the beginning
    of your program.

    Args:
      hostname_resolver (trio.abc.HostnameResolver or None): The new custom
          hostname resolver, or None to restore the default behavior.

    Returns:
      The previous hostname resolver (which may be None).

    N)rA   getset)r@   oldr#   r#   r$   set_custom_hostname_resolverg   s    

rG   zSocketFactory | None)rB   r*   c                 C  s   t d}t |  |S )a  Set a custom socket object factory.

    This function allows you to replace Trio's normal socket class with a
    custom class. This is very useful for testing, and probably a bad idea in
    any other circumstance. See :class:`trio.abc.HostnameResolver` for more
    details.

    Setting a custom socket factory affects all future calls to :func:`socket`
    within the enclosing call to :func:`trio.run`.

    Generally you should call this function just once, right at the beginning
    of your program.

    Args:
      socket_factory (trio.abc.SocketFactory or None): The new custom
          socket factory, or None to restore the default behavior.

    Returns:
      The previous socket factory (which may be None).

    N)rC   rD   rE   )rB   rF   r#   r#   r$   set_custom_socket_factory   s    

rH   zbytes | str | Nonezbytes | str | int | Noneintz]list[tuple[AddressFamily, SocketKind, int, str, tuple[str, int] | tuple[str, int, int, int]]])hostportfamilytypeprotoflagsr*   c                   s   ddddd}t |4 I dH , t| |||||tB W  5 Q I dH R  S Q I dH R X t| trz| d} W n" tk
r   tj| dd	} Y nX t	
d}|dk	r|| |||||I dH S tjjtj| |||||dd
I dH S dS )aT  Look up a numeric address given a name.

    Arguments and return values are identical to :func:`socket.getaddrinfo`,
    except that this version is async.

    Also, :func:`trio.socket.getaddrinfo` correctly uses IDNA 2008 to process
    non-ASCII domain names. (:func:`socket.getaddrinfo` uses IDNA 2003, which
    can give the wrong result in some cases and cause you to connect to a
    different host than the one you intended; see `bpo-17305
    <https://bugs.python.org/issue17305>`__.)

    This function's behavior can be customized using
    :func:`set_custom_hostname_resolver`.

    r&   r'   r(   c                 S  s   t | tjo| jtjkS r    )r+   _stdlib_socketgaierrorerrno
EAI_NONAME)r)   r#   r#   r$   numeric_only_failure   s    
z)getaddrinfo.<locals>.numeric_only_failureNasciiT)uts46Zabandon_on_cancel)r   rP   getaddrinfo_NUMERIC_ONLYr+   strencodeUnicodeEncodeError_idnarA   rD   r0   	to_threadrun_sync)rJ   rK   rL   rM   rN   rO   rT   hrr#   r#   r$   rX      s8    $"

rX   z+tuple[str, int] | tuple[str, int, int, int]ztuple[str, str])sockaddrrO   r*   c                   sD   t d}|dk	r$|| |I dH S tjjtj| |ddI dH S dS )a  Look up a name given a numeric address.

    Arguments and return values are identical to :func:`socket.getnameinfo`,
    except that this version is async.

    This function's behavior can be customized using
    :func:`set_custom_hostname_resolver`.

    NTrW   )rA   rD   getnameinfor0   r^   r_   rP   )ra   rO   r`   r#   r#   r$   rb     s    
rb   rZ   )namer*   c                   s   t jjtj| ddI dH S )zkLook up a protocol number by name. (Rarely used.)

    Like :func:`socket.getprotobyname`, but async.

    TrW   N)r0   r^   r_   rP   getprotobyname)rc   r#   r#   r$   rd     s
    rd   _stdlib_socket.socket
SocketType)sockr*   c                 C  s   t | S )z]Convert a standard library :class:`socket.socket` object into a Trio
    socket object.

    )_SocketTyperg   r#   r#   r$   from_stdlib_socket/  s    rj   r#   assignedupdatedr   zAddressFamily | intzSocketKind | int)fdrL   rM   rN   r*   c                 C  s,   t |||t| \}}}tt| |||S )z=Like :func:`socket.fromfd`, but returns a Trio socket object.)_sniff_sockopts_for_filenor   rj   rP   fromfd)rn   rL   rM   rN   type_r#   r#   r$   rp   7  s    rp   win32	fromsharebytes)infor*   c                 C  s   t t| S )z@Like :func:`socket.fromshare`, but returns a Trio socket object.)rj   rP   rs   )ru   r#   r#   r$   rs   G  s    FamilyTTypeTzLiteral[None]FamilyDefaultztuple[SocketType, SocketType])rL   rM   rN   r*   c                 C  s"   t | ||\}}t|t|fS )zTLike :func:`socket.socketpair`, but returns a pair of Trio socket
    objects.

    )rP   
socketpairrj   )rL   rM   rN   leftrightr#   r#   r$   ry   W  s    
ry   
int | None)rL   rM   rN   filenor*   c                 C  sV   |dkr*t d}|dk	r>|| ||S nt| |||\} }}t| |||}t|S )zCreate a new Trio socket, like :class:`socket.socket`.

    This function's behavior can be customized using
    :func:`set_custom_socket_factory`.

    N)rC   rD   socketro   rP   rj   )rL   rM   rN   r}   ZsfZstdlib_socketr#   r#   r$   r~   e  s    

r~   z1tuple[AddressFamily | int, SocketKind | int, int])rL   rq   rN   r}   r*   c           	      C  s|   t jdkr| ||fS ddlm}m}m}m} tj| |||d}z(|	||} |	||}|	||}W 5 |  X | ||fS )zCCorrect SOCKOPTS for given fileno, falling back to provided values.linuxr   )	SO_DOMAINSO_PROTOCOLSO_TYPE
SOL_SOCKET)r}   )
sysplatformr~   r   r   r   r   rP   detach
getsockopt)	rL   rq   rN   r}   r   r   r   r   Zsockobjr#   r#   r$   ro     s    



ro   SOCK_NONBLOCKSOCK_CLOEXECF2Callable[Concatenate[_stdlib_socket.socket, P], T]2Callable[[_stdlib_socket.socket], Awaitable[None]]r'   z3Callable[Concatenate[_SocketType, P], Awaitable[T]])fnwait_fnmaybe_availr*   c                   sX   t  dddddddd fd	d
}d j d|_|rT| jd j d7  _|S )N)r=   r#   rk   rh   P.argsP.kwargsr   )r"   argskwargsr*   c                   s   | j  f||I d H S r    )_nonblocking_helper)r"   r   r   r   r   r#   r$   wrapper  s    z1_make_simple_sock_method_wrapper.<locals>.wrapperzLike :meth:`socket.socket.z`, but async.

            z7Only available on platforms where :meth:`socket.socket.z` is available.)_wrapsr=   __doc__)r   r   r   r   r#   r   r$    _make_simple_sock_method_wrapper  s    r   r   z
bool | intr   )rq   rL   rN   ipv6_v6onlyaddresslocalr*   c             	     s  |t jkr*t|tr t|dkstdnp|t jkrbt|trXdt|  krVdksn tdn8tt dr|t jkrt|t	t
tjfstt|S |S |^}}}t|tr|d k	rzt || W n ttfk
r   Y nX |S |dkrd }|dkrd}d	}	|r|	t jO }	|t jkr,|s,|	t jO }	t|||| ||	I d H }
t|
d
ksVt|
^^ }}}|t jkrt|}t|dkstt|dkr|d |d< t|dkr|d |d< t|S |S )N   z&address should be a (host, port) tuple   z=address should be a (host, port, [flowinfo, [scopeid]]) tupleAF_UNIX z<broadcast>z255.255.255.255r   r      )rP   AF_INETr+   tuplelen
ValueErrorAF_INET6hasattrr   rZ   rt   osPathLikeAssertionErrorfspathrI   	inet_ptonOSError	TypeError
AI_PASSIVEAI_V4MAPPEDrX   list)rq   rL   rN   r   r   r   rJ   rK   _rO   Zgai_resnormedZlist_normedr#   r#   r$   _resolve_address_nocp  sP    



$



r   c                      s  e Zd Zdd fddZddddZdddd	Zd
dddZd
dddZeddddddZ	edddddddZ	ddddddddZ	edddddddZ
eddddddddZ
dddddddd dZ
eejd!fddd"d#d$Zd%dd&d'Zd%dd(d)d*Zejd+ks:esJeejd,rJddd-d.d/Zd0dd1d2Zd3d4d5dd6d7d8Zed9dd:d;Zed<dd=d>Zeddd?d@Zed%ddAdBZdCddDdEZd ddFdGZdddHdIZ d
ddJdKdLZ!dddMdNdOZ"d%ddPdQZ#dddRdSZ$dTddUdVZ%d
ddJdWdXZ&ddddZd[d\d]Z'dd^ddd_d`dadbZ(ddddcdddedfZ)dd^dddgd`dhdiZ*ejd+kseseejdjrdddddkdldmdnZ+ejd+kseseejdorddpdddqdrdsdtZ,dd^dd_dudvdwZ-ed^dxddydzd{Z.ed^ddxdd|d}d{Z.d~dddd{Z.ejd+ksjeseejdre/ejj0dddddpdddddddZ0  Z1S )rf   r.   r/   c                   s"   t    t| tkrtdd S )Nz`SocketType is an abstract class; use trio.socket.socket if you want to construct a socket object)superr%   rM   rf   r   r2   	__class__r#   r$   r%   "  s
    
zSocketType.__init__rI   c                 C  s   t d S r    NotImplementedErrorr2   r#   r#   r$   r   ,  s    zSocketType.detachc                 C  s   t d S r    r   r2   r#   r#   r$   r}   /  s    zSocketType.filenor   c                 C  s   t d S r    r   r2   r#   r#   r$   getpeername2  s    zSocketType.getpeernamec                 C  s   t d S r    r   r2   r#   r#   r$   getsockname5  s    zSocketType.getsocknameleveloptnamer*   c                C  s   d S r    r#   r"   r   r   r#   r#   r$   r   8  s    zSocketType.getsockoptrt   r   r   buflenr*   c                C  s   d S r    r#   r"   r   r   r   r#   r#   r$   r   ;  s    Nr|   int | bytesc                C  s   t d S r    r   r   r#   r#   r$   r   >  s    int | Bufferr   r   valuer*   c                C  s   d S r    r#   r"   r   r   r   r#   r#   r$   
setsockoptG  s    zSocketType.setsockoptr   r   r   optlenr*   c                C  s   d S r    r#   r"   r   r   r   r   r#   r#   r$   r   J  s    int | Buffer | Nonec                C  s   t d S r    r   r   r#   r#   r$   r   T  s       backlogr*   c                C  s   t d S r    r   r"   r   r#   r#   r$   listen^  s    zSocketType.listenr'   c                 C  s   t d S r    r   r2   r#   r#   r$   get_inheritablea  s    zSocketType.get_inheritableinheritabler*   c                 C  s   t d S r    r   r"   r   r#   r#   r$   set_inheritabled  s    zSocketType.set_inheritablerr   share
process_idr*   c                C  s   t d S r    r   r"   r   r#   r#   r$   r   k  s    zSocketType.sharer   c                 C  s   t d S r    r   r2   r#   r#   r$   	__enter__n  s    zSocketType.__enter__r4   r5   r6   r7   c                 C  s   t d S r    r   r;   r#   r#   r$   __exit__q  s    zSocketType.__exit__r   c                 C  s   t d S r    r   r2   r#   r#   r$   rL   y  s    zSocketType.familyr   c                 C  s   t d S r    r   r2   r#   r#   r$   rM   }  s    zSocketType.typec                 C  s   t d S r    r   r2   r#   r#   r$   rN     s    zSocketType.protoc                 C  s   t dS )zBReturn True if the socket has been shut down with the SHUT_WR flagNr   r2   r#   r#   r$   did_shutdown_SHUT_WR  s    zSocketType.did_shutdown_SHUT_WRrZ   c                 C  s   t d S r    r   r2   r#   r#   r$   __repr__  s    zSocketType.__repr__c                 C  s   t d S r    r   r2   r#   r#   r$   dup  s    zSocketType.dupc                 C  s   t d S r    r   r2   r#   r#   r$   close  s    zSocketType.closer   r*   c                   s   t d S r    r   r"   r   r#   r#   r$   bind  s    zSocketType.bindflagr*   c                 C  s   t d S r    r   r"   r   r#   r#   r$   shutdown  s    zSocketType.shutdownc                 C  s   t dS )zpReturn True if the socket is readable. This is checked with `select.select` on Windows, otherwise `select.poll`.Nr   r2   r#   r#   r$   is_readable  s    zSocketType.is_readablec                   s   t dS )zIConvenience method that calls trio.lowlevel.wait_writable for the object.Nr   r2   r#   r#   r$   wait_writable  s    zSocketType.wait_writable tuple[SocketType, AddressFormat]c                   s   t d S r    r   r2   r#   r#   r$   accept  s    zSocketType.acceptc                   s   t d S r    r   r   r#   r#   r$   connect  s    zSocketType.connectr   Awaitable[bytes]_SocketType__buflen_SocketType__flagsr*   c                 C  s   t d S r    r   _SocketType__selfr   r   r#   r#   r$   recv  s    zSocketType.recvr   Awaitable[int]buffernbytesrO   r*   c                 C  s   t d S r    r   r   r   r   rO   r#   r#   r$   	recv_into  s    zSocketType.recv_into&Awaitable[tuple[bytes, AddressFormat]]_SocketType__bufsizer   r*   c                 C  s   t d S r    r   r   r   r   r#   r#   r$   recvfrom  s    zSocketType.recvfrom$Awaitable[tuple[int, AddressFormat]]c                 C  s   t d S r    r   r   r#   r#   r$   recvfrom_into  s    zSocketType.recvfrom_intorecvmsg?Awaitable[tuple[bytes, list[tuple[int, int, bytes]], int, Any]]r   _SocketType__ancbufsizer   r*   c                 C  s   t d S r    r   r   r   r  r   r#   r#   r$   r     s    zSocketType.recvmsgrecvmsg_intoIterable[Buffer]=Awaitable[tuple[int, list[tuple[int, int, bytes]], int, Any]]_SocketType__buffersr  r   r*   c                 C  s   t d S r    r   r   r	  r  r   r#   r#   r$   r    s    zSocketType.recvmsg_into_SocketType__bytesr   r*   c                 C  s   t d S r    r   r   r  r   r#   r#   r$   send  s    zSocketType.send!tuple[object, ...] | str | Buffer_SocketType__data_SocketType__addressr*   c                   s   d S r    r#   r"   r  r  r#   r#   r$   sendto  s    zSocketType.sendtor  r   r  r*   c                   s   d S r    r#   r"   r  r   r  r#   r#   r$   r    s    r   r   r*   c                   s   t d S r    r   )r"   r   r#   r#   r$   r    s    sendmsgr#   rk   !Iterable[tuple[int, int, Buffer]]AddressFormat | Noner	  _SocketType__ancdatar   r  r*   c                   s   t d S r    r   r"   r	  r  r   r  r#   r#   r$   r    s    zSocketType.sendmsg)N)N)r   )r   r   )r   )r   r   )r   r   )r   r   )r   )r#   r   N)2r=   r>   r?   r%   r   r}   r   r   r   r   r   minrP   	SOMAXCONNr   r   r   r   r   r   r   r~   r   r   r   propertyrL   rM   rN   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   r  __classcell__r#   r#   r   r$   rf   !  s   
 	 

     
  
  
   __c                   @  s  e Zd ZddddZddddZddd	d
ZddddZddddZeddddddZ	edddddddZ	ddddddddZ	edddddddZ
eddddddd dZ
dddd!dddd"dZ
eejd#fddd$d%d&Zd'dd(d)Zd'dd*d+d,Zejd-ks6esFeejd.rFddd/d0d1Zd2dd3d4Zd5d6d7dd8d9d:Zed;dd<d=Zed>dd?d@ZedddAdBZed'ddCdDZdEddFdGZdHddIdJZdddKdLZ dddMdNdOZ!dddPdQdRZ"d'ddSdTZ#dddUdVZ$dd'ddWdXdYZ%dZd[d\d]d^d_d`daZ&e'ejj(e)j*Z+dbddcddZ(dddMdedfZ,erddddhdidjdkZ-e'ejj-e)j*Z-erddldddmdndodpZ.e'ejj.e)j*Z.erddddqdrdsdtZ/e'ejj/e)j*Z/erddldddudndvdwZ0e'ejj0e)j*Z0ejd-ks8esheejdxrherTdddddydzd{d|Z1e'ejj1e)j*d}d~Z1ejd-kseseejdrerddddddddZ2e'ejj2e)j*d}d~Z2erddlddmdddZ3e'ejj3e)j$Z3edldddddZ4edlddddddZ4e5ejj4ddddddddZ4ejd-ksRes|eejdr|e5ejj6ddddddddddddZ6dS )rh   re   ri   c                 C  s@   t |tjk	r$tdt |j d|| _| jd d| _d S )Nz.expected object of type 'socket.socket', not ''F)rM   rP   r~   r   r=   _socksetblocking_did_shutdown_SHUT_WR)r"   rg   r#   r#   r$   r%     s    z_SocketType.__init__rI   r/   c                 C  s
   | j  S r    )r$  r   r2   r#   r#   r$   r      s    z_SocketType.detachc                 C  s
   | j  S r    )r$  r}   r2   r#   r#   r$   r}   #  s    z_SocketType.filenor   c                 C  s
   | j  S r    )r$  r   r2   r#   r#   r$   r   &  s    z_SocketType.getpeernamec                 C  s
   | j  S r    )r$  r   r2   r#   r#   r$   r   )  s    z_SocketType.getsocknamer   c                C  s   d S r    r#   r   r#   r#   r$   r   ,  s    z_SocketType.getsockoptrt   r   c                C  s   d S r    r#   r   r#   r#   r$   r   /  s    Nr|   r   c                C  s&   |d kr| j ||S | j |||S r    )r$  r   r   r#   r#   r$   r   2  s    r   r.   r   c                C  s   d S r    r#   r   r#   r#   r$   r   =  s    z_SocketType.setsockoptr   c                C  s   d S r    r#   r   r#   r#   r$   r   @  s    r   c                C  sR   |d kr(|d krt d| j|||S |d k	r@t d|d| j||||S )NzKinvalid value for argument 'value', must not be None when specifying optlenz$invalid value for argument 'value': z%, must be None when specifying optlen)r   r$  r   r   r#   r#   r$   r   J  s    
r   r   c                C  s   | j |S r    )r$  r   r   r#   r#   r$   r   a  s    z_SocketType.listenr'   c                 C  s
   | j  S r    )r$  r   r2   r#   r#   r$   r   d  s    z_SocketType.get_inheritabler   c                 C  s   | j |S r    )r$  r   r   r#   r#   r$   r   g  s    z_SocketType.set_inheritablerr   r   r   c                C  s   | j |S r    )r$  r   r   r#   r#   r$   r   n  s    z_SocketType.sharer   c                 C  s   | S r    r#   r2   r#   r#   r$   r   q  s    z_SocketType.__enter__r4   r5   r6   r7   c                 C  s   | j |||S r    )r$  r   r;   r#   r#   r$   r   t  s    z_SocketType.__exit__r   c                 C  s   | j jS r    )r$  rL   r2   r#   r#   r$   rL   |  s    z_SocketType.familyr   c                 C  s   | j jS r    )r$  rM   r2   r#   r#   r$   rM     s    z_SocketType.typec                 C  s   | j jS r    )r$  rN   r2   r#   r#   r$   rN     s    z_SocketType.protoc                 C  s   | j S r    )r&  r2   r#   r#   r$   r     s    z _SocketType.did_shutdown_SHUT_WRrZ   c                 C  s   t | jddS )Nzsocket.socketztrio.socket.socket)reprr$  replacer2   r#   r#   r$   r     s    z_SocketType.__repr__rf   c                 C  s   t | j S )z"Same as :meth:`socket.socket.dup`.)rh   r$  r   r2   r#   r#   r$   r     s    z_SocketType.dupc                 C  s*   | j  dkr&tj| j  | j   d S )N)r$  r}   r0   r1   Znotify_closingr   r2   r#   r#   r$   r     s    z_SocketType.closer   c                   sj   | j |ddI d H }ttdrJ| jtjkrJ|d rJtj| jj	|I d H S tj
 I d H  | j	|S d S )NTr   r   r   )r   r   rP   rL   r   r0   r^   r_   r$  r   r1   
checkpointr   r#   r#   r$   r     s    
z_SocketType.bindr   c                 C  s&   | j | |tjtjfkr"d| _d S )NT)r$  r   rP   SHUT_WR	SHUT_RDWRr&  r   r#   r#   r$   r     s    z_SocketType.shutdownc                 C  sR   t jdkr,t| jgg g d\}}}t|S t }|| jtj t|dS )Nrr   r   )r   r   selectr$  r'   pollregisterPOLLIN)r"   rreadyr   pr#   r#   r$   r     s    
z_SocketType.is_readablec                   s   t | jI d H  d S r    )r   r   r$  r2   r#   r#   r$   r     s    z_SocketType.wait_writable)r   r   r*   c                  sD   | j tjkr | jtjtj}nd}t| j| j | j	|||dI d H S )NF)r   r   r   )
rL   rP   r   r$  r   IPPROTO_IPV6IPV6_V6ONLYr   rM   rN   )r"   r   r   r   r#   r#   r$   r     s    z!_SocketType._resolve_address_nocpr   r   r   r   r   )r   r   r   r   r*   c                   s   t  4 I d H & || jf||W  5 Q I d H R  S Q I d H R X || jI d H  z|| jf||W S  tk
rx   Y q@X q@d S r    )r   r$  r,   )r"   r   r   r   r   r#   r#   r$   r     s    0z_SocketType._nonblocking_helperr   c                   s   |   I dH \}}t||fS )z-Like :meth:`socket.socket.accept`, but async.N)_acceptrj   )r"   rg   addrr#   r#   r$   r     s    z_SocketType.acceptc                   s   zf| j |ddI d H }t 4 I d H " | j|W  5 Q I d H R  W S Q I d H R X t| jI d H  W n" tjk
r   | j   Y nX | j	t
jt
j}|dkrt|d|dt| d S )NFr*  r   zError connecting to z: )r   r   r$  r   r   r   r0   Z	Cancelledr   r   rP   r   SO_ERRORr   r   strerror)r"   r   errr#   r#   r$   r     s    0,
z_SocketType.connectr   r   r   c                 C  s   d S r    r#   r   r#   r#   r$   r   a      z_SocketType.recvr   r   r   c                 C  s   d S r    r#   r   r#   r#   r$   r   q  s    z_SocketType.recv_intor   r   c                 C  s   d S r    r#   r   r#   r#   r$   r     s    z_SocketType.recvfromr   c                 C  s   d S r    r#   r   r#   r#   r$   r     s    z_SocketType.recvfrom_intor   r  r  c                 C  s   d S r    r#   r  r#   r#   r$   r     s    z_SocketType.recvmsgT)r   r  r  r  r  c                 C  s   d S r    r#   r
  r#   r#   r$   r    s    z_SocketType.recvmsg_intor  c                 C  s   d S r    r#   r  r#   r#   r$   r    r;  z_SocketType.sendr  r  c                   s   d S r    r#   r  r#   r#   r$   r    s    z_SocketType.sendtor  c                   s   d S r    r#   r  r#   r#   r$   r    s    r#   rk   r   r  c                   sB   t |}| j|d ddI dH |d< | jtjtjjf| I dH S )z3Similar to :meth:`socket.socket.sendto`, but async.r)  Fr*  N)r   r   r   r   r   rP   r~   r  )r"   r   Z	args_listr#   r#   r$   r    s    r  r  r  r  c                   s<   |dk	r| j |ddI dH }| tjtjj||||I dH S )zSimilar to :meth:`socket.socket.sendmsg`, but async.

            Only available on platforms where :meth:`socket.socket.sendmsg` is
            available.

            NFr*  )r   r   r   r   rP   r~   r  r  r#   r#   r$   r    s    z_SocketType.sendmsg)N)N)r   )r   r   )r   )r   r   )r   r   )r   r   )r   )r#   r   N)7r=   r>   r?   r%   r   r}   r   r   r   r   r   r  rP   r  r   r   r   r   r   r   r   r~   r   r   r   r   rL   rM   rN   r   r   r   r   r   r   r   r   r   r   r   r   r   Zwait_readabler6  r   r   r   r   r   r   r  r  r  r   r  r#   r#   r#   r$   rh     s    
	*	N	  	 	  	
  

  
	
   rh   )r   r   r   r   )F)U
__future__r   r   r.  r~   rP   r   operatorr   r   r   typingr   r   r   r	   r
   r   r   r   r   idnar]   r0   Z
trio._utilr   r   r   r   collections.abcr   typesr   Ztyping_extensionsr   r   r   r   r   _abcr   r   r   r   r   __annotations__r   ZRunVarrA   rC   rG   rH   AI_NUMERICHOSTAI_NUMERICSERVrY   rX   rb   rd   rj   rp   r   SOCK_STREAMr   r   rs   rI   rv   rw   rx   ry   ro   getattrZ_SOCK_TYPE_MASKr   r   rf   __dict__itemsrc   obj
startswithr   Zstdlib_typeZ
stdlib_objrh   r#   r#   r#   r$   <module>   s    ,$"!    S*

	 'J a
