o
    svXj÷  ã                   @   sr  d dl m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 ddlmZmZ ddlmZ ddlmZmZ dd	lmZ dd
lmZ zddlmZ W n eyq   ejdkrm‚ dZY nw ejdkrƒejZejZejZejZg d¢Ze edƒZ!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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e-ƒZ.G d d!„ d!e-ƒZ/eráG d"d#„ d#e/ƒZ0G d$d%„ d%e/ƒZ1G d&d'„ d'e-ƒZ2d^d(d)„Z3d*d+„ Z4ejdk�rd_d.d/„Z5nd_d0d/„Z5G d1d2„ d2e-ƒZ6d3d4„ Z7ejdk�r/G d5d6„ d6e-ƒZ8ej9ej:ffd7d8„Z;d9Z<d:Z=d;Z>d<Z?d=d>„ Z@d?d@„ ZAG dAdB„ dBe-ƒZBdCdD„ ZCdEdF„ ZDG dGdH„ dHe2ƒZEdIdJ„ ZFejdk�rqdKdL„ ZGejHejIhZJd`dMdN„ZKne edOƒ�r|dPdQ„ ZLndRdQ„ ZLd`dSdN„ZKejdk�r©dTdU„ ZMdVdW„ ZNe Oe1eM¡ dXdY„ ZPdZd[„ ZQe Oe0eP¡ dS d\dU„ ZMd]dW„ ZNe Oe1eM¡ dS )aé    )Úabsolute_importNé   )Ú	reduction)Úutil)ÚAuthenticationErrorÚBufferTooShort)Ú	_billiard)ÚsetblockingÚsend_offset©Ú	monotonic)ÚForkingPickler)Ú_winapiÚwin32)ÚClientÚListenerÚPipeÚwaitÚpypy_version_infoi    g      4@ÚAF_INETÚAF_UNIXÚAF_PIPEc                 C   s
   t ƒ |  S ©Nr   )Útimeout© r   úP/var/www/html/myproject/venv/lib/python3.10/site-packages/billiard/connection.pyÚ_init_timeoutH   ó   
r   c                 C   s
   t ƒ | kS r   r   )Útr   r   r   Ú_check_timeoutL   r   r   c                 C   sT   | dkrdS | dkrt jdt ¡ d�S | dkr&t jdt ¡ ttƒf dd�S td	ƒ‚)
z?
    Return an arbitrary free address for the given family
    r   )Ú	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_addressT   s   ÿÿr.   c                 C   sR   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 )zD
    Checks if the family is valid for the current environment.
    r   r   zFamily %s is not recognized.r   N)ÚsysÚplatformr+   ÚhasattrÚsocketr,   r   r   r   Ú_validate_familyc   s   
ýr3   c                 C   sF   t | ƒtkrdS t | ƒtu r|  d¡rdS t | ƒtu rdS td|  ƒ‚)z]
    Return the types of the address

    This can be 'AF_INET', 'AF_UNIX', or 'AF_PIPE'
    r   z\\r   r   zaddress type of %r unrecognized)ÚtypeÚtupleÚstrÚ
startswithr+   )Úaddressr   r   r   Úaddress_typep   s   r9   c                   @   ó   e Zd Zdd„ ZdS )Ú_SocketContainerc                 C   s
   || _ d S r   ©Úsock)Úselfr=   r   r   r   Ú__init__†   r   z_SocketContainer.__init__N)Ú__name__Ú
__module__Ú__qualname__r?   r   r   r   r   r;   „   ó    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d0dd„Zdd„ Zd1dd„Zd2d d!„Zd"d#„ Zd3d%d&„Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ ZdS )4Ú_ConnectionBaseNTc                 C   sZ   t |tƒr|j| _|j ¡ }| ¡ }|dk rtdƒ‚|s"|s"tdƒ‚|| _|| _|| _	d S )Nr   zinvalid handlez6at least one of `readable` and `writable` must be True)
Ú
isinstancer;   r=   Ú_socketÚfilenoÚ	__index__r+   Ú_handleÚ	_readableÚ	_writable)r>   ÚhandleÚreadableÚwritabler   r   r   r?   �   s   

