o
    JXh,                     @   s   d dl Z d dlZd dlZd dlZd dlZddlmZ dZdZdZ	ej
ejfddZefd	d
Zdd Zdd Ze Zdadd Zdd Ze Ze jeddddZdS )    N   )support	localhostz	127.0.0.1z::1c                 C   s@   	 t  | |}t|}W d    ~|S 1 sw   Y  ~|S )N)socket	bind_port)familysocktypeZtempsockport r
   D/opt/python-3.10.19/usr/lib/python3.10/test/support/socket_helper.pyfind_unused_port   s   7

r   c                 C   s   	 | j tjkrO| jtjkrOttdr!| tjtjdkr!t	
dttdrAz| tjtjdkr6t	
dW n	 ty@   Y nw ttdrO| tjtjd | |df |  d }|S )NSO_REUSEADDR   zHtests should never set the SO_REUSEADDR socket option on TCP/IP sockets!SO_REUSEPORTzHtests should never set the SO_REUSEPORT socket option on TCP/IP sockets!SO_EXCLUSIVEADDRUSEr   )r   r   AF_INETtypeSOCK_STREAMhasattr
getsockopt
SOL_SOCKETr   r   Z
TestFailedr   OSError
setsockoptr   bindgetsockname)sockhostr	   r
   r
   r   r   L   s$   




r   c                 C   s4   	 z|  | W d S  ty   |   tdw )Nzcannot bind AF_UNIX sockets)r   PermissionErrorcloseunittestZSkipTest)r   addrr
   r
   r   bind_unix_sockets   s   
r!   c                  C   s~   	 t jr=d } z.zt  t jt j} | tdf W W | r!|   dS dS  ty+   Y nw W | r3|   dS | r<|   w w dS )Nr   TF)r   has_ipv6AF_INET6r   r   HOSTv6r   r   )r   r
   r
   r   _is_ipv6_enabled|   s*   
r%   c                 C   s   	 t tdstd| S td u r]ddlm}m} |d }ttj2}z$z	|	| daW n t
yB } z|aW Y d }~nd }~ww W || n|| w W d    n1 sXw   Y  trjdt }t|| S | S )NAF_UNIXzNo UNIX Socketsr   )TESTFNunlinkZcan_bind_unix_socketFz%Requires a functional unix bind(): %s)r   r   r   skip_bind_nix_socket_errorZ	os_helperr'   r(   r&   r   r   )testr'   r(   pathr   emsgr
   r
   r   skip_unless_bind_unix_socket   s*   

r/   c                  C   s`   	 t jg} tt dr| t j tt dr| t j tt dr&| t j ts.| t j | S )NENETUNREACHEADDRNOTAVAILEHOSTUNREACH)	errnoECONNREFUSEDr   appendr0   r1   r2   IPV6_ENABLEDZEAFNOSUPPORT)errorsr
   r
   r   get_socket_conn_refused_errs   s   


r8   r
   )timeouterrnosc          
   
   #   sn   	 dd l }dd l|tu rtj}g d}g d}td|  | g  s4dd |D  dd |D  fdd	}t }zoz|d urLt| d V  W nX |j	yn } ztj
rgtjjd d
  |d }~w ty } z/	 |j}	t|	dkrt|	d tr|	d }nt|	dkrt|	d tr|	d }nnqv||  d }~ww W t| d S t| w )Nr   ))r4   o   )Z
ECONNRESETh   )r2   q   )r0   e   )Z	ETIMEDOUTn   )r1   c   ))	EAI_AGAIN)EAI_FAIL)
EAI_NONAME)
EAI_NODATA)Z
WSANO_DATAi*  zResource %r is not availablec                 S      g | ]
\}}t t||qS r
   )getattrr3   .0namenumr
   r
   r   
<listcomp>       z&transient_internet.<locals>.<listcomp>c                 S   rI   r
   )rJ   r   rK   r
   r
   r   rO      rP   c                    s   t | dd }t| tsBt| tjr|v sBt| jjr(d| j  kr'dksBn t| jjr>d| j	v sBd| j	v sBd| j	v sB| v rSt
jsPtjjd d  | d S )	Nr3   i  iW  ConnectionRefusedErrorTimeoutErrorEOFErrorr   
)rJ   
isinstancerR   r   gaierrorerror	HTTPErrorcodeURLErrorreasonr   verbosesysstderrwriteargs)errnZcaptured_errnosZdeniedZ
gai_errnosurllibr
   r   filter_error   s$   




z(transient_internet.<locals>.filter_errorrT   Tr   r   )nntplibZurllib.error_NOT_SETr   ZINTERNET_TIMEOUTZResourceDeniedr   getdefaulttimeoutsetdefaulttimeoutZNNTPTemporaryErrorr\   r]   r^   r_   r`   r   lenrU   )
Zresource_namer9   r:   rf   Zdefault_errnosZdefault_gai_errnosre   Zold_timeoutra   ar
   rc   r   transient_internet   sX   
	



rl   )
contextlibr3   r   r   r]    r   ZHOSTZHOSTv4r$   r   r   r   r   r!   r%   r6   r*   r/   r8   objectrg   contextmanagerrl   r
   r
   r
   r   <module>   s(    ='	