3 § f«xã @sddddgZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z m Z dd lmZejZy$ddlZdd lmZmZmZmZWn$ek rÊejd kr‚dZYnXd Zd ZejƒZdZdgZeedƒrþdZedg7Zejd k�rdZedg7Zefdd„Z dd„Z!dd„Z"dd„Z#dd„Z$Gdd„dƒZ%e�rhGdd„de%ƒZ&Gdd „d e%ƒZ'Gd!d„de(ƒZ)dOd"d„Z*ejd k�rªdPd$d„Z+n dQd%d„Z+Gd&d'„d'e(ƒZ,d(d)„Z-ejd k�rðGd*d+„d+e(ƒZ.d,d-„Z/d.Z0d/Z1d0Z2d1Z3d2d3„Z4d4d5„Z5Gd6d7„d7e(ƒZ6d8d9„Z7d:d;„Z8Gdd?„Z:ejd k�rtd@dA„Z;ejdRdBd„Z?n,ddl@Z@ee@dCƒ�r�e@jAZBne@jCZBdSdDd„Z?ejd k�rædEdF„ZDdGdH„ZEejFe'eDƒdIdJ„ZGdKdL„ZHejFe&eGƒndMdF„ZDdNdH„ZEejFe'eDƒdS)TÚClientÚListenerÚPipeÚwaitéNé)Úutil)ÚAuthenticationErrorÚBufferTooShort)Ú reduction)Ú WAIT_OBJECT_0ÚWAIT_ABANDONED_0Ú WAIT_TIMEOUTÚINFINITEÚwin32i g4@ÚAF_INETÚAF_UNIXÚAF_PIPEcCs tjƒ|S)N)ÚtimeÚ monotonic)Útimeout©rú?/opt/alt/python36/lib64/python3.6/multiprocessing/connection.pyÚ _init_timeout;srcCs tjƒ|kS)N)rr)ÚtrrrÚ_check_timeout>srcCsX|dkr d S|dkr&tjdtjƒd�S|dkrLtjdtjƒttƒfd d�Std ƒ‚d S) z? Return an arbitrary free address for the given family rÚ localhostrrz listener-)ÚprefixÚdirrz\\.\pipe\pyc-%d-%d-Úzunrecognized familyN)rr) ÚtempfileZmktemprZ get_temp_dirÚosÚgetpidÚnextÚ _mmap_counterÚ ValueError)ÚfamilyrrrÚarbitrary_addressEsr&cCsJtjdkr|dkrtd|ƒ‚tjdkrF|dkrFtt|ƒsFtd|ƒ‚dS)zD Checks if the family is valid for the current environment. rrzFamily %s is not recognized.rN)ÚsysÚplatformr$ÚhasattrÚsocket)r%rrrÚ_validate_familySs   r+cCsJt|ƒtkrdSt|ƒtkr*|jdƒr*dSt|ƒtkr:dStd|ƒ‚dS)z] Return the types of the address This can be 'AF_INET', 'AF_UNIX', or 'AF_PIPE' rz\\rrzaddress type of %r unrecognizedN)ÚtypeÚtupleÚstrÚ startswithr$)ÚaddressrrrÚ address_type_s  r1c@s¾eZdZdZd+dd„Zdd„Zdd„Zd d „Zd d „Zd d„Z e dd„ƒZ e dd„ƒZ e dd„ƒZ dd„Zdd„Zd,dd„Zdd„Zd-dd„Zd.d d!„Zd"d#„Zd/d%d&„Zd'd(„Zd)d*„ZdS)0Ú_ConnectionBaseNTcCsB|jƒ}|dkrtdƒ‚| r,| r,tdƒ‚||_||_||_dS)Nrzinvalid handlez6at least one of `readable` and `writable` must be True)Ú __index__r$Ú_handleÚ _readableÚ _writable)ÚselfÚhandleÚreadableÚwritablerrrÚ__init__us z_ConnectionBase.__init__cCs|jdk r|jƒdS)N)r4Ú_close)r7rrrÚ__del__‚s z_ConnectionBase.__del__cCs|jdkrtdƒ‚dS)Nzhandle is closed)r4ÚOSError)r7rrrÚ _check_closed†s z_ConnectionBase._check_closedcCs|jstdƒ‚dS)Nzconnection is write-only)r5r>)r7rrrÚ_check_readableŠsz_ConnectionBase._check_readablecCs|jstdƒ‚dS)Nzconnection is read-only)r6r>)r7rrrÚ_check_writableŽsz_ConnectionBase._check_writablecCs"|jrd|_n|jƒtdƒ‚dS)NFzbad message length)r6r5Úcloser>)r7rrrÚ_bad_message_length’sz#_ConnectionBase._bad_message_lengthcCs |jdkS)z True if the connection is closedN)r4)r7rrrÚclosed™sz_ConnectionBase.closedcCs|jS)z"True if the connection is readable)r5)r7rrrr9žsz_ConnectionBase.readablecCs|jS)z"True if the connection is writable)r6)r7rrrr:£sz_ConnectionBase.writablecCs|jƒ|jS)z+File descriptor or handle of the connection)r?r4)r7rrrÚfileno¨sz_ConnectionBase.filenoc Cs$|jdk r z |jƒWdd|_XdS)zClose the connectionN)r4r<)r7rrrrB­s  z_ConnectionBase.closercCs¨|jƒ|jƒt|ƒ}|jdkr.tt|ƒƒ}t|ƒ}|dkrFtdƒ‚||krVtdƒ‚|dkrh||}n&|dkrztdƒ‚n|||krŽtdƒ‚|j||||…ƒdS)z,Send the bytes data from a bytes-like objectrrzoffset is negativezbuffer length < offsetNzsize is negativezbuffer length < offset + size)r?rAÚ memoryviewÚitemsizeÚbytesÚlenr$Ú _send_bytes)r7ÚbufÚoffsetÚsizeÚmÚnrrrÚ send_bytesµs"     z_ConnectionBase.send_bytescCs$|jƒ|jƒ|jtj|ƒƒdS)zSend a (picklable) objectN)r?rArJÚ_ForkingPicklerÚdumps)r7ÚobjrrrÚsendÊsz_ConnectionBase.sendcCsJ|jƒ|jƒ|dk r(|dkr(tdƒ‚|j|ƒ}|dkrB|jƒ|jƒS)z7 Receive bytes data as a bytes object. Nrznegative maxlength)r?r@r$Ú _recv_bytesrCÚgetvalue)r7Z maxlengthrKrrrÚ recv_bytesÐs z_ConnectionBase.recv_bytesc Cs¬|jƒ|jƒt|ƒ�Š}|j}|t|ƒ}|dkr>tdƒ‚n||krNtdƒ‚|jƒ}|jƒ}|||krvt|j ƒƒ‚|j dƒ|j ||||||…ƒ|SQRXdS)zq Receive bytes data into a writeable bytes-like object. Return the number of bytes read. rznegative offsetzoffset too largeN) r?r@rFrGrIr$rUÚtellr rVÚseekÚreadinto)r7rKrLrNrGZbytesizeÚresultrMrrrÚrecv_bytes_intoÝs"       z_ConnectionBase.recv_bytes_intocCs&|jƒ|jƒ|jƒ}tj|jƒƒS)zReceive a (picklable) object)r?r@rUrQÚloadsÚ getbuffer)r7rKrrrÚrecvösz_ConnectionBase.recvçcCs|jƒ|jƒ|j|ƒS)z/Whether there is any input available to be read)r?r@Ú_poll)r7rrrrÚpollýsz_ConnectionBase.pollcCs|S)Nr)r7rrrÚ __enter__sz_ConnectionBase.__enter__cCs |jƒdS)N)rB)r7Úexc_typeÚ exc_valueÚexc_tbrrrÚ__exit__sz_ConnectionBase.__exit__)TT)rN)N)r)r`)Ú__name__Ú __module__Ú __qualname__r4r;r=r?r@rArCÚpropertyrDr9r:rErBrPrTrWr\r_rbrcrgrrrrr2rs(       r2c@sDeZdZdZdZejfdd„Zdd„Zddd „Z d d „Z d d „Z dS)Ú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. FcCs||jƒdS)N)r4)r7Z _CloseHandlerrrr<szPipeConnection._closecCshtj|j|dd�\}}zÚwinerrorÚERROR_BROKEN_PIPEÚEOFErrorÚ RuntimeError) r7ÚmaxsizeZbsizertrurvZnreadÚfÚerrrrU&s6      zPipeConnection._recv_bytescCs.|jstj|jƒddkrdStt|g|ƒƒS)NrT)rxrnÚ PeekNamedPiper4Úboolr)r7rrrrraFszPipeConnection._pollcCs€|jƒ}tjƒ}|j|ƒtj|jƒd}|dk rJt|ƒ||krJ|jƒtj |j|dd�\}}|j dƒ\}}|j|jƒƒ|S)NrT)rm) r^ryrzr}rnr†r4rIrCr|rs)r7rtrƒrKr„ÚleftruZrbytesrrrr~Ls zPipeConnection._get_more_data)N) rhrirjÚ__doc__rxrnÚ CloseHandler<rJrUrar~rrrrrl s rlc@s|eZdZdZer,ejfdd„ZejZ ej Z ne j fdd„Ze jZ e jZ e fdd„Ze fdd„Zd d „Zdd d „Zdd„Zd S)Ú Connectionzo Connection class based on an arbitrary file descriptor (Unix only), or a socket handle (Windows). cCs||jƒdS)N)r4)r7r<rrrr<cszConnection._closecCs||jƒdS)N)r4)r7r<rrrr<hscCs<t|ƒ}x.||j|ƒ}||8}|dkr(P||d…}q WdS)Nr)rIr4)r7rKr}Ú remainingrOrrrÚ_sendms zConnection._sendcCsftjƒ}|j}|}xN|dkr`|||ƒ}t|ƒ}|dkrL||krDt‚ntdƒ‚|j|ƒ||8}qW|S)Nrzgot end of file during message)ryrzr4rIr�r>r})r7rMÚreadrKr8rŒÚchunkrOrrrÚ_recvvs    zConnection._recvcCsDt|ƒ}tjd|ƒ}|dkr2|j|ƒ|j|ƒn|j||ƒdS)Nz!ii@)rIÚstructZpackr�)r7rKrOÚheaderrrrrJ†s    zConnection._send_bytesNcCs:|jdƒ}tjd|jƒƒ\}|dk r0||kr0dS|j|ƒS)Néz!i)r�r‘ZunpackrV)r7rƒrKrMrrrrU–s  zConnection._recv_bytescCst|g|ƒ}t|ƒS)N)rr‡)r7rÚrrrrra�s zConnection._poll)N)rhrirjr‰rnÚ_multiprocessingZ closesocketr<rTZ_writer_Z_readr rBr}rŽr�r�rJrUrarrrrr‹\s  r‹c@sReZdZdZddd„Zdd„Zdd „Zed d „ƒZed d „ƒZ d d„Z dd„Z dS)rz• Returns a listener object. This is a wrapper for a bound socket which is 'listening' for connections, or for a Windows named pipe. NrcCsr|p|rt|ƒpt}|pt|ƒ}t|ƒ|dkr>t||ƒ|_nt|||ƒ|_|dk rht|tƒ rht dƒ‚||_ dS)Nrzauthkey should be a byte string) r1Údefault_familyr&r+Ú PipeListenerÚ _listenerÚSocketListenerÚ isinstancerHÚ TypeErrorÚ_authkey)r7r0r%ÚbacklogÚauthkeyrrrr;­s zListener.__init__cCs>|jdkrtdƒ‚|jjƒ}|jr:t||jƒt||jƒ|S)zz Accept a connection on the bound socket or named pipe of `self`. Returns a `Connection` object. Nzlistener is closed)r˜r>ÚacceptrœÚdeliver_challengeÚanswer_challenge)r7ÚcrrrrŸ½s    zListener.acceptcCs |j}|dk rd|_|jƒdS)zA Close the bound socket or named pipe of `self`. N)r˜rB)r7ZlistenerrrrrBËszListener.closecCs|jjS)N)r˜Ú_address)r7rrrÚÔszListener.cCs|jjS)N)r˜Ú_last_accepted)r7rrrr¤ÕscCs|S)Nr)r7rrrrc×szListener.__enter__cCs |jƒdS)N)rB)r7rdrerfrrrrgÚszListener.__exit__)NNrN) rhrirjr‰r;rŸrBrkr0Z last_acceptedrcrgrrrrr¦s   cCsj|p t|ƒ}t|ƒ|dkr&t|ƒ}nt|ƒ}|dk rJt|tƒ rJtdƒ‚|dk rft||ƒt||ƒ|S)z= Returns a connection to the address of a `Listener` rNzauthkey should be a byte string) r1r+Ú PipeClientÚ SocketClientršrHr›r¡r )r0r%ržr¢rrrrÞs    TcCsj|r>tjƒ\}}|jdƒ|jdƒt|jƒƒ}t|jƒƒ}n$tjƒ\}}t|dd�}t|dd�}||fS)zL Returns pair of connection objects at either end of a pipe TF)r:)r9)r*Z socketpairÚ setblockingr‹Údetachr Úpipe)ÚduplexÚs1Ús2Úc1Úc2Zfd1Zfd2rrrrõs       c Csâtdƒ}|r*tj}tjtjB}tt}}ntj}tj}dt}}tj||tjBtj Btj tj Btj Bd||tj tjƒ}tj||dtjtjtjtjƒ}tj|tj ddƒtj|dd�}|jdƒ\} } t||d�} t||d�} | | fS) zL Returns pair of connection objects at either end of a pipe rrrNT)rm)r:)r9)r&rnÚPIPE_ACCESS_DUPLEXÚ GENERIC_READÚ GENERIC_WRITEÚBUFSIZEZPIPE_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ÚConnectNamedPipersrl) r«r0ZopenmodeÚaccessZobsizeZibsizeZh1Zh2rmÚ_rur®r¯rrrrs2         c@s*eZdZdZd dd„Zdd„Zdd„Zd S) r™zO Representation of a socket which is bound to an address and listening rcCs¾tjtt|ƒƒ|_yRtjdkr2|jjtjtjdƒ|jjdƒ|jj |ƒ|jj |ƒ|jj ƒ|_ Wn t k r„|jjƒ‚YnX||_d|_|dkr´tj|tj|fdd�|_nd|_dS)NÚposixrTrr)ÚargsÚ exitpriority)r*ÚgetattrÚ_socketr ÚnameZ setsockoptZ SOL_SOCKETZ SO_REUSEADDRr¨ZbindZlistenZ getsocknamer£r>rBZ_familyr¥rÚFinalizeÚunlinkÚ_unlink)r7r0r%r�rrrr;8s$       zSocketListener.__init__cCs&|jjƒ\}|_|jdƒt|jƒƒS)NT)rÆrŸr¥r¨r‹r©)r7ÚsrrrrŸPs zSocketListener.acceptc Cs0z|jjƒWd|j}|dk r*d|_|ƒXdS)N)rÆrBrÊ)r7rÉrrrrBUs zSocketListener.closeN)r)rhrirjr‰r;rŸrBrrrrr™4s r™c CsDt|ƒ}tjtt|ƒƒ�"}|jdƒ|j|ƒt|jƒƒSQRXdS)zO Return a connection object connected to the socket given by `address` TN)r1r*rÅr¨Zconnectr‹r©)r0r%rËrrrr§_s   r§c@s8eZdZdZd dd„Zd dd„Zdd „Zed d „ƒZdS)r—z0 Representation of a named pipe NcCsL||_|jdd�g|_d|_tjd|jƒtj|tj|j|jfdd�|_ dS)NT)Úfirstz listener created with address=%rr)rÃrÄ) r£Ú _new_handleÚ _handle_queuer¥rÚ sub_debugrÈr—Ú_finalize_pipe_listenerrB)r7r0r�rrrr;sszPipeListener.__init__Fc CsHtjtjB}|r|tjO}tj|j|tjtjBtjBtj t t tj tj ƒS)N) rnr°rµr¶r´r£r·r¸r¹ZPIPE_UNLIMITED_INSTANCESr³rºr»)r7rÌÚflagsrrrrÍ~s   zPipeListener._new_handlecCs¶|jj|jƒƒ|jjdƒ}ytj|dd�}Wn0tk r^}z|jtjkrN‚WYdd}~XnPXzrZ ERROR_NO_DATArprqrrrrŠrsrl)r7r8rtr…ÚresrÁrurrrrŸŠs"    zPipeListener.acceptcCs(tjd|ƒx|D]}tj|ƒqWdS)Nz closing listener with address=%r)rrÏrnrŠ)Zqueuer0r8rrrrСs  z$PipeListener._finalize_pipe_listener)N)F) rhrirjr‰r;rÍrŸÚ staticmethodrÐrrrrr—os  r—cCs tƒ}x~y6tj|dƒtj|tjtjBdtjtjtjtjƒ}Wn>t k r|}z"|j tj tj fksjt |ƒrl‚WYdd}~XqXPqW‚tj|tjddƒt|ƒS)zU Return a connection object connected to the pipe given by `address` ièrN)rrnZ WaitNamedPiper¼r±r²r»r½rµr>rZERROR_SEM_TIMEOUTZERROR_PIPE_BUSYrr¾r¸rl)r0rÚhr…rrrr¦§s"   r¦és #CHALLENGE#s #WELCOME#s #FAILURE#cCsfddl}tjtƒ}|jt|ƒ|j||dƒjƒ}|jdƒ}||krP|jt ƒn|jt ƒt dƒ‚dS)NrÚmd5ézdigest received was wrong) Úhmacr ÚurandomÚMESSAGE_LENGTHrPÚ CHALLENGEÚnewÚdigestrWÚWELCOMEÚFAILUREr)Ú connectionržrÚÚmessagerßÚresponserrrr Ìs    r cCs\ddl}|jdƒ}|ttƒd…}|j||dƒjƒ}|j|ƒ|jdƒ}|tkrXtdƒ‚dS)NrrÙrØzdigest sent was rejected) rÚrWrIrÝrÞrßrPràr)râržrÚrãrßrärrrr¡Ùs   r¡c@s$eZdZdd„Zdd„Zdd„ZdS)ÚConnectionWrappercCs:||_||_||_x"dD]}t||ƒ}t|||ƒqWdS)NrErBrbrWrP)rErBrbrWrP)Ú_connÚ_dumpsÚ_loadsrÅÚsetattr)r7ÚconnrRr]ÚattrrSrrrr;ês   zConnectionWrapper.__init__cCs|j|ƒ}|jj|ƒdS)N)rçrærP)r7rSrËrrrrTñs zConnectionWrapper.sendcCs|jjƒ}|j|ƒS)N)rærWrè)r7rËrrrr_ôs zConnectionWrapper.recvN)rhrirjr;rTr_rrrrråésråcCstj|fddddƒjdƒS)Nrzutf-8)Ú xmlrpclibrRÚencode)rSrrrÚ _xml_dumpsøsrîcCstj|jdƒƒ\\}}|S)Nzutf-8)rìr]Údecode)rËrSÚmethodrrrÚ _xml_loadsûsrñc@seZdZdd„ZdS)Ú XmlListenercCs ddljatj|ƒ}t|ttƒS)Nr)Ú xmlrpc.clientÚclientrìrrŸrårîrñ)r7rSrrrrŸs  zXmlListener.acceptN)rhrirjrŸrrrrròÿsròcOsddljatt||ŽttƒS)Nr)rórôrìrårrîrñ)rÃÚkwdsrrrÚ XmlClients röcCs²t|ƒ}g}x |r¬tj|d|ƒ}|tkr,Pn\t|koFtt|ƒknrV|t8}n2t|koptt|ƒknr€|t8}ntdƒ‚|j||ƒ||dd…}d}qW|S)NFzShould not get hererr) Úlistrnrpr r rIr r‚rÒ)ZhandlesrÚLÚreadyrÔrrrÚ_exhaustive_waits    rúc .sn|dkrt}n|dkrd}nt|ddƒ}t|ƒ}i‰g}tƒ‰tƒ}�zH�x2|D�](}yt|dƒ}Wn tk rˆ|ˆ|jƒ<YqTXytj|ƒddƒ\}}Wn8t k rÚ}zd|j }}|t krÊ‚WYdd}~XnX|tj krü|j |ƒ|ˆ|j<qT|�rptjƒdd…dk�rpy|jd ƒ\} }Wn*t k �rT}z |j }WYdd}~XnX| �rpt|d ƒ�rpd|_ˆj|ƒd}qTWtˆjƒ|ƒ}Wdx|D]}|jƒ�qšWx”|D]Œ}y|jdƒ\} }Wn6t k �rþ}z|j }|t k�rî‚WYdd}~XnX|tjk�r²ˆ|j}ˆj|ƒ|dk�r²t|d ƒ�r²d|_�q²WXˆj‡fd d „|Dƒƒ‡fd d„|DƒS)z— Wait till an object in object_list is ready/readable. Returns list of those objects in object_list which are ready/readable. Nriègà?rETééFrxc3s|]}ˆ|VqdS)Nr)Ú.0rÖ)Úwaithandle_to_objrrú rszwait..csg|]}|ˆkr|‘qSrr)rýÚo)Ú ready_objectsrrú sszwait..)rürû)rÚintr÷ÚsetrÅÚAttributeErrorr3rnr|r>rÚ _ready_errorsrorÒrqr'Zgetwindowsversionrsr)rxÚaddrúÚkeysrrZERROR_OPERATION_ABORTEDÚupdate) Ú object_listrZov_listZ ready_handlesrrErtrur…rÁr)rrþrr'sh             Ú PollSelectorc Csˆtƒ�x}x|D]}|j|tjƒqW|dk r8tjƒ|}x@|j|ƒ}|rVdd„|DƒS|dk r:|tjƒ}|dkr:|Sq:WWdQRXdS)z— Wait till an object in object_list is ready/readable. Returns list of those objects in object_list which are ready/readable. NcSsg|]\}}|j‘qSr)Zfileobj)rýÚkeyZeventsrrrr‘szwait..r)Ú _WaitSelectorÚregisterÚ selectorsZ EVENT_READrrZselect)r rZselectorrSZdeadlinerùrrrr�s    c CsN|jƒ}tj|tjtjƒ�*}ddlm}|j|ƒ}t||j |j ffSQRXdS)Nr)Úresource_sharer) rEr*ZfromfdrZ SOCK_STREAMrrZ DupSocketÚrebuild_connectionr9r:)rêr8rËrÚdsrrrÚreduce_connection�s   rcCs|jƒ}t|jƒ||ƒS)N)r©r‹)rr9r:Zsockrrrr£srcCsB|jr tjnd|jrtjndB}tj|jƒ|ƒ}t||j|jffS)Nr) r9rnZFILE_GENERIC_READr:ZFILE_GENERIC_WRITEr Z DupHandlerEÚrebuild_pipe_connection)rêrÀÚdhrrrÚreduce_pipe_connection¨srcCs|jƒ}t|||ƒS)N)r©rl)rr9r:r8rrrr­srcCs tj|jƒƒ}t||j|jffS)N)r ZDupFdrErr9r:)rêÚdfrrrr³scCs|jƒ}t|||ƒS)N)r©r‹)rr9r:Úfdrrrr¶s)NN)T)T)N)N)IÚ__all__ryr r'r*r‘rrÚ itertoolsr•rrrr Úcontextr ZForkingPicklerrQrnr r r rÚ ImportErrorr(r³ZCONNECTION_TIMEOUTÚcountr#r–Zfamiliesr)rrr&r+r1r2rlr‹Úobjectrrrr™r§r—r¦rÜrÝràrár r¡rårîrñròrörúr€ZERROR_NETNAME_DELETEDrrrr r ZSelectSelectorrrrrrrrrrÚ s¢           PJ8    ,+ 8    P