U
    ‡ª/e€  ã                   @   s~   d dl Z d dlZd dlZd dlmZ d dlmZ d e jdfdd„Zdd„ Z	dd	„ Z
e jfd
d„Zdd„ Zd e jdfdd„ZdS )é    N)Úlog)Úhide_thread_from_debuggerc              	   C   sÒ   |dkst ‚| dkrd} |dkr$d}zŠtƒ }|dkr‚tjdkrR| tjtjd¡ n0z| tjtjd¡ W n t	t
fk
r€   Y nX | | |f¡ |dk	r¢| |¡ | |¡ W n tk
rÌ   | ¡  ‚ Y nX |S )z9Return a local server socket listening on the given port.r   Nz	127.0.0.1Úwin32é   )ÚAssertionErrorÚ	_new_sockÚsysÚplatformÚ
setsockoptÚsocketÚ
SOL_SOCKETZSO_EXCLUSIVEADDRUSEÚSO_REUSEADDRÚAttributeErrorÚOSErrorÚbindÚ
settimeoutÚlistenÚ	ExceptionÚclose)ÚhostÚportÚbacklogÚtimeoutÚserver© r   ú:/tmp/pip-unpacked-wheel-dg3irmqq/debugpy/common/sockets.pyÚcreate_server   s,    

r   c                   C   s   t ƒ S )zAReturn a client socket that may be connected to a remote address.)r   r   r   r   r   Úcreate_client-   s    r   c               	   C   sØ   t   t jt jt j¡} z|  t jt jd¡ W n ttfk
rB   Y nX z|  t jt j	d¡ W n ttfk
rr   Y nX z|  t jt j
d¡ W n ttfk
r¢   Y nX z|  t jt jd¡ W n ttfk
rÒ   Y nX | S )Nr   é   é   )r   ÚAF_INETÚSOCK_STREAMÚIPPROTO_TCPr
   r   ÚSO_KEEPALIVEr   r   ÚTCP_KEEPIDLEÚTCP_KEEPINTVLÚTCP_KEEPCNT©Úsockr   r   r   r   2   s$    r   c                 C   s   |   |¡ dS )zShut down the given socket.N)Úshutdown)r(   Úhowr   r   r   Ú	shut_downL   s    r+   c                 C   s.   zt | ƒ W n tk
r    Y nX |  ¡  dS )zShutdown and close the socket.N)r+   r   r   r'   r   r   r   Úclose_socketQ   s
    r,   c              	      s–   |dkst ‚zt||||ƒ‰W n$ tk
rB   t dˆ||¡ Y nX ˆ ¡ \}}t dˆ||¡ ‡ ‡‡fdd„}tj|d}d|_	t
|ƒ | ¡  ˆS )z¬Accepts TCP connections on the specified host and port, and invokes the
    provided handler function for every new connection.

    Returns the created server socket.
    r   z8Error listening for incoming {0} connections on {1}:{2}:z4Listening for incoming {0} connections on {1}:{2}...c               	      sR   zˆ  ¡ \} \}}W n ttjfk
r2   Y qNY nX t dˆ||¡ ˆ | ƒ q d S )Nz.Accepted incoming {0} connection from {1}:{2}.)Úacceptr   r   Úerrorr   Úinfo)r(   Z
other_hostZ
other_port©ÚhandlerZlistenerÚnamer   r   Úaccept_workerl   s    
üzserve.<locals>.accept_worker)ÚtargetT)r   r   r   r   Zreraise_exceptionÚgetsocknamer/   Ú	threadingÚThreadÚdaemonr   Ústart)r2   r1   r   r   r   r   r3   Úthreadr   r0   r   ÚserveZ   s$       ÿ
r;   )r   r   r6   Zdebugpy.commonr   Zdebugpy.common.utilr   Ú	SOMAXCONNr   r   r   Ú	SHUT_RDWRr+   r,   r;   r   r   r   r   Ú<module>   s    	