o
    JAf}                     @   s  g d Z ddlZddlZddlZddlZ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dl
mZmZ ddlmZ ejZzddlZddlmZmZmZmZ W n eyb   ejdkr^ dZY nw d	Zd
Ze ZdZdgZeedr|dZedg7 ZejdkrdZedg7 ZefddZ dd Z!dd Z"dd Z#dd Z$G dd dZ%erG dd de%Z&G dd de%Z'G dd de(Z)dPd d!Z*ejdkrdQd#d$Z+ndQd%d$Z+G d&d' d'e(Z,d(d) Z-ejdkrG d*d+ d+e(Z.d,d- Z/d.Z0d/Z1d0Z2d1Z3d2d3 Z4d4d5 Z5G d6d7 d7e(Z6d8d9 Z7d:d; Z8G d<d= d=e)Z9d>d? Z:ejdkr3d@dA Z;ej<ej=hZ>dRdBdCZ?nddl@Z@ee@dDrAe@jAZBne@jCZBdRdEdCZ?ejdkrmdFdG ZDdHdI ZEeFe'eD dJdK ZGdLdM ZHeFe&eG dS dNdG ZDdOdI ZEeFe'eD dS )S)ClientListenerPipewait    N   )util)AuthenticationErrorBufferTooShort)	reduction)WAIT_OBJECT_0WAIT_ABANDONED_0WAIT_TIMEOUTINFINITEwin32i    g      4@AF_INETAF_UNIXAF_PIPEc                 C   s   t  |  S Ntime	monotonic)timeout r   1/usr/lib/python3.10/multiprocessing/connection.py_init_timeout;      r   c                 C   s   t  | kS r   r   )tr   r   r   _check_timeout>   r   r   c                 C   st   	 | dkrdS | dkr#t jrdt  dtt S tjdt  dS | dkr6tjd	t ttf d
dS t	d)Nr   )	localhostr   r   z
 listener--z	listener-)prefixdirr   z\\.\pipe\pyc-%d-%d- zunrecognized family)
r   abstract_sockets_supportedosgetpidnext_mmap_countertempfilemktempget_temp_dir
ValueErrorfamilyr   r   r   arbitrary_addressE   s   r.   c                 C   sT   	 t jdkr| dkrtd|  t jdkr$| dkr&tt| s(td|  d S d S d S )Nr   r   zFamily %s is not recognized.r   )sysplatformr+   hasattrsocketr,   r   r   r   _validate_familyX   s   
r3   c                 C   sR   	 t | tkr	dS t | tu r| drdS t | tu s!t| r#dS td|  )Nr   z\\r   r   zaddress type of %r unrecognized)typetuplestr
startswithr   is_abstract_socket_namespacer+   )addressr   r   r   address_typed   s   r:   c                   @   s   e Zd ZdZd+ddZdd Zdd Zd	d
 Zdd Zdd Z	e
dd Ze
dd Ze
dd Zdd Zdd Zd,ddZdd Zd-ddZd.d d!Zd"d# Zd/d%d&Zd'd( Zd)d* ZdS )0_ConnectionBaseNTc                 C   s>   |  }|dk rtd|s|std|| _|| _|| _d S )Nr   zinvalid handlez6at least one of `readable` and `writable` must be True)	__index__r+   _handle	_readable	_writable)selfhandlereadablewritabler   r   r   __init__z   s   
z_ConnectionBase.__init__c                 C   s   | j d ur|   d S d S r   r=   _closer@   r   r   r   __del__   s   
z_ConnectionBase.__del__c                 C   s   | j d u r	tdd S )Nzhandle is closed)r=   OSErrorrG   r   r   r   _check_closed   s   
z_ConnectionBase._check_closedc                 C      | j stdd S )Nzconnection is write-only)r>   rI   rG   r   r   r   _check_readable      z_ConnectionBase._check_readablec                 C   rK   )Nzconnection is read-only)r?   rI   rG   r   r   r   _check_writable   rM   z_ConnectionBase._check_writablec                 C   s$   | j r
d| _td|   td)NFzbad message length)r?   r>   closerI   rG   r   r   r   _bad_message_length   s
   z#_ConnectionBase._bad_message_lengthc                 C   s   	 | j d u S r   r=   rG   r   r   r   closed   s   
z_ConnectionBase.closedc                 C      	 | j S r   )r>   rG   r   r   r   rB         z_ConnectionBase.readablec                 C   rS   r   )r?   rG   r   r   r   rC      rT   z_ConnectionBase.writablec                 C   s   	 |    | jS r   )rJ   r=   rG   r   r   r   fileno   s   z_ConnectionBase.filenoc                 C   s.   	 | j d urz
|   W d | _ d S d | _ w d S r   rE   rG   r   r   r   rO      s   

z_ConnectionBase.closer   c                 C   s   	 |    |   t|}|jdkrtt|}t|}|dk r$td||k r,td|d u r5|| }n|dk r=td|| |krGtd| ||||   d S )Nr   r   zoffset is negativezbuffer length < offsetzsize is negativezbuffer length < offset + size)rJ   rN   
memoryviewitemsizebyteslenr+   _send_bytes)r@   bufoffsetsizemnr   r   r   
send_bytes   s$   

z_ConnectionBase.send_bytesc                 C   s&   	 |    |   | t| d S r   )rJ   rN   rZ   _ForkingPicklerdumpsr@   objr   r   r   send   s   z_ConnectionBase.sendc                 C   sL   	 |    |   |d ur|dk rtd| |}|d u r"|   | S )Nr   znegative maxlength)rJ   rL   r+   _recv_bytesrP   getvalue)r@   	maxlengthr[   r   r   r   
recv_bytes   s   
z_ConnectionBase.recv_bytesc                 C   s   	 |    |   t|K}|j}|t| }|dk rtd||kr'td|  }| }||| k r;t|	 |
d |||| || |   |W  d    S 1 s[w   Y  d S )Nr   znegative offsetzoffset too large)rJ   rL   rV   rW   rY   r+   rf   tellr	   rg   seekreadinto)r@   r[   r\   r^   rW   bytesizeresultr]   r   r   r   recv_bytes_into   s(   


$z_ConnectionBase.recv_bytes_intoc                 C   s(   	 |    |   |  }t| S r   )rJ   rL   rf   ra   loads	getbuffer)r@   r[   r   r   r   recv   s
   z_ConnectionBase.recv        c                 C   s   	 |    |   | |S r   )rJ   rL   _pollr@   r   r   r   r   poll  s   
