a
    ze{                     @   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y   ejdkr dZY n0 d	Zd
Ze ZdZdgZeedrdZedg7 Zejdkrd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rbG 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
dRd%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rnd@dA Z;ej<ej=hZ>dSdBdCZ?n,ddl@Z@ee@dDre@jAZBne@jCZBdTdEdCZ?ejdkrdFdG ZDdHdI ZEeFe'eD dJdK ZGdLdM ZHeFe&eG ndNdG ZDdOdI ZEeFe'eD dS )U)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   0/usr/lib/python3.9/multiprocessing/connection.py_init_timeout;   s    r   c                 C   s   t  | kS r   r   )tr   r   r   _check_timeout>   s    r   c                 C   sX   | dkrdS | dkr&t jdt dS | dkrLt jdt ttf ddS td	d S )
Nr   )	localhostr   r   z	listener-)prefixdirr   z\\.\pipe\pyc-%d-%d- zunrecognized family)	tempfilemktempr   get_temp_dirosgetpidnext_mmap_counter
ValueErrorfamilyr   r   r   arbitrary_addressE   s    r+   c                 C   sJ   t jdkr| dkrtd|  t jdkrF| dkrFtt| sFtd|  d S )Nr   r   zFamily %s is not recognized.r   )sysplatformr(   hasattrsocketr)   r   r   r   _validate_familyS   s
    
r0   c                 C   sT   t | tkrdS t | tu r*| dr*dS t | tu s@t| rDdS td|  d S )Nr   z\\r   r   zaddress type of %r unrecognized)typetuplestr
startswithr   is_abstract_socket_namespacer(   )addressr   r   r   address_type_   s    r7   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__u   s    z_ConnectionBase.__init__c                 C   s   | j d ur|   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:   OSErrorrD   r   r   r   _check_closed   s    
z_ConnectionBase._check_closedc                 C   s   | j stdd S )Nzconnection is write-only)r;   rF   rD   r   r   r   _check_readable   s    z_ConnectionBase._check_readablec                 C   s   | j stdd S )Nzconnection is read-only)r<   rF   rD   r   r   r   _check_writable   s    z_ConnectionBase._check_writablec                 C   s"   | j rd| _n|   tdd S )NFzbad message length)r<   r;   closerF   rD   r   r   r   _bad_message_length   s    z#_ConnectionBase._bad_message_lengthc                 C   s
   | j d u S r   r:   rD   r   r   r   closed   s    z_ConnectionBase.closedc                 C   s   | j S r   )r;   rD   r   r   r   r?      s    z_ConnectionBase.readablec                 C   s   | j S r   )r<   rD   r   r   r   r@      s    z_ConnectionBase.writablec                 C   s   |    | jS r   )rG   r:   rD   r   r   r   fileno   s    z_ConnectionBase.filenoc                 C   s*   | j d ur&z|   W d | _ nd | _ 0 d S r   rB   rD   r   r   r   rJ      s    

