o
    øT·jj3  ã                   @  s  U d dl mZ d dlZd dlZd dlmZ d dlmZmZm	Z	 d dl
mZ d dlmZ d dlmZmZ d dlmZ d d	lmZmZmZmZ d
dlmZ d
dlmZmZmZ ddlmZmZm Z  ergddl!m"Z" e#eB eB Z$de%d< e&e#e'f Z(de%d< e(e#B Z)de%d< e&e*e(f Z+de%d< e&e*e#f Z,de%d< edƒZ-ej.fdddœd8d$d%„Z/G d&d'„ d'eƒZ0G d(d)„ d)eƒZ1G d*d+„ d+ee1ƒZ2G d,d-„ d-e2ƒZ3G d.d/„ d/ee2 e1ƒZ4G d0d1„ d1e e+ e1ƒZ5G d2d3„ d3e e* e1ƒZ6G d4d5„ d5e e, e1ƒZ7G d6d7„ d7e e* e1ƒZ8dS )9é    )ÚannotationsN)Úabstractmethod)ÚCallableÚ
CollectionÚMapping)ÚAsyncExitStack)ÚIOBase)ÚIPv4AddressÚIPv6Address)ÚAddressFamily)ÚTYPE_CHECKINGÚAnyÚ	TypeAliasÚTypeVaré   )Úget_async_backend)ÚTypedAttributeProviderÚTypedAttributeSetÚtyped_attributeé   )Ú
ByteStreamÚListenerÚUnreliableObjectStream)Ú	TaskGroupr   ÚIPAddressTypeÚIPSockAddrTypeÚSockAddrTypeÚUDPPacketTypeÚUNIXDatagramPacketTypeÚT_RetvalF)Úrequire_connectedÚrequire_boundÚ
sock_or_fdúsocket.socket | intÚ	sock_typeúsocket.SocketKindÚaddr_familyúsocket.AddressFamilyr    Úboolr!   Úreturnúsocket.socketc             
   C  s   t | tƒr4ztj| d�}W n: ty3 } z|jtjkr tdƒ|‚|r'tdƒ|‚|r.tdƒ|‚‚ d }~ww t | tjƒr=| }ntdt| ƒj	› d�ƒ‚zo|rcz| 
¡  W n tyb } ztdƒ|‚d }~ww |r�z|jtjtjfv rv| ¡ d }n| ¡ }W n ty†   d }Y nw |s�tdƒ‚|tjkr¤|j|kr¤td|j› d	|jj› �ƒ‚|j|kr¶td
|j› d	|jj› �ƒ‚W n tyÈ   t | tƒrÇ| ¡  ‚ w | d¡ |S )N)Úfilenoz.the file descriptor does not refer to a socketzthe socket must be connectedz+the socket must be bound to a local addresszexpected an int or socket, got z insteadr   z"address family mismatch: expected z, got zsocket type mismatch: expected F)Ú
isinstanceÚintÚsocketÚOSErrorÚerrnoÚENOTSOCKÚ
ValueErrorÚ	TypeErrorÚtypeÚ__qualname__ÚgetpeernameÚfamilyÚAF_INETÚAF_INET6ÚgetsocknameÚ	AF_UNSPECÚnameÚBaseExceptionÚdetachÚsetblocking)r"   r$   r&   r    r!   ÚsockÚexcÚ
bound_addr© rC   úU/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/anyio/abc/_sockets.pyÚ_validate_socket    sv   
ÿþ