ÿ
z_ConnectionBase.__init__c                 C   s   | j d ur|  ¡  d S d S r   ©rI   Ú_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)rI   ÚOSErrorrQ   r   r   r   Ú_check_closed¡   s   
ÿz_ConnectionBase._check_closedc                 C   ó   | j stdƒ‚d S )Nzconnection is write-only)rJ   rS   rQ   r   r   r   Ú_check_readable¥   ó   ÿz_ConnectionBase._check_readablec                 C   rU   )Nzconnection is read-only)rK   rS   rQ   r   r   r   Ú_check_writable©   rW   z_ConnectionBase._check_writablec                 C   s$   | j r
d| _tdƒ‚|  ¡  tdƒ‚)NFzbad message length)rK   rJ   ÚcloserS   rQ   r   r   r   Ú_bad_message_length­   s
   ÿz#_ConnectionBase._bad_message_lengthc                 C   s
   | j du S )z True if the connection is closedN©rI   rQ   r   r   r   Úclosed´   s   
z_ConnectionBase.closedc                 C   ó   | j S )z"True if the connection is readable)rJ   rQ   r   r   r   rM   ¹   ó   z_ConnectionBase.readablec                 C   r]   )z"True if the connection is writable)rK   rQ   r   r   r   rN   ¾   r^   z_ConnectionBase.writablec                 C   s   |   ¡  | jS )z+File descriptor or handle of the connection)rT   rI   rQ   r   r   r   rG   Ã   s   z_ConnectionBase.filenoc                 C   s,   | j durz
|  ¡  W d| _ dS d| _ w dS )zClose the connectionNrO   rQ   r   r   r   rY   È   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 r4|| }n|dk r<tdƒ‚|| |krFtdƒ‚|  |||| … ¡ dS )z,Send the bytes data from a bytes-like objectr   r   zoffset is negativezbuffer length < offsetNzsize is negativezbuffer length < offset + size)rT   rX   Ú
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 )zSend a (picklable) objectN)rT   rX   rc   r   Údumps©r>   Úobjr   r   r   Úsendå   s   z_ConnectionBase.sendc                 C   sJ   |   ¡  |  ¡  |dur|dk rtdƒ‚|  |¡}|du r!|  ¡  | ¡ S )z7
        Receive bytes data as a bytes object.
        Nr   znegative maxlength)rT   rV   r+   Ú_recv_bytesrZ   Úgetvalue)r>   Ú	maxlengthrd   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 sZw   Y  dS )zq
        Receive bytes data into a writeable bytes-like object.
        Return the number of bytes read.
        r   znegative offsetzoffset too largeN)rT   rV   r_   r`   rb   r+   rn   Útellr   ro   ÚseekÚreadinto)r>   rd   re   rg   r`   ÚbytesizeÚresultrf   r   r   r   Úrecv_bytes_intoø   s&   

ÿ$ïz_ConnectionBase.recv_bytes_intoc                 C   s"   |   ¡  |  ¡  |  ¡ }t |¡S )zReceive a (picklable) object)rT   rV   rn   r   Úloadbuf)r>   rd   r   r   r   Úrecv  s   
z_ConnectionBase.recvç        c                 C   s   |   ¡  |  ¡  |  |¡S )z/Whether there is any input available to be read)rT   rV   Ú_poll©r>   r   r   r   r   Úpoll  s   
z_ConnectionBase.pollc                 C   ó   | S r   r   rQ   r   r   r   Ú	__enter__  ó   z_ConnectionBase.__enter__c                 C   ó   |   ¡  d S r   ©rY   ©r>   Úexc_typeÚ	exc_valueÚexc_tbr   r   r   Ú__exit__"  ó   z_ConnectionBase.__exit__c                 C   s   t |  ¡ ||ƒS r   )r
   rG   )r>   rd   re   r   r   r   r
   %  ó   z_ConnectionBase.send_offsetc                 C   s   t |  ¡ |ƒ d S r   )r	   rG   )r>   Úblockingr   r   r   r	   (  s   z_ConnectionBase.setblocking)TT)r   Nr   )r   )rz   )r@   rA   rB   rI   r?   rR   rT   rV   rX   rZ   Úpropertyr\   rM   rN   rG   rY   ri   rm   rq   rw   ry   r}   r   r‡   r
   r	   r   r   r   r   rD   Š   s4    







rD   c                   @   sD   e Zd 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 )ÚPipeConnectionzª
        Connection class based on a Windows named pipe.
        Overlapped I/O is used, so the handles must have been created
        with FILE_FLAG_OVERLAPPED.
        Fc                 C   ó   || j ƒ d S r   r[   )r>   Ú_CloseHandler   r   r   rP   6  ó   zPipeConnection._closec              	   C   s˜   t j| j|dd�\}}z(z|t jkr!t  |jgdt¡}|tks!J ‚W n   | ¡  ‚ W | 	d¡\}}n| 	d¡\}}w |dksBJ ‚|t
|ƒksJJ ‚d S )NT©Ú
overlappedFr   )r   Ú	WriteFilerI   ÚERROR_IO_PENDINGÚWaitForMultipleObjectsÚeventÚINFINITEÚWAIT_OBJECT_0ÚcancelÚGetOverlappedResultrb   )r>   rd   ÚovÚerrÚwaitresÚnwrittenr   r   r   rc   9  s   

þ€€ zPipeConnection._send_bytesNc           	   
   C   sh  | j r
d| _ t ¡ S |d u rdnt|dƒ}z‰tj| j|dd�\}}zFz|tjkr7t |j	gdt
¡}|tks7J ‚W n   | ¡  ‚ W | d¡\}}|dkr[t ¡ }| | ¡ ¡ |W S |tjkrg|  ||¡W S n2| d¡\}}|dkr‡t ¡ }| | ¡ ¡ |     Y W S |tjkr™|  ||¡     Y W S w W tdƒ‚ ty³ } z	|jtjkr®t‚‚ d }~ww )NFé€   Tr�   r   z.shouldn't get here; expected KeyboardInterrupt)Ú_got_empty_messageÚioÚBytesIOÚminr   ÚReadFilerI   r“   r”   r•   r–   r—   r˜   r™   ÚwriteÚ	getbufferÚERROR_MORE_DATAÚ_get_more_datarS   ÚwinerrorÚERROR_BROKEN_PIPEÚEOFErrorÚRuntimeError)	r>   ÚmaxsizeÚbsizerš   r›   rœ   ÚnreadÚfÚer   r   r   rn   I  sX   
ÿ

ÿ€€
ÿû
ÿÿû€üzPipeConnection._recv_bytesc                 C   s.   | j st | j¡d dkrdS tt| g|ƒƒS )Nr   T)rŸ   r   ÚPeekNamedPiperI   Úboolr   r|   r   r   r   r{   k  s   zPipeConnection._pollc                 C   s¤   |  ¡ }t ¡ }| |¡ t | j¡d }|dksJ ‚|d ur+t|ƒ| |kr+|  ¡  tj	| j|dd�\}}| 
d¡\}}|dksCJ ‚||ksIJ ‚| |  ¡ ¡ |S )Nr   r   Tr�   )r¥   r    r¡   r¤   r   r±   rI   rb   rZ   r£   r™   )r>   rš   r¬   rd   r¯   Úleftr›   Úrbytesr   r   r   r§   q  s   
zPipeConnection._get_more_datar   )r@   rA   rB   Ú__doc__rŸ   r   ÚCloseHandlerP   rc   rn   r{   r§   r   r   r   r   rŒ   .  s    
"rŒ   c                   @   s€   e Zd 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efd	d
„Zddd„Zdd„ ZdS )Ú
Connectionzo
    Connection class based on an arbitrary file descriptor (Unix only), or
    a socket handle (Windows).
    c                 C   r�   r   r[   ©r>   rP   r   r   r   rP   ˆ  r�   zConnection._closec                 C   r�   r   r[   r¸   r   r   r   rP   �  r�   c              
   C   s~   t |ƒ}	 z|| j|ƒ}W n  tttjfy- } zt|dd ƒtjkr#‚ W Y d }~nd }~ww ||8 }|dkr8d S ||d … }q)NTÚerrnor   )	rb   rI   rS   ÚIOErrorr2   ÚerrorÚgetattrr¹   ÚEINTR)r>   rd   r¤   Ú	remainingrh   Úexcr   r   r   Ú_send’  s   ÿ€ÿözConnection._sendc           	   
   C   s¬   t  ¡ }| j}|}|dkrTz|||ƒ}W n  tttjfy4 } zt|dd ƒtj	kr*‚ W Y d }~n d }~ww t
|ƒ}|dkrG||krCt‚tdƒ‚| |¡ ||8 }|dks|S )Nr   r¹   zgot end of file during message)r    r¡   rI   rS   rº   r2   r»   r¼   r¹   r½   rb   rª   r¤   )	r>   rf   Úreadrd   rL   r¾   Úchunkr¿   rh   r   r   r   Ú_recv   s*   ÿ€ÿ
òzConnection._recvc                 C   sX   t |ƒ}t d|¡}|dkr|  |¡ |  |¡ d S t||ƒr#| ¡ }|  || ¡ d S )Nú!ii @  )rb   ÚstructÚpackrÀ   rE   Útobytes)r>   rd   r_   rh   Úheaderr   r   r   rc   µ  s   

zConnection._send_bytesNc                 C   s:   |   d¡}t d| ¡ ¡\}|d ur||krd S |   |¡S )Né   rÄ   )rÃ   rÅ   Úunpackro   )r>   r¬   rd   rf   r   r   r   rn   Ç  s
   

zConnection._recv_bytesc                 C   s   t | g|ƒ}t|ƒS r   )r   r²   )r>   r   Úrr   r   r   r{   Î  s   zConnection._pollr   )r@   rA   rB   rµ   r   r   ÚclosesocketrP   rm   Ú_writery   Ú_readr'   rY   r¤   rÁ   rÀ   rÃ   r_   rc   rn   r{   r   r   r   r   r·   �  s    
r·   c                   @   sR   e Zd 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   z•
    Returns a listener object.

    This is a wrapper for a bound socket which is 'listening' for
    connections, or for a Windows named pipe.
    Nr   c                 C   sp   |p	|ot |ƒp	t}|pt|ƒ}t|ƒ |dkrt||ƒ| _nt|||ƒ| _|d ur3t|tƒs3t	dƒ‚|| _
d S )Nr   úauthkey should be a byte string)r9   Údefault_familyr.   r3   ÚPipeListenerÚ	_listenerÚSocketListenerrE   ra   Ú	TypeErrorÚ_authkey)r>   r8   r-   ÚbacklogÚauthkeyr   r   r   r?   Þ  s   
ÿÿ
zListener.__init__c                 C   s>   | j du r	tdƒ‚| j  ¡ }| jrt|| jƒ t|| jƒ |S )zz
        Accept a connection on the bound socket or named pipe of `self`.

        Returns a `Connection` object.
        Nzlistener is closed)rÒ   rS   Ú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 )zA
        Close the bound socket or named pipe of `self`.
        N)rÒ   rY   )r>   Úlistenerr   r   r   rY   ü  s
   þzListener.closec                 C   ó   | j jS r   )rÒ   Ú_addressrQ   r   r   r   Ú<lambda>  ó    zListener.<lambda>c                 C   rÝ   r   )rÒ   Ú_last_acceptedrQ   r   r   r   rß     rà   c                 C   r~   r   r   rQ   r   r   r   r     r€   zListener.__enter__c                 C   r�   r   r‚   rƒ   r   r   r   r‡     rˆ   zListener.__exit__)NNr   N)r@   rA   rB   rµ   r?   rØ   rY   r‹   r8   Úlast_acceptedr   r‡   r   r   r   r   r   ×  s    
	r   c                 C   sh   |pt | ƒ}t|ƒ |dkrt| ƒ}nt| ƒ}|dur$t|tƒs$tdƒ‚|dur2t||ƒ t||ƒ |S )z=
    Returns a connection to the address of a `Listener`
    r   NrÏ   )	r9   r3   Ú
PipeClientÚSocketClientrE   ra   rÔ   rÚ   rÙ   )r8   r-   r×   rÛ   r   r   r   r     s   


r   c                 C   s   t | dƒr	|  ¡ S t| ƒS )NÚdetach)r1   rå   r;   r<   r   r   r   rå   $  s   
rå   TFc           	      C   s�   | r$t  ¡ \}}| | ¡ | | ¡ tt|ƒƒ}tt|ƒƒ}||fS t ¡ \}}|r1t|dƒ |r8t|dƒ t|dd�}t|dd�}||fS )úL
        Returns pair of connection objects at either end of a pipe
        r   F©rN   ©rM   )r2   Ú
socketpairr	   r·   rå   r'   Úpipe)	ÚduplexÚ	rnonblockÚ	wnonblockÚs1Ús2Úc1Úc2Úfd1Úfd2r   r   r   r   .  s   
ø

r   c              
   C   s  |rJ dƒ‚|rJ dƒ‚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¡\}}|dkssJ ‚t|| d	�}t|	| d
�}||fS )ræ   z"rnonblock not supported on windowsz"wnonblock not supported on windowsr   r   r   NTr�   rç   rè   )r.   r   ÚPIPE_ACCESS_DUPLEXÚGENERIC_READÚGENERIC_WRITEÚBUFSIZEÚ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ë   rì   rí   r8   ÚopenmodeÚaccessÚobsizeÚibsizeÚh1Úh2r‘   Ú_r›   rð   rñ   r   r   r   r   E  sB   

ÿ
ÿ
ù	þ
ÿc                   @   s*   e Zd ZdZd
dd„Zdd„ Zdd„ Zd	S )rÓ   zO
    Representation of a socket which is bound to an address and listening
    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rXtj| tj|fdd�| _d S d | _d S )NÚposixr   Tr   r   ©ÚargsÚexitpriority)r2   r¼   rF   r'   ÚnameÚ
setsockoptÚ
SOL_SOCKETÚSO_REUSEADDRr	   ÚbindÚlistenÚgetsocknamerÞ   rS   rY   Ú_familyrá   r   ÚFinalizeÚunlinkÚ_unlink)r>   r8   r-   rÖ   r   r   r   r?   x  s*   

ÿ
þÿ
zSocketListener.__init__c              
   C   sr   	 z
| j  ¡ \}| _W n  tttjfy+ } zt|dd ƒtj	kr!‚ W Y d }~nd }~ww nq| 
d¡ tt|ƒƒS )NTr¹   )rF   rØ   rá   rS   rº   r2   r»   r¼   r¹   r½   r	   r·   rå   )r>   Úsr¿   r   r   r   rØ   �  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   )rF   rY   r  )r>   r  r   r   r   rY   œ  s   
þÿþzSocketListener.closeN)r   )r@   rA   rB   rµ   r?   rØ   rY   r   r   r   r   rÓ   t  s
    
rÓ   c                 C   s8   t | ƒ}t tt|ƒ¡}| d¡ | | ¡ tt|ƒƒS )zO
    Return a connection object connected to the socket given by `address`
    T)r9   r2   r¼   r	   Úconnectr·   rå   )r8   r-   r  r   r   r   rä   ¦  s
   

rä   c                   @   s8   e Zd ZdZddd„Zddd„Zdd	„ Zed
d„ ƒZdS )rÑ   z0
        Representation of a named pipe
        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_listenerrY   )r>   r8   rÖ   r   r   r   r?   º  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þ   Ú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¡\}}|dks\J ‚t|ƒS | d¡\}}|dksmJ ‚w )Nr   Tr�   F)r  Úappendr  Úpopr   r  rS   r¨   ÚERROR_NO_DATAr”   r•   r–   r˜   r¶   r™   rŒ   )r>   rL   rš   r°   r  r›   r   r   r   rØ   Ñ  s2   
ÿ€ð
ÿ
ûþzPipeListener.acceptc                 C   s$   t  d|¡ | D ]}t |¡ qd S )Nz closing listener with address=%r)r   r   r   r¶   )Úqueuer8   rL   r   r   r   r!  è  s   ÿz$PipeListener._finalize_pipe_listenerr   )F)	r@   rA   rB   rµ   r?   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
|vs0t|ƒr1‚ W Y d}~nd}~ww nqt |tjdd¡ t|ƒS )zU
        Return a connection object connected to the pipe given by `address`
        r   éè  r   N)r   r   ÚWaitNamedPiper  rõ   rö   r   r  rú   rS   r¨   r   r  rý   rŒ   )r8   Ú_ignorer   Úhr°   r   r   r   rã   î  s*   
ýÿ€ÿô
ÿrã   é   s   #CHALLENGE#s	   #WELCOME#s	   #FAILURE#c                 C   sr   dd l }t|tƒsJ ‚t t¡}|  t| ¡ | ||d¡ 	¡ }|  
d¡}||kr0|  t¡ d S |  t¡ tdƒ‚)Nr   Úmd5é   zdigest received was wrong)ÚhmacrE   ra   r'   ÚurandomÚMESSAGE_LENGTHri   Ú	CHALLENGEÚnewÚdigestrq   ÚWELCOMEÚFAILUREr   ©Ú
connectionr×   r0  Úmessager5  Úresponser   r   r   rÙ     s   


rÙ   c                 C   sŠ   dd l }t|tƒsJ ‚|  d¡}|d ttƒ… tks J d| ƒ‚|ttƒd … }| ||d¡ ¡ }|  |¡ |  d¡}|t	krCt
dƒ‚d S )Nr   r/  zmessage = %rr.  zdigest sent was rejected)r0  rE   ra   rq   rb   r3  r4  r5  ri   r6  r   r8  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)rG   rY   r}   rq   ri   )Ú_connÚ_dumpsÚ_loadsr¼   Úsetattr)r>   Úconnrj   ÚloadsÚattrrl   r   r   r   r?   5  s   
þzConnectionWrapper.__init__c                 C   s   |   |¡}| j |¡ d S r   )r>  r=  ri   )r>   rl   r  r   r   r   rm   =  s   
zConnectionWrapper.sendc                 C   s   | j  ¡ }|  |¡S r   )r=  rq   r?  )r>   r  r   r   r   ry   A  s   

zConnectionWrapper.recvN)r@   rA   rB   r?   rm   ry   r   r   r   r   r<  3  s    r<  c                 C   s   t  | fd d d d¡}| d¡S )Nr   úutf-8)Ú	xmlrpclibrj   Úencode)rl   Úor   r   r   Ú
_xml_dumpsF  s   
rH  c                 C   s   t  |  d¡¡\\}}|S )NrD  )rE  rB  Údecode)r  rl   Úmethodr   r   r   Ú
_xml_loadsK  s   rK  c                   @   r:   )ÚXmlListenerc                 C   s"   dd l ma t | ¡}t|ttƒS ©Nr   )Úxmlrpc.clientÚclientrE  r   rØ   r<  rH  rK  rk   r   r   r   rØ   R  s   
zXmlListener.acceptN)r@   rA   rB   rØ   r   r   r   r   rL  P  rC   rL  c                  O   s"   dd l ma tt| i |¤ŽttƒS rM  )rN  rO  rE  r<  r   rH  rK  )r  Úkwdsr   r   r   Ú	XmlClientY  s   rQ  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”   ÚWAIT_TIMEOUTr—   rb   ÚWAIT_ABANDONED_0r«   r$  )Úhandlesr   ÚLÚreadyÚresr   r   r   Ú_exhaustive_waitd  s$   
 ÷

þôrY  c           
         sx  |du rt }n|dk rd}nt|d d ƒ}t| ƒ} i ‰g }tƒ ‰ tƒ }z°| D ]W}zt|dƒ}W n ty?   |ˆ| ¡ < Y q'w zt |ƒ dd¡\}}W n t	yf } z|j
}|tvr\‚ W Y d}~nd}~ww |tjkrw| |¡ |ˆ|j< q'ˆ  |¡ d}q'tˆ ¡ |ƒ}W |D ]}| ¡  q‰|D ]A}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|_q’nR|D ]}| ¡  q×|D ]E}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|_qàw ˆ  ‡fdd	„|D ƒ¡ ‡ fd
d„| D ƒS )ú—
        Wait till an object in object_list is ready/readable.

        Returns list of those objects in object_list which are ready/readable.
        Nr   r)  g      à?rG   TrŸ   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[  Úp)Úready_objectsr   r   Ú
<listcomp>½  s    zwait.<locals>.<listcomp>)r–   ÚintrR  Úsetr¼   ÚAttributeErrorrH   r   r£   rS   r¨   Ú_ready_errorsr“   r$  r•   ÚaddrY  Úkeysr˜   r™   ÚERROR_OPERATION_ABORTEDr1   rŸ   Úupdate)
Úobject_listr   Úov_listÚready_handlesrG  rG   rš   r›   r°   r  r   )r_  r\  r   r   z  s”   ÿÿ€þ



ÿ€þ



€òü
ÿ€þ


€òr   r}   c                 C   s˜   |d ur
t |d ƒ}i }t ¡ }| D ]}| |tj¡ t|dƒr'||| ¡ < q|||< qg }| |¡D ]\}}|tj@ rBtd| ƒ‚| 	|| ¡ q3|S )Nr)  rG   zinvalid file descriptor %i)
ra  Úselectr}   ÚregisterÚPOLLINr1   rG   ÚPOLLNVALr+   r$  )Úfdsr   Úfd_mapÚpollsterÚfdÚlsr•   r   r   r   r{   Â  s   


r{   c                 C   s   t   | g g |¡d S rM  )rl  )rp  r   r   r   r   r{   Ô  s   c              
   C   s‚   |dur|dkrt | dƒS tƒ | }	 zt | |ƒW S  tttjfy6 } z|jtjkr,‚ W Y d}~nd}~ww |dur@|tƒ  }q)rZ  Nr   )r{   r   rS   rº   r2   r»   r¹   r½   )ri  r   Údeadliner°   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)rG   r2   Úfromfdr   ÚSOCK_STREAMr#   rv  Ú	DupSocketÚrebuild_connectionrM   rN   )rA  rL   r  rv  Údsr   r   r   Úreduce_connectionð  s   
$ýr|  c                 C   s   |   ¡ }tt |ƒ||ƒS r   )rå   r·   )r{  rM   rN   r=   r   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 rM  )	rM   r   ÚFILE_GENERIC_READrN   ÚFILE_GENERIC_WRITEr   Ú	DupHandlerG   Úrebuild_pipe_connection)rA  r  Údhr   r   r   Úreduce_pipe_connectionü  s
   ÿr‚  c                 C   ó   t t| ƒ||ƒS r   )rŒ   rå   )r�  rM   rN   r   r   r   r€    r‰   r€  c                 C   s    t  |  ¡ ¡}t|| j| jffS r   )r   ÚDupFdrG   rz  rM   rN   )rA  Údfr   r   r   r|    s   c                 C   rƒ  r   )r·   rå   )r…  rM   rN   r   r   r   rz    r‰   )NN)TFFr   )RÚ
__future__r   r¹   r    r'   r/   r2   rl  rÅ   r$   Ú	itertoolsr#   r   r   r   r   Ú_extr   Úcompatr	   r
   Úfiver   r   r   ÚImportErrorr0   r—   rT  rS  r–   Ú__all__r1   Úis_pypyr÷   ÚCONNECTION_TIMEOUTÚcountr*   rÐ   Úfamiliesr   r   r.   r3   r9   Úobjectr;   rD   rŒ   r·   r   r   rå   r   rÓ   rä   rÑ   ÚERROR_SEM_TIMEOUTÚERROR_PIPE_BUSYrã   r2  r3  r6  r7  rÙ   rÚ   r<  rH  rK  rL  rQ  rY  r©   ÚERROR_NETNAME_DELETEDrd  r   r{   r|  rz  rm  r‚  r€  r   r   r   r   Ú<module>   s¾   

ý





 #SV
8
/28ÿ		G