z_ConnectionBase.pollc                 C      | S r   r   rG   r   r   r   	__enter__     z_ConnectionBase.__enter__c                 C      |    d S r   rO   r@   exc_type	exc_valueexc_tbr   r   r   __exit__  r   z_ConnectionBase.__exit__)TT)r   Nr   )r   )rs   )__name__
__module____qualname__r=   rD   rH   rJ   rL   rN   rP   propertyrR   rB   rC   rU   rO   r`   re   ri   ro   rr   rv   rx   r   r   r   r   r   r;   w   s0    







r;   c                   @   sB   e Zd Z	 dZejfddZdd ZdddZd	d
 Z	dd Z
dS )PipeConnectionFc                 C      || j  d S r   rQ   )r@   Z_CloseHandler   r   r   rF        zPipeConnection._closec              	   C   sn   t j| j|dd\}}z#z|t jkrt |jgdt}W n   |   W |d\}}d S |d\}}w )NT
overlappedF)	_winapiZ	WriteFiler=   ERROR_IO_PENDINGWaitForMultipleObjectseventr   cancelGetOverlappedResult)r@   r[   overrwaitresZnwrittenr   r   r   rZ     s   

"zPipeConnection._send_bytesNc           	   
   C   s\  | j r
d| _ t S |d u rdnt|d}ztj| j|dd\}}z@z|tjkr1t|j	gdt
}W n   |   W |d\}}|dkrUt }||  |W S |tjkra| ||W S n2|d\}}|dkrt }||  |     Y W S |tjkr| ||     Y W S w W td ty } z	|jtjkrt d }~ww )NF   Tr   r   z.shouldn't get here; expected KeyboardInterrupt)_got_empty_messageioBytesIOminr   ReadFiler=   r   r   r   r   r   r   writerq   ZERROR_MORE_DATA_get_more_datarI   winerrorERROR_BROKEN_PIPEEOFErrorRuntimeError)	r@   maxsizeZbsizer   r   r   Znreadfer   r   r   rf   +  sR   





zPipeConnection._recv_bytesc                 C   s.   | j st| jd dkrdS tt| g|S )Nr   T)r   r   PeekNamedPiper=   boolr   ru   r   r   r   rt   K  s   zPipeConnection._pollc                 C   s   |  }t }|| t| jd }|d ur%t|| |kr%|   tj	| j|dd\}}|
d\}}||   |S )Nr   Tr   )rq   r   r   r   r   r   r=   rY   rP   r   r   )r@   r   r   r[   r   leftr   Zrbytesr   r   r   r   Q  s   
zPipeConnection._get_more_datar   )r   r   r   r   r   CloseHandlerF   rZ   rf   rt   r   r   r   r   r   r     s    
 r   c                   @   sz   e Zd Z	 erejfddZejZej	Z
nejfddZejZejZ
efddZe
fddZdd	 ZdddZdd Zd
S )
Connectionc                 C   r   r   rQ   r@   rF   r   r   r   rF   h  r   zConnection._closec                 C   r   r   rQ   r   r   r   r   rF   m  r   c                 C   s8   t |}	 || j|}||8 }|dkrd S ||d  }q)NTr   )rY   r=   )r@   r[   r   	remainingr_   r   r   r   _sendr  s   zConnection._sendc                 C   sf   t  }| j}|}|dkr1|||}t|}|dkr$||kr ttd|| ||8 }|dks|S )Nr   zgot end of file during message)r   r   r=   rY   r   rI   r   )r@   r]   readr[   rA   r   chunkr_   r   r   r   _recv{  s   


zConnection._recvc                 C   s   t |}|dkr%tdd}td|}| | | | | | d S td|}|dkr;| | | | d S | ||  d S )Ni!i!Qi @  )rY   structpackr   )r@   r[   r_   
pre_headerheaderr   r   r   rZ     s   


zConnection._send_bytesNc                 C   s^   |  d}td| \}|dkr |  d}td| \}|d ur*||kr*d S |  |S )N   r   r      r   )r   r   unpackrg   )r@   r   r[   r]   r   r   r   rf     s   


zConnection._recv_bytesc                 C   s   t | g|}t|S r   )r   r   )r@   r   rr   r   r   rt     s   zConnection._pollr   )r   r   r   r   _multiprocessingZclosesocketrF   re   _writerr   _readr$   rO   r   r   r   r   rZ   rf   rt   r   r   r   r   r   a  s    	

r   c                   @   sP   e Zd Z	 dddZdd Zdd Zed	d
 Zedd Zdd Z	dd Z
dS )r   Nr   c                 C   sp   |p	|rt |p	t}|pt|}t| |dkrt||| _nt|||| _|d ur3t|ts3t	d|| _
d S Nr   zauthkey should be a byte string)r:   default_familyr.   r3   PipeListener	_listenerSocketListener
isinstancerX   	TypeError_authkey)r@   r9   r-   backlogauthkeyr   r   r   rD     s   
zListener.__init__c                 C   s@   	 | j d u r
td| j  }| jrt|| j t|| j |S )Nzlistener is closed)r   rI   acceptr   deliver_challengeanswer_challenge)r@   cr   r   r   r     s   

zListener.acceptc                 C   s&   	 | j }|d urd | _ |  d S d S r   )r   rO   )r@   listenerr   r   r   rO     s   zListener.closec                 C      | j jS r   )r   _addressrG   r   r   r   r9        zListener.addressc                 C   r   r   )r   _last_acceptedrG   r   r   r   last_accepted  r   zListener.last_acceptedc                 C   rw   r   r   rG   r   r   r   rx     ry   zListener.__enter__c                 C   rz   r   r{   r|   r   r   r   r     r   zListener.__exit__)NNr   N)r   r   r   rD   r   rO   r   r9   r   rx   r   r   r   r   r   r     s    
	

r   c                 C   sj   	 |pt | }t| |dkrt| }nt| }|d ur%t|ts%td|d ur3t|| t|| |S r   )	r:   r3   
PipeClientSocketClientr   rX   r   r   r   )r9   r-   r   r   r   r   r   r     s   


r   Tc                 C   sr   	 | r#t  \}}|d |d t| }t| }||fS t \}}t|dd}t|dd}||fS )NTFrC   rB   )r2   
socketpairsetblockingr   detachr$   pipe)duplexs1s2c1c2fd1fd2r   r   r   r   	  s   

r   c              
   C   s   	 t d}| rtj}tjtjB }tt}}ntj}tj}dt}}t||tjB tj	B tj
tjB tjB d||tjtj}t||dtjtjtjtj}t|tjd d  tj|dd}|d\}	}
t|| d}t|| d}||fS )Nr   r   r   Tr   r   r   )r.   r   PIPE_ACCESS_DUPLEXGENERIC_READGENERIC_WRITEBUFSIZEZPIPE_ACCESS_INBOUNDCreateNamedPipeFILE_FLAG_OVERLAPPEDFILE_FLAG_FIRST_PIPE_INSTANCEPIPE_TYPE_MESSAGEPIPE_READMODE_MESSAGE	PIPE_WAITNMPWAIT_WAIT_FOREVERNULL
CreateFileOPEN_EXISTINGSetNamedPipeHandleStateConnectNamedPiper   r   )r   r9   ZopenmodeaccessZobsizeZibsizeZh1Zh2r   _r   r   r   r   r   r   r     s>   



	
c                   @   s(   e Zd Z	 d	ddZdd Zdd ZdS )
r   r   c                 C   s   t  tt || _z)tjdkr| jt jt jd | jd | j	| | j
| | j | _W n ty?   | j   w || _d | _|dkr]t|s]tj| tj|fdd| _d S d | _d S )Nposixr   Tr   r   argsexitpriority)r2   getattr_socketr$   name
setsockopt
SOL_SOCKETSO_REUSEADDRr   bindlistengetsocknamer   rI   rO   _familyr   r   r8   Finalizeunlink_unlink)r@   r9   r-   r   r   r   r   rD   L  s*   



zSocketListener.__init__c                 C   s&   | j  \}| _|d t| S NT)r   r   r   r   r   r   r@   sr   r   r   r   e  s   
zSocketListener.acceptc                 C   sN   z| j   W | j}|d urd | _|  d S d S | j}|d ur&d | _|  w w r   )r   rO   r   )r@   r   r   r   r   rO   j  s   
zSocketListener.closeN)r   )r   r   r   rD   r   rO   r   r   r   r   r   H  s
    
r   c                 C   s^   	 t | }ttt|}|d ||  t| W  d    S 1 s(w   Y  d S r  )r:   r2   r   r   connectr   r   )r9   r-   r  r   r   r   r   t  s   


$r   c                   @   s6   e Zd Z	 dddZdddZdd Zed	d
 ZdS )r   Nc                 C   sL   || _ | jddg| _d | _td| j  tj| tj| j| j fdd| _	d S )NT)firstz listener created with address=%rr   r   )
r   _new_handle_handle_queuer   r   	sub_debugr   r   _finalize_pipe_listenerrO   )r@   r9   r   r   r   r   rD     s   zPipeListener.__init__Fc              
   C   sH   t jt jB }|r|t jO }t | j|t jt jB t jB t j	t
t
t jt jS r   )r   r   r   r   r   r   r   r   r   ZPIPE_UNLIMITED_INSTANCESr   r   r   )r@   r  flagsr   r   r   r    s   

zPipeListener._new_handlec              
   C   s   | j |   | j d}z	tj|dd}W n ty3 } z|jtjkr& W Y d }~t|S d }~ww z%zt	|j
gdt}W n   |  t|  W |d\}}t|S |d\}}w )Nr   Tr   F)r  appendr  popr   r   rI   r   ZERROR_NO_DATAr   r   r   r   r   r   r   )r@   rA   r   r   resr   r   r   r   r   r     s0   


zPipeListener.acceptc                 C   s$   t d| | D ]}t| qd S )Nz closing listener with address=%r)r   r  r   r   )queuer9   rA   r   r   r   r	    s   z$PipeListener._finalize_pipe_listenerr   )F)r   r   r   rD   r  r   staticmethodr	  r   r   r   r   r     s    

r   c              
   C   s   	 t  }	 zt| d t| tjtjB dtjtjtjtj}W n  t	y@ } z|j
tjtjfvs5t|r6 W Y d }~nd }~ww nqt|tjd d  t|S )Nr     r   )r   r   ZWaitNamedPiper   r   r   r   r   r   rI   r   ZERROR_SEM_TIMEOUTZERROR_PIPE_BUSYr   r   r   r   )r9   r   hr   r   r   r   r     s4   

r      s   #CHALLENGE#s	   #WELCOME#s	   #FAILURE#c                 C   s   dd l }t|tstdt|tt}| 	t
|  |||d }| d}||kr7| 	t d S | 	t td)Nr    Authkey must be bytes, not {0!s}md5   zdigest received was wrong)hmacr   rX   r+   formatr4   r$   urandomMESSAGE_LENGTHr`   	CHALLENGEnewdigestri   WELCOMEFAILUREr   
connectionr   r  messager  responser   r   r   r     s   