€öÿ
€ÿ€ÿ
ÿÿ
ÿÿ
û
rE   c                   @  sf   e Zd ZU dZeƒ Zded< eƒ Zded< eƒ Zded< eƒ Z	ded	< eƒ Z
ded
< eƒ Zded< dS )ÚSocketAttributeaý  
    .. attribute:: family
        :type: socket.AddressFamily

        the address family of the underlying socket

    .. attribute:: local_address
        :type: tuple[str, int] | str

        the local address the underlying socket is connected to

    .. attribute:: local_port
        :type: int

        for IP based sockets, the local port the underlying socket is bound to

    .. attribute:: raw_socket
        :type: socket.socket

        the underlying stdlib socket object

    .. attribute:: remote_address
        :type: tuple[str, int] | str

        the remote address the underlying socket is connected to

    .. attribute:: remote_port
        :type: int

        for IP based sockets, the remote port the underlying socket is connected to
    r   r7   r   Úlocal_addressr-   Ú
local_portr*   Ú
raw_socketÚremote_addressÚremote_portN)Ú__name__Ú
__module__r5   Ú__doc__r   r7   Ú__annotations__rG   rH   rI   rJ   rK   rC   rC   rC   rD   rF   e   s   
  rF   c                   @  s,   e Zd Zed	dd„ƒZeed