z_ConnectionBase.closer   c                 C   s   |    |   t|}|jdkr.tt|}t|}|dk rFtd||k rVtd|d u rh|| }n&|dk rztdn|| |krtd| ||||   d S )Nr   r   zoffset is negativezbuffer length < offsetzsize is negativezbuffer length < offset + size)rG   rI   
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   )rG   rI   rS   _ForkingPicklerdumpsr=   objr   r   r   send   s    z_ConnectionBase.sendc                 C   sJ   |    |   |d ur(|dk r(td| |}|d u rB|   | S )Nr   znegative maxlength)rG   rH   r(   _recv_bytesrK   getvalue)r=   	maxlengthrT   r   r   r   
recv_bytes   s    
z_ConnectionBase.recv_bytesc                 C   s   |    |   t|}|j}|t| }|dk r>tdn||krNtd|  }| }||| k rvt|	 |
d |||| || |   |W  d    S 1 s0    Y  d S )Nr   znegative offsetzoffset too large)rG   rH   rO   rP   rR   r(   r_   tellr	   r`   seekreadinto)r=   rT   rU   rW   rP   bytesizeresultrV   r   r   r   recv_bytes_into   s$    



z_ConnectionBase.recv_bytes_intoc                 C   s&   |    |   |  }t| S r   )rG   rH   r_   rZ   loads	getbuffer)r=   rT   r   r   r   recv   s    z_ConnectionBase.recv        c                 C   s   |    |   | |S r   )rG   rH   _pollr=   r   r   r   r   poll   s    z_ConnectionBase.pollc                 C   s   | S r   r   rD   r   r   r   	__enter__  s    z_ConnectionBase.__enter__c                 C   s   |    d S r   rJ   r=   exc_type	exc_valueexc_tbr   r   r   __exit__  s    z_ConnectionBase.__exit__)TT)r   N)N)r   )rl   )__name__
__module____qualname__r:   rA   rE   rG   rH   rI   rK   propertyrM   r?   r@   rN   rJ   rY   r^   rb   rh   rk   ro   rp   rv   r   r   r   r   r8   r   s.   







r8   c                   @   s@   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   s   || j  d S r   rL   )r=   Z_CloseHandler   r   r   rC     s    zPipeConnection._closec              	   C   sv   t j| j|dd\}}zJz |t jkr6t |jgdt}W n   |   Y n0 W |d\}}n|d\}}0 d S )NT
overlappedF)	_winapiZ	WriteFiler:   ERROR_IO_PENDINGWaitForMultipleObjectseventr   cancelGetOverlappedResult)r=   rT   overrwaitresZnwrittenr   r   r   rS     s    


 zPipeConnection._send_bytesNc           	   
   C   s  | j rd| _ t S |d u r dnt|d}z
tj| j|dd\}}zz |tjkrdt|j	gdt
}W n   |   Y n0 W |d\}}|dkrt }||  |W S |tjkr| ||W S nh|d\}}|dkrt }||  |     Y W S |tjkr2| ||     Y W S 0 W n< tyr } z"|jtjkr\tn W Y d }~n
d }~0 0 tdd S )NF   Tr|   r   z.shouldn't get here; expected KeyboardInterrupt)_got_empty_messageioBytesIOminr~   ReadFiler:   r   r   r   r   r   r   writerj   ZERROR_MORE_DATA_get_more_datarF   winerrorERROR_BROKEN_PIPEEOFErrorRuntimeError)	r=   maxsizeZbsizer   r   r   Znreadfer   r   r   r_   &  sH    






 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   rn   r   r   r   rm   F  s
    zPipeConnection._pollc                 C   s   |  }t }|| t| jd }|d urJt|| |krJ|   tj	| j|dd\}}|
d\}}||   |S )Nr   Tr|   )rj   r   r   r   r~   r   r:   rR   rK   r   r   )r=   r   r   rT   r   leftr   Zrbytesr   r   r   r   L  s    
zPipeConnection._get_more_data)N)rw   rx   ry   r   r~   CloseHandlerC   rS   r_   rm   r   r   r   r   r   r{     s   
 r{   c                   @   sx   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   s   || j  d S r   rL   r=   rC   r   r   r   rC   c  s    zConnection._closec                 C   s   || j  d S r   rL   r   r   r   r   rC   h  s    c                 C   s8   t |}|| j|}||8 }|dkr&q4||d  }qd S Nr   )rR   r:   )r=   rT   r   	remainingrX   r   r   r   _sendm  s    zConnection._sendc                 C   sb   t  }| j}|}|dkr^|||}t|}|dkrJ||krBtntd|| ||8 }q|S )Nr   zgot end of file during message)r   r   r:   rR   r   rF   r   )r=   rV   readrT   r>   r   chunkrX   r   r   r   _recvv  s    


zConnection._recvc                 C   s   t |}|dkrHtdd}td|}| | | | | | n8td|}|dkrr| | | | n| ||  d S )Ni!i!Qi @  )rR   structpackr   )r=   rT   rX   
pre_headerheaderr   r   r   rS     s    


zConnection._send_bytesNc                 C   s^   |  d}td| \}|dkr@|  d}td| \}|d urT||krTd S |  |S )N   r   r      r   )r   r   unpackr`   )r=   r   rT   rV   r   r   r   r_     s    

zConnection._recv_bytesc                 C   s   t | g|}t|S r   )r   r   )r=   r   rr   r   r   rm     s    zConnection._poll)N)rw   rx   ry   r~   _multiprocessingZclosesocketrC   r^   _writerk   _readr$   rJ   r   r   r   r   rS   r_   rm   r   r   r   r   r   \  s   	

r   c                   @   sN   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rft|tsft	d|| _
d S Nr   zauthkey should be a byte string)r7   default_familyr+   r0   PipeListener	_listenerSocketListener
isinstancerQ   	TypeError_authkey)r=   r6   r*   backlogauthkeyr   r   r   rA     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   rF   acceptr   deliver_challengeanswer_challenge)r=   cr   r   r   r     s    

zListener.acceptc                 C   s    | j }|d urd | _ |  d S r   )r   rJ   )r=   listenerr   r   r   rJ     s    zListener.closec                 C   s   | j jS r   )r   _addressrD   r   r   r   r6     s    zListener.addressc                 C   s   | j jS r   )r   _last_acceptedrD   r   r   r   last_accepted  s    zListener.last_acceptedc                 C   s   | S r   r   rD   r   r   r   rp     s    zListener.__enter__c                 C   s   |    d S r   rq   rr   r   r   r   rv     s    zListener.__exit__)NNr   N)rw   rx   ry   rA   r   rJ   rz   r6   r   rp   rv   r   r   r   r   r     s   
	

r   c                 C   sh   |p
t | }t| |dkr&t| }nt| }|d urHt|tsHtd|d urdt|| t|| |S r   )	r7   r0   
PipeClientSocketClientr   rQ   r   r   r   )r6   r*   r   r   r   r   r   r     s    


r   Tc                 C   sj   | r>t  \}}|d |d t| }t| }n$t \}}t|dd}t|dd}||fS )NTFr@   r?   )r/   
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   r6   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 || _zRtjdkr2| jt jt jd | jd | j	| | j
| | j | _W n ty   | j   Y n0 || _d | _|dkrt|stj| tj|fdd| _nd | _d S )Nposixr   Tr   r   argsexitpriority)r/   getattr_socketr$   name
setsockopt
SOL_SOCKETSO_REUSEADDRr   bindlistengetsocknamer   rF   rJ   _familyr   r   r5   Finalizeunlink_unlink)r=   r6   r*   r   r   r   r   rA   G  s(    



zSocketListener.__init__c                 C   s&   | j  \}| _|d t| S NT)r   r   r   r   r   r   r=   sr   r   r   r   `  s    
zSocketListener.acceptc                 C   sJ   z(| j   W | j}|d urFd | _|  n| j}|d urDd | _|  0 d S r   )r   rJ   r   )r=   r   r   r   r   rJ   e  s    zSocketListener.closeN)r   )rw   rx   ry   rA   r   rJ   r   r   r   r   r   C  s   
r   c                 C   s\   t | }ttt|0}|d ||  t| W  d    S 1 sN0    Y  d S r   )r7   r/   r   r   connectr   r   )r6   r*   r   r   r   r   r   o  s
    

r   c                   @   s4   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_listenerrJ   )r=   r6   r   r   r   r   rA     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 n2 ty` } z|jtjkrL W Y d }~nfd }~0 0 zJzt	|j
gdt}W n    |  t|  Y n0 W |d\}}n|d\}}0 t|S )Nr   Tr|   F)r   appendr   popr~   r   rF   r   ZERROR_NO_DATAr   r   r   r   r   r   r{   )r=   r>   r   r   resr   r   r   r   r   r     s(    


zPipeListener.acceptc                 C   s$   t d| | D ]}t| qd S )Nz closing listener with address=%r)r   r   r~   r   )queuer6   r>   r   r   r   r     s    z$PipeListener._finalize_pipe_listener)N)F)rw   rx   ry   rA   r   r   staticmethodr   r   r   r   r   r     s
   

r   c              
   C   s   t  }z6t| d t| tjtjB dtjtjtjtj}W q t	y| } z(|j
tjtjfvsft|rh W Y d }~qd }~0 0 qq t|tjd d  t|S )N  r   )r   r~   ZWaitNamedPiper   r   r   r   r   r   rF   r   ZERROR_SEM_TIMEOUTZERROR_PIPE_BUSYr   r   r   r{   )r6   r   hr   r   r   r   r     s*    

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rl| 	t n| 	t tdd S )Nr    Authkey must be bytes, not {0!s}md5   zdigest received was wrong)hmacr   rQ   r(   formatr1   r$   urandomMESSAGE_LENGTHrY   	CHALLENGEnewdigestrb   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rttdd S )Nr   r  r  r  zdigest sent was rejected)r	  r   rQ   r(   r
  r1   rb   rR   r  r  r  rY   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)rN   rJ   ro   rb   rY   )_conn_dumps_loadsr   setattr)r=   connr[   ri   attrr]   r   r   r   rA     s    
zConnectionWrapper.__init__c                 C   s   |  |}| j| d S r   )r  r  rY   )r=   r]   r   r   r   r   r^     s    
zConnectionWrapper.sendc                 C   s   | j  }| |S r   )r  rb   r  r   r   r   r   rk     s    
zConnectionWrapper.recvN)rw   rx   ry   rA   r^   rk   r   r   r   r   r    s   r  c                 C   s   t | fd d d ddS )Nr   utf-8)	xmlrpclibr[   encode)r]   r   r   r   
_xml_dumps  s    r   c                 C   s   t | d\\}}|S )Nr  )r  ri   decode)r   r]   methodr   r   r   
_xml_loads  s    r#  c                   @   s   e Zd Zdd ZdS )XmlListenerc                 C   s"   dd l ma t| }t|ttS r   )xmlrpc.clientclientr  r   r   r  r   r#  r\   r   r   r   r     s    
zXmlListener.acceptN)rw   rx   ry   r   r   r   r   r   r$    s   r$  c                  O   s"   dd l ma tt| i |ttS r   )r%  r&  r  r  r   r   r#  )r   kwdsr   r   r   	XmlClient  s    r(  c                 C   s   t | }g }|rt|d|}|tkr*qn\t|  krFtt| k rTn n
|t8 }n2t|  krptt| k r~n n
|t8 }ntd|||  ||d d  }d}q|S )NFzShould not get herer   r   )	listr~   r   r   r   rR   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 qP0 zt| dd\}}W n: t	y } z"d |j
 }}|tvr W Y d }~n
d }~0 0 |tjkr|| ||j< qP|rlt d d dkrlz|d\}	}W n, t	yR } z|j
}W Y d }~n
d }~0 0 |slt|d	rld|_ | d}qPt |}W |D ]}|  q|D ]}z|d\}	}W n8 t	y } z|j
}|tvrނ W Y d }~n
d }~0 0 |tjkr|j } | |dkrt|d	rd|_qn|D ]}|  q:|D ]}z|d\}	}W n8 t	y } z|j
}|tvr W Y d }~n
d }~0 0 |tjkrN|j } | |dkrNt|d	rNd|_qN0  fd
d|D   fdd| D S )Nr   r  g      ?rN   T   )   r-  Fr   c                 3   s   | ]} | V  qd S r   r   ).0r  )waithandle_to_objr   r   	<genexpr>      zwait.<locals>.<genexpr>c                    s   g | ]}| v r|qS r   r   )r/  o)ready_objectsr   r   
<listcomp>  r2  wait.<locals>.<listcomp>)r   intr)  setr   AttributeErrorr9   r~   r   rF   r   _ready_errorsr   r   r   r,   getwindowsversionr   r.   r   addr,  keysr   ZERROR_OPERATION_ABORTEDupdate)
object_listr   Zov_listZready_handlesr3  rN   r   r   r   r   r   )r4  r0  r   r   ;  s    











r   PollSelectorc                 C   s   t  }| D ]}||tj q|d ur4t | }||}|r^dd |D W  d    S |d ur4|t  }|dk r4|W  d    S q4W d    n1 s0    Y  d S )Nc                 S   s   g | ]\}}|j qS r   )fileobj)r/  keyeventsr   r   r   r5    r2  r6  r   )_WaitSelectorregister	selectors
EVENT_READr   r   select)r?  r   selectorr]   deadliner+  r   r   r   r     s    
c                 C   sf   |   }t|tjtj8}ddlm} ||}t|| j	| j
ffW  d    S 1 sX0    Y  d S )Nr   )resource_sharer)rN   r/   fromfdr   SOCK_STREAMr    rK  Z	DupSocketrebuild_connectionr?   r@   )r  r>   r   rK  dsr   r   r   reduce_connection  s
    
rP  c                 C   s   |   }t|  ||S r   r   r   )rO  r?   r@   sockr   r   r   rN    s    rN  c                 C   sB   | j rtjnd| jrtjndB }t|  |}t|| j | jffS r   )	r?   r~   ZFILE_GENERIC_READr@   ZFILE_GENERIC_WRITEr
   Z	DupHandlerN   rebuild_pipe_connection)r  r   dhr   r   r   reduce_pipe_connection  s
    rU  c                 C   s   |   }t|||S r   )r   r{   )rT  r?   r@   r>   r   r   r   rS    s    rS  c                 C   s    t |  }t|| j| jffS r   )r
   DupFdrN   rN  r?   r@   )r  dfr   r   r   rP    s    c                 C   s   |   }t|||S r   rQ  )rW  r?   r@   fdr   r   r   rN    s    )NN)T)T)N)N)I__all__r   r$   r,   r/   r   r   r!   	itertoolsr   r    r   r   r	   contextr
   ForkingPicklerrZ   r~   r   r   r   r   ImportErrorr-   r   CONNECTION_TIMEOUTcountr'   r   familiesr.   r   r   r+   r0   r7   r8   r{   r   objectr   r   r   r   r   r   r   r  r  r  r  r   r   r  r   r#  r$  r(  r,  r   ZERROR_NETNAME_DELETEDr:  r   rF  r@  rD  SelectSelectorrP  rN  rE  rU  rS  r   r   r   r   <module>
   s   




 PT=

,,8	P