r   c                 C   sx   dd l }t|tstdt|| d}|ttd  }|	||d
 }| | | d}|tkr:tdd S )Nr   r  r  r  zdigest sent was rejected)r  r   rX   r+   r  r4   ri   rY   r  r  r  r`   r  r   r  r   r   r   r     s   



r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )ConnectionWrapperc                 C   s6   || _ || _|| _dD ]}t||}t| || qd S )N)rU   rO   rv   ri   r`   )_conn_dumps_loadsr   setattr)r@   connrb   rp   attrrd   r   r   r   rD     s   
zConnectionWrapper.__init__c                 C   s   |  |}| j| d S r   )r%  r$  r`   )r@   rd   r  r   r   r   re   
  s   
zConnectionWrapper.sendc                 C   s   | j  }| |S r   )r$  ri   r&  r  r   r   r   rr     s   

zConnectionWrapper.recvN)r   r   r   rD   re   rr   r   r   r   r   r#    s    r#  c                 C   s   t | fd d d ddS )Nr   utf-8)	xmlrpclibrb   encode)rd   r   r   r   
_xml_dumps  s   r-  c                 C   s   t | d\\}}|S )Nr*  )r+  rp   decode)r  rd   methodr   r   r   
_xml_loads  s   r0  c                   @   s   e Zd Zdd ZdS )XmlListenerc                 C   s"   dd l ma t| }t|ttS Nr   )xmlrpc.clientclientr+  r   r   r#  r-  r0  rc   r   r   r   r     s   
zXmlListener.acceptN)r   r   r   r   r   r   r   r   r1    s    r1  c                  O   s"   dd l ma tt| i |ttS r2  )r3  r4  r+  r#  r   r-  r0  )r   kwdsr   r   r   	XmlClient  s   r6  c                 C   s   t | }g }|rZt|d|}|tkr	 |S t|  kr$tt| k r+n n|t8 }nt|  kr9tt| k rCn td|t8 }ntd|||  ||d d  }d}|s|S )NFzShould not get herer   r   )	listr   r   r   r   rY   r   r   r  )Zhandlesr   Lreadyr  r   r   r   _exhaustive_wait*  s$   
 

r:  c           
         s  	 |d u rt }n|dk rd}nt|d d }t| } i g }t  t }z| D ]}zt|d}W n ty@   || < Y q(w zt| dd\}}W n t	yj } zd |j
}}|tvr` W Y d }~nd }~ww |tjkr{|| ||j< q(|rt d d dkrz	|d\}	}W n t	y } z	|j
}W Y d }~nd }~ww |st|d	rd|_ | d}q(t |}W |D ]}|  q|D ]D}z	|d\}	}W n t	y } z|j
}|tvr W Y d }~nd }~ww |tjkr|j } | |dkrt|d	rd|_qnU|D ]}|  q|D ]G}z	|d\}	}W n t	yD } z|j
}|tvr: W Y d }~nd }~ww |tjkrc|j } | |dkrct|d	rcd|_qw  fd
d|D   fdd| D S )Nr   r  g      ?rU   T   )   r;  Fr   c                 3   s    | ]} | V  qd S r   r   ).0r  )waithandle_to_objr   r   	<genexpr>  s    zwait.<locals>.<genexpr>c                    s   g | ]}| v r|qS r   r   )r=  o)ready_objectsr   r   
<listcomp>  s    wait.<locals>.<listcomp>)r   intr7  setr   AttributeErrorr<   r   r   rI   r   _ready_errorsr   r  r   r/   Zgetwindowsversionr   r1   r   addr:  keysr   ZERROR_OPERATION_ABORTEDupdate)
object_listr   Zov_listZready_handlesr@  rU   r   r   r   r   r   )rA  r>  r   r   @  s   










r   PollSelectorc                 C   s   	 t  E}| D ]	}||tj q|d urt | }	 ||}|r1dd |D W  d    S |d urH|t  }|dk rH|W  d    S q1 sLw   Y  d S )NTc                 S   s   g | ]\}}|j qS r   )fileobj)r=  keyeventsr   r   r   rB    s    rC  r   )_WaitSelectorregister	selectors
EVENT_READr   r   select)rK  r   selectorrd   deadliner9  r   r   r   r     s$   
c                 C   sf   |   }t|tjtj}ddlm} ||}t|| j	| j
ffW  d    S 1 s,w   Y  d S )Nr   )resource_sharer)rU   r2   fromfdr   SOCK_STREAMr"   rW  Z	DupSocketrebuild_connectionrB   rC   )r(  rA   r  rW  dsr   r   r   reduce_connection  s   
$r\  c                 C   s   |   }t|  ||S r   r   r   )r[  rB   rC   sockr   r   r   rZ    s   rZ  c                 C   sB   | j rtjnd| jrtjndB }t|  |}t|| j | jffS r2  )	rB   r   ZFILE_GENERIC_READrC   ZFILE_GENERIC_WRITEr
   Z	DupHandlerU   rebuild_pipe_connection)r(  r   dhr   r   r   reduce_pipe_connection  s
   ra  c                 C      |   }t|||S r   )r   r   )r`  rB   rC   rA   r   r   r   r_       r_  c                 C   s    t |  }t|| j| jffS r   )r
   DupFdrU   rZ  rB   rC   )r(  dfr   r   r   r\    s   c                 C   rb  r   r]  )re  rB   rC   fdr   r   r   rZ    rc  )NN)Tr   )I__all__r   r$   r/   r2   r   r   r(   	itertoolsr   r"   r   r   r	   contextr
   ForkingPicklerra   r   r   r   r   r   ImportErrorr0   r   CONNECTION_TIMEOUTcountr'   r   familiesr1   r   r   r.   r3   r:   r;   r   r   objectr   r   r   r   r   r   r   r  r  r  r  r   r   r#  r-  r0  r1  r6  r:  r   ZERROR_NETNAME_DELETEDrG  r   rR  rL  rP  SelectSelectorr\  rZ  rQ  ra  r_  r   r   r   r   <module>   s   	
	



 PT
=

,,
8	P