dd„ƒƒZdS )Ú_SocketProviderr)   úMapping[Any, Callable[[], Any]]c                   sÌ   ddl m‰  tj‡fdd„tj‡ ‡fdd„tj‡fdd„i}z	ˆ ˆj ¡ ƒ‰W n ty2   d ‰Y nw ˆd ur@‡fdd„|tj	< ˆjjt
jt
jfv rd‡fdd„|tj< ˆd urdˆd	 ‰‡fd
d„|tj< |S )Nr   )Úconvert_ipv6_sockaddrc                     s   ˆ j jS ©N)Ú_raw_socketr7   rC   ©ÚselfrC   rD   Ú<lambda>”   s    z2_SocketProvider.extra_attributes.<locals>.<lambda>c                     s   ˆ ˆj  ¡ ƒS rS   ©rT   r:   rC   )ÚconvertrV   rC   rD   rW   •   s    ÿc                     s   ˆ j S rS   )rT   rC   rU   rC   rD   rW   ˜   ó    c                     ó   ˆ S rS   rC   rC   )ÚpeernamerC   rD   rW   ¡   ó    c                     s   ˆ j  ¡ d S )Nr   rX   rC   rU   rC   rD   rW   ¥   s   r   c                     r[   rS   rC   rC   )rK   rC   rD   rW   ª   r]   )Ú_core._socketsrR   rF   r7   rG   rI   rT   r6   r/   rJ   r   r8   r9   rH   rK   )rV   Ú
attributesrC   )rY   r\   rK   rV   rD   Úextra_attributes�   s$   ûÿz _SocketProvider.extra_attributesr*   c                 C  s   d S rS   rC   rU   rC   rC   rD   rT   ®   s   z_SocketProvider._raw_socketN)r)   rQ   )r)   r*   )rL   rM   r5   Úpropertyr`   r   rT   rC   rC   rC   rD   rP   Ž   s    rP   c                   @  ó   e Zd ZdZeddd„ƒZdS )	ÚSocketStreamzu
    Transports bytes over a socket.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    r"   r#   r)   c                 Ã  ó$   �t |tjdd�}tƒ  |¡I dH S )aH  
        Wrap an existing socket object or file descriptor as a socket stream.

        The newly created socket wrapper takes ownership of the socket being passed in.
        The existing socket must already be connected.

        :param sock_or_fd: a socket object or file descriptor
        :return: a socket stream

        T©r    N)rE   r.   ÚSOCK_STREAMr   Úwrap_stream_socket©Úclsr"   r@   rC   rC   rD   Úfrom_socket»   ó   €zSocketStream.from_socketN)r"   r#   r)   rc   ©rL   rM   r5   rN   Úclassmethodrj   rC   rC   rC   rD   rc   ´   ó    rc   c                   @  s6   e Zd Zeddd„ƒZeddd„ƒZeddd„ƒZdS )ÚUNIXSocketStreamr"   r#   r)   c                 Ã  ó(   �t |tjtjdd�}tƒ  |¡I dH S )aR  
        Wrap an existing socket object or file descriptor as a UNIX socket stream.

        The newly created socket wrapper takes ownership of the socket being passed in.
        The existing socket must already be connected.

        :param sock_or_fd: a socket object or file descriptor
        :return: a UNIX socket stream

        Tre   N)rE   r.   rf   ÚAF_UNIXr   Úwrap_unix_stream_socketrh   rC   rC   rD   rj   Ì   s
   €ÿzUNIXSocketStream.from_socketÚmessageÚbytesÚfdsúCollection[int | IOBase]ÚNonec                 Ã  ó   �dS )zð
        Send file descriptors along with a message to the peer.

        :param message: a non-empty bytestring
        :param fds: a collection of files (either numeric file descriptors or open file
            or socket objects)
        NrC   )rV   rs   ru   rC   rC   rD   Úsend_fdsÝ   rZ   zUNIXSocketStream.send_fdsÚmsglenr-   Úmaxfdsútuple[bytes, list[int]]c                 Ã  rx   )a  
        Receive file descriptors along with a message from the peer.

        :param msglen: length of the message to expect from the peer
        :param maxfds: maximum number of file descriptors to expect from the peer
        :return: a tuple of (message, file descriptors)
        NrC   )rV   rz   r{   rC   rC   rD   Úreceive_fdsç   rZ   zUNIXSocketStream.receive_fdsN)r"   r#   r)   ro   )rs   rt   ru   rv   r)   rw   )rz   r-   r{   r-   r)   r|   )rL   rM   r5   rm   rj   r   ry   r}   rC   rC   rC   rD   ro   Ë   s    	ro   c                   @  s:   e Zd ZdZeddd„ƒZeddd	„ƒZ	
dddd„Zd
S )ÚSocketListenerz}
    Listens to incoming socket connections.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    r"   r#   r)   c                 Ã  rd   )a  
        Wrap an existing socket object or file descriptor as a socket listener.

        The newly created listener takes ownership of the socket being passed in.

        :param sock_or_fd: a socket object or file descriptor
        :return: a socket listener

        T©r!   N)rE   r.   rf   r   Úwrap_listener_socketrh   rC   rC   rD   rj   ù   s   €zSocketListener.from_socketrc   c                 Ã  rx   )zAccept an incoming connection.NrC   rU   rC   rC   rD   Úaccept
  rZ   zSocketListener.acceptNÚhandlerúCallable[[SocketStream], Any]Ú
task_groupúTaskGroup | Nonerw   c              	   Ã  sp   �ddl m} tƒ 4 I d H š}|d u r| |ƒ ¡I d H }	 |  ¡ I d H }| ||¡ q1 I d H s1w   Y  d S )Nr   )Úcreate_task_group)Ú r†   r   Úenter_async_contextr�   Ú
start_soon)rV   r‚   r„   r†   ÚstackÚstreamrC   rC   rD   Úserve  s   €þüzSocketListener.serve)r"   r#   r)   r~   )r)   rc   rS   )r‚   rƒ   r„   r…   r)   rw   )	rL   rM   r5   rN   rm   rj   r   r�   rŒ   rC   rC   rC   rD   r~   ò   s    ýr~   c                   @  s(   e Zd ZdZeddd„ƒZddd„ZdS )Ú	UDPSocketz{
    Represents an unconnected UDP socket.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    r"   r#   r)   c                 Ã  rd   )aI  
        Wrap an existing socket object or file descriptor as a UDP socket.

        The newly created socket wrapper takes ownership of the socket being passed in.
        The existing socket must be bound to a local address.

        :param sock_or_fd: a socket object or file descriptor
        :return: a UDP socket

        Tr   N)rE   r.   Ú
SOCK_DGRAMr   Úwrap_udp_socketrh   rC   rC   rD   rj   %  rk   zUDPSocket.from_socketÚdatart   ÚhostÚstrÚportr-   rw   c                 Ã  s   �|   |||ff¡I dH S )z^
        Alias for :meth:`~.UnreliableObjectSendStream.send` ((data, (host, port))).

        N©Úsend)rV   r�   r‘   r“   rC   rC   rD   Úsendto4  s   €zUDPSocket.sendtoN)r"   r#   r)   r�   )r�   rt   r‘   r’   r“   r-   r)   rw   ©rL   rM   r5   rN   rm   rj   r–   rC   rC   rC   rD   r�     s
    r�   c                   @  rb   )	ÚConnectedUDPSocketzy
    Represents an connected UDP socket.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    r"   r#   r)   c                 Ã  rd   )aV  
        Wrap an existing socket object or file descriptor as a connected UDP socket.

        The newly created socket wrapper takes ownership of the socket being passed in.
        The existing socket must already be connected.

        :param sock_or_fd: a socket object or file descriptor
        :return: a connected UDP socket

        Tre   N)rE   r.   rŽ   r   Úwrap_connected_udp_socketrh   rC   rC   rD   rj   C  s   €ýzConnectedUDPSocket.from_socketN)r"   r#   r)   r˜   rl   rC   rC   rC   rD   r˜   <  rn   r˜   c                   @  s(   e Zd ZdZeddd„ƒZddd„ZdS )ÚUNIXDatagramSocketz…
    Represents an unconnected Unix datagram socket.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    r"   r#   r)   c                 Ã  s$   �t |tjtjƒ}tƒ  |¡I dH S )a'  
        Wrap an existing socket object or file descriptor as a UNIX datagram
        socket.

        The newly created socket wrapper takes ownership of the socket being passed in.

        :param sock_or_fd: a socket object or file descriptor
        :return: a UNIX datagram socket

        N)rE   r.   rŽ   rq   r   Úwrap_unix_datagram_socketrh   rC   rC   rD   rj   `  s   €zUNIXDatagramSocket.from_socketr�   rt   Úpathr’   rw   c                 Ã  s   �|   ||f¡I dH S )zCAlias for :meth:`~.UnreliableObjectSendStream.send` ((data, path)).Nr”   )rV   r�   rœ   rC   rC   rD   r–   r  s   €zUNIXDatagramSocket.sendtoN)r"   r#   r)   rš   )r�   rt   rœ   r’   r)   rw   r—   rC   rC   rC   rD   rš   W  s
    rš   c                   @  rb   )	ÚConnectedUNIXDatagramSocketz‚
    Represents a connected Unix datagram socket.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    r"   r#   r)   c                 Ã  rp   )ar  
        Wrap an existing socket object or file descriptor as a connected UNIX datagram
        socket.

        The newly created socket wrapper takes ownership of the socket being passed in.
        The existing socket must already be connected.

        :param sock_or_fd: a socket object or file descriptor
        :return: a connected UNIX datagram socket

        Tre   N)rE   r.   rŽ   rq   r   Ú#wrap_connected_unix_datagram_socketrh   rC   rC   rD   rj   ~  s
   €ÿz'ConnectedUNIXDatagramSocket.from_socketN)r"   r#   r)   r�   rl   rC   rC   rC   rD   r�   w  rn   r�   )r"   r#   r$   r%   r&   r'   r    r(   r!   r(   r)   r*   )9Ú
__future__r   r0   r.   Úabcr   Úcollections.abcr   r   r   Ú
contextlibr   Úior   Ú	ipaddressr	   r
   r   Útypingr   r   r   r   Ú_core._eventloopr   Ú_core._typedattrr   r   r   Ú_streamsr   r   r   Ú_tasksr   r’   r   rO   Útupler-   r   r   rt   r   r   r   r;   rE   rF   rP   rc   ro   r~   r�   r˜   rš   r�   rC   rC   rC   rD   Ú<module>   sJ    ýúE)&',
ÿ 