o
    ^i                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZ dd Zdd Zdd	 Z	d
d Z
d e jdfddZdddZd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   X   zt  t jt j} | t jt jd | d |   W dS  t jt	t
fy+   Y dS w )z'Check if we can bind to IPv4 localhost.   )	127.0.0.1r   TF)socketAF_INETSOCK_STREAM
setsockopt
SOL_SOCKETSO_REUSEADDRbindcloseerrorOSErrorAttributeErrorsock r   Q/home/ubuntu/hpml_nyu/venv/lib/python3.10/site-packages/debugpy/common/sockets.pycan_bind_ipv4_localhost      
r   c               
   C   r   )z'Check if we can bind to IPv6 localhost.r   )::1r   TF)r   AF_INET6r	   r
   r   r   r   r   r   r   r   r   r   r   r   can_bind_ipv6_localhost   r   r   c                   C   s   t  rdS t r
dS dS )z~Get the default localhost address.
    Defaults to IPv4 '127.0.0.1', but falls back to IPv6 '::1' if IPv4 is unavailable.
    r   r   )r   r   r   r   r   r   get_default_localhost$   s
   r   c              
   C   sR   z|   dd \}}W ||fS  ty( } ztd td| |d}~ww )z&Gets the socket address host and port.N   zFailed to get socket address:zFailed to get socket address: )getsockname	Exceptionr   swallow_exceptionRuntimeError)r   hostportexcr   r   r   get_address4   s   
r$   c              	   C   s   |dksJ | du rt  } |du rd}| ddk}zFt|}|dkrItjdkr2|tjtjd nz|tjtj	d W n t
tfyH   Y nw || |f |durY|| || W |S  tyl   |   w )z9Return a local server socket listening on the given port.r   N:r   win32)r   count	_new_socksysplatformr
   r   r   SO_EXCLUSIVEADDRUSEr   r   r   r   
settimeoutlistenr   r   )r!   r"   backlogtimeoutipv6serverr   r   r   create_server>   s2   

r2   Fc                 C   s   t | S )zAReturn a client socket that may be connected to a remote address.)r(   )r0   r   r   r   create_client_   s   r3   c              	   C   s   | rt jnt j}t  |t jt j}z|t jt jd W n tt	fy'   Y nw z|t jt j
d W n tt	fy>   Y nw z|t jt jd W n tt	fyU   Y nw z|t jt jd W |S  tt	fyn   Y |S w )Nr         )r   r   r   r	   IPPROTO_TCPr
   r   SO_KEEPALIVEr   r   TCP_KEEPIDLETCP_KEEPINTVLTCP_KEEPCNT)r0   address_familyr   r   r   r   r(   d   s0   r(   c                 C   s   |  | dS )zShut down the given socket.N)shutdown)r   howr   r   r   	shut_down   s   r>   c                 C   s,   zt |  W n	 ty   Y nw |   dS )zShutdown and close the socket.N)r>   r   r   r   r   r   r   close_socket   s   r?   c              	      s   |dksJ z	t ||||W n ty    td|| Y nw t\}}td||  fdd}tj|d}d|_t	| |
  S )zAccepts 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               	      sX   	 z  \} }|d d \}}W n ttjfy   Y d S w td||  |  q)NTr   z.Accepted incoming {0} connection from {1}:{2}.)acceptr   r   r   r   info)r   address
other_host
other_porthandlerlistenernamer   r   accept_worker   s   zserve.<locals>.accept_worker)targetT)r2   r   r   reraise_exceptionr$   rA   	threadingThreaddaemonr   start)rH   rF   r!   r"   r.   r/   rI   threadr   rE   r   serve   s    rQ   )F)r   r)   rL   debugpy.commonr   debugpy.common.utilr   r   r   r   r$   	SOMAXCONNr2   r3   r(   	SHUT_RDWRr>   r?   rQ   r   r   r   r   <module>   s   

!
	