U &Ì.ep|ã@s ddddgZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z m Z dd lmZejZz$ddlZdd lmZmZmZmZWn$ek rÊejd kr‚dZYnXd Zd ZdZe ¡ZdZdgZe edƒ�rdZedg7Zejd k�rdZedg7Zefdd„Z!dd„Z"dd„Z#dd„Z$dd„Z%Gdd„dƒZ&e�rnGdd„de&ƒZ'Gd d!„d!e&ƒZ(Gd"d„de)ƒZ*dPd#d„Z+ejd k�r°dQd%d„Z,n dRd&d„Z,Gd'd(„d(e)ƒZ-d)d*„Z.ejd k�röGd+d,„d,e)ƒZ/d-d.„Z0d/Z1d0Z2d1Z3d2Z4d3d4„Z5d5d6„Z6Gd7d8„d8e)ƒZ7d9d:„Z8d;d<„Z9Gd=d>„d>e*ƒZ:d?d@„Z;ejd k�rzdAdB„ZhZ?dSdCd„Z@n,ddlAZAe eAdDƒ�r–eAjBZCneAjDZCdTdEd„Z@ejd k�rìdFdG„ZEdHdI„ZFe Ge(eE¡dJdK„ZHdLdM„ZIe Ge'eH¡ndNdG„ZEdOdI„ZFe Ge(eE¡dS)UÚClientÚListenerÚPipeÚwaitéNé)Úutil)ÚAuthenticationErrorÚBufferTooShort)Ú reduction)Ú WAIT_OBJECT_0ÚWAIT_ABANDONED_0Ú WAIT_TIMEOUTÚINFINITEÚwin32i g4@Zsha256ÚAF_INETÚAF_UNIXÚAF_PIPEcCs t ¡|S©N©ÚtimeÚ monotonic)Útimeout©rú2/usr/lib64/python3.8/multiprocessing/connection.pyÚ _init_timeout?srcCs t ¡|kSrr)ÚtrrrÚ_check_timeoutBsrcCsX|dkr dS|dkr&tjdt ¡d�S|dkrLtjdt ¡ttƒfdd�Std ƒ‚d S) z? Return an arbitrary free address for the given family r)Z localhostrrz listener-)ÚprefixÚdirrz\\.\pipe\pyc-%d-%d-Úzunrecognized familyN) ÚtempfileZmktemprZ get_temp_dirÚosÚgetpidÚnextÚ _mmap_counterÚ ValueError©ÚfamilyrrrÚarbitrary_addressIsÿÿr(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Úsocketr&rrrÚ_validate_familyWs   r-cCsTt|ƒtkrdSt|ƒtkr*| d¡r*dSt|ƒtks@t |¡rDdStd|ƒ‚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Úis_abstract_socket_namespacer%)ÚaddressrrrÚ address_typecs r4c@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Ú_ConnectionBaseNTcCs>| ¡}|dkrtdƒ‚|s(|s(tdƒ‚||_||_||_dS)Nrzinvalid handlez6at least one of `readable` and `writable` must be True)Ú __index__r%Ú_handleÚ _readableÚ _writable)ÚselfÚhandleÚreadableÚwritablerrrÚ__init__ysÿz_ConnectionBase.__init__cCs|jdk r| ¡dSr©r7Ú_close©r:rrrÚ__del__†s z_ConnectionBase.__del__cCs|jdkrtdƒ‚dS)Nzhandle is closed)r7ÚOSErrorrArrrÚ _check_closedŠs z_ConnectionBase._check_closedcCs|jstdƒ‚dS)Nzconnection is write-only)r8rCrArrrÚ_check_readableŽsz_ConnectionBase._check_readablecCs|jstdƒ‚dS)Nzconnection is read-only)r9rCrArrrÚ_check_writable’sz_ConnectionBase._check_writablecCs"|jrd|_n| ¡tdƒ‚dS)NFzbad message length)r9r8ÚcloserCrArrrÚ_bad_message_length–sz#_ConnectionBase._bad_message_lengthcCs |jdkS)z True if the connection is closedN©r7rArrrÚclosed�sz_ConnectionBase.closedcCs|jS)z"True if the connection is readable)r8rArrrr<¢sz_ConnectionBase.readablecCs|jS)z"True if the connection is writable)r9rArrrr=§sz_ConnectionBase.writablecCs| ¡|jS)z+File descriptor or handle of the connection)rDr7rArrrÚfileno¬sz_ConnectionBase.filenocCs$|jdk r z | ¡W5d|_XdS)zClose the connectionNr?rArrrrG±s  z_ConnectionBase.closercCs¨| ¡| ¡t|ƒ}|jdkr.tt|ƒƒ}t|ƒ}|dkrFtdƒ‚||krVtdƒ‚|dkrh||}n&|dkrztdƒ‚n|||krŽtdƒ‚| ||||…¡dS)z,Send the bytes data from a bytes-like objectrrzoffset is negativezbuffer length < offsetNzsize is negativezbuffer length < offset + size)rDrFÚ memoryviewÚitemsizeÚbytesÚlenr%Ú _send_bytes)r:ÚbufÚoffsetÚsizeÚmÚnrrrÚ send_bytes¹s"     z_ConnectionBase.send_bytescCs$| ¡| ¡| t |¡¡dS)zSend a (picklable) objectN)rDrFrPÚ_ForkingPicklerÚdumps©r:ÚobjrrrÚsendÎsz_ConnectionBase.sendcCsJ| ¡| ¡|dk r(|dkr(tdƒ‚| |¡}|dkrB| ¡| ¡S)z7 Receive bytes data as a bytes object. Nrznegative maxlength)rDrEr%Ú _recv_bytesrHÚgetvalue)r:Z maxlengthrQrrrÚ recv_bytesÔs z_ConnectionBase.recv_bytesc Cs¸| ¡| ¡t|ƒ�–}|j}|t|ƒ}|dkr>tdƒ‚n||krNtdƒ‚| ¡}| ¡}|||krvt|  ¡ƒ‚|  d¡|  ||||||…¡|W5QR£SQRXdS)zq Receive bytes data into a writeable bytes-like object. Return the number of bytes read. rznegative offsetzoffset too largeN) rDrErLrMrOr%r\Útellr r]ÚseekÚreadinto)r:rQrRrTrMZbytesizeÚresultrSrrrÚrecv_bytes_intoás$        ÿz_ConnectionBase.recv_bytes_intocCs&| ¡| ¡| ¡}t | ¡¡S)zReceive a (picklable) object)rDrEr\rWÚloadsÚ getbuffer)r:rQrrrÚrecvúsz_ConnectionBase.recvçcCs| ¡| ¡| |¡S)z/Whether there is any input available to be read)rDrEÚ_poll©r:rrrrÚpollsz_ConnectionBase.pollcCs|SrrrArrrÚ __enter__sz_ConnectionBase.__enter__cCs | ¡dSr©rG©r:Úexc_typeÚ exc_valueZexc_tbrrrÚ__exit__ sz_ConnectionBase.__exit__)TT)rN)N)r)rg)Ú__name__Ú __module__Ú __qualname__r7r>rBrDrErFrHÚpropertyrJr<r=rKrGrVr[r^rcrfrjrkrprrrrr5vs.       r5c@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ƒdSrrI)r:Z _CloseHandlerrrr@szPipeConnection._closec Cshtj|j|dd�\}}z ÿ  ÿ   zPipeConnection._recv_bytescCs.|jst |j¡ddkrdStt|g|ƒƒS)NrT)r‚rxÚ PeekNamedPiper7ÚboolrrirrrrhJs ÿzPipeConnection._pollcCs€| ¡}t ¡}| |¡t |j¡d}|dk rJt|ƒ||krJ| ¡tj |j|dd�\}}|  d¡\}}| | ¡¡|S)NrTrv) rerƒr„r‡rxr�r7rOrHr†ry)r:r~r�rQrŽÚleftrZrbytesrrrrˆPs zPipeConnection._get_more_data)N) rqrrrsÚ__doc__r‚rxÚ CloseHandler@rPr\rhrˆrrrrrus ruc@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ƒdSrrI©r:r@rrrr@gszConnection._closecCs||jƒdSrrIr–rrrr@lscCs8t|ƒ}||j|ƒ}||8}|dkr&q4||d…}qdS©Nr)rOr7)r:rQr‡Ú remainingrUrrrÚ_sendqs  zConnection._sendcCsbt ¡}|j}|}|dkr^|||ƒ}t|ƒ}|dkrJ||krBt‚ntdƒ‚| |¡||8}q|S)Nrzgot end of file during message)rƒr„r7rOr‹rCr‡)r:rSÚreadrQr;r˜ÚchunkrUrrrÚ_recvzs   zConnection._recvcCs„t|ƒ}|dkrHt dd¡}t d|¡}| |¡| |¡| |¡n8t d|¡}|dkrr| |¡| |¡n| ||¡dS)Niÿÿÿú!iéÿÿÿÿú!Qi@)rOÚstructZpackr™)r:rQrUZ pre_headerÚheaderrrrrPŠs        zConnection._send_bytesNcCs^| d¡}t d| ¡¡\}|dkr@| d¡}t d| ¡¡\}|dk rT||krTdS| |¡S)Nér�ržérŸ)rœr Zunpackr])r:r�rQrSrrrr\¡s  zConnection._recv_bytescCst|g|ƒ}t|ƒSr)rr‘)r:rÚrrrrrh«s zConnection._poll)N)rqrrrsr“rxÚ_multiprocessingZ closesocketr@r[Z_writerfZ_readr!rGr‡ršr™rœrPr\rhrrrrr•`s  r•c@sReZdZdZddd„Zdd„Zdd „Zed d „ƒZed d „ƒZ dd„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. NrcCsp|p|rt|ƒpt}|pt|ƒ}t|ƒ|dkr>t||ƒ|_nt|||ƒ|_|dk rft|tƒsft dƒ‚||_ dS)Nrúauthkey should be a byte string) r4Údefault_familyr(r-Ú PipeListenerÚ _listenerÚSocketListenerÚ isinstancerNÚ TypeErrorÚ_authkey)r:r3r'ÚbacklogÚauthkeyrrrr>»sÿ zListener.__init__cCs>|jdkrtdƒ‚|j ¡}|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©rCÚacceptr­Údeliver_challengeÚanswer_challenge)r:Úcrrrr°Ës    zListener.acceptcCs |j}|dk rd|_| ¡dS)zA Close the bound socket or named pipe of `self`. N)r©rG)r:ZlistenerrrrrGÙszListener.closecCs|jjSr)r©Ú_addressrArrrr3âszListener.addresscCs|jjSr)r©Ú_last_acceptedrArrrÚ last_acceptedæszListener.last_acceptedcCs|SrrrArrrrkêszListener.__enter__cCs | ¡dSrrlrmrrrrpíszListener.__exit__)NNrN) rqrrrsr“r>r°rGrtr3r¶rkrprrrrr´s    cCsh|p t|ƒ}t|ƒ|dkr&t|ƒ}nt|ƒ}|dk rHt|tƒsHtdƒ‚|dk rdt||ƒt||ƒ|S)z= Returns a connection to the address of a `Listener` rNr¦) r4r-Ú PipeClientÚ SocketClientr«rNr¬r²r±)r3r'r¯r³rrrrñs    TcCsj|r>t ¡\}}| d¡| d¡t| ¡ƒ}t| ¡ƒ}n$t ¡\}}t|dd�}t|dd�}||fS)úL Returns pair of connection objects at either end of a pipe TF©r=©r<)r,Z socketpairÚ setblockingr•Údetachr!Úpipe)ÚduplexÚs1Ús2Úc1Úc2Zfd1Zfd2rrrrs       c Csâtdƒ}|r*tj}tjtjB}tt}}ntj}tj}dt}}t ||tjBtj Btj tj Btj Bd||tj tj¡}t ||dtjtjtjtj¡}t |tj dd¡tj|dd�}| d¡\} } t||d�} t||d�} | | fS) r¹rrrNTrvrºr»)r(rxÚ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ÚConnectNamedPiperyru) r¿r3ZopenmodeÚaccessZobsizeZibsizeZh1Zh2rwÚ_rrÂrÃrrrrsT   ÿ ÿù þÿ  c@s*eZdZdZd dd„Zdd„Zdd„Zd S) rªzO Representation of a socket which is bound to an address and listening rcCsÈt tt|ƒ¡|_zRtjdkr2|j tjtjd¡|j d¡|j  |¡|j  |¡|j  ¡|_ Wn t k r„|j ¡‚YnX||_d|_|dkr¾t |¡s¾tj|tj|fdd�|_nd|_dS)NÚposixrTrr©ÚargsZ exitpriority)r,ÚgetattrÚ_socketr!ÚnameZ setsockoptZ SOL_SOCKETZ SO_REUSEADDRr¼ZbindZlistenZ getsocknamer´rCrGZ_familyrµrr2ÚFinalizeÚunlinkÚ_unlink)r:r3r'r®rrrr>Ks0  ÿ    ÿ zSocketListener.__init__cCs&|j ¡\}|_| d¡t| ¡ƒS)NT)rÚr°rµr¼r•r½©r:Úsrrrr°ds zSocketListener.acceptcCs0z|j ¡W5|j}|dk r*d|_|ƒXdSr)rÞrÚrG)r:rÝrrrrGis zSocketListener.closeN)r)rqrrrsr“r>r°rGrrrrrªGs rªc CsPt|ƒ}t tt|ƒ¡�.}| d¡| |¡t| ¡ƒW5QR£SQRXdS)zO Return a connection object connected to the socket given by `address` TN)r4r,rÙr¼Zconnectr•r½)r3r'ràrrrr¸ss   r¸c@s8eZdZdZd dd„Zd dd„Zdd „Zed d „ƒZdS)r¨z0 Representation of a named pipe NcCsL||_|jdd�g|_d|_t d|j¡tj|tj|j|jfdd�|_ dS)NT)Úfirstz listener created with address=%rrr×) r´Ú _new_handleÚ _handle_queuerµrÚ sub_debugrÜr¨Ú_finalize_pipe_listenerrG)r:r3r®rrrr>‡s þzPipeListener.__init__Fc CsHtjtjB}|r|tjO}t |j|tjtjBtjBtj t t tj tj ¡Sr) rxrÄrÉrÊrÈr´rËrÌrÍZPIPE_UNLIMITED_INSTANCESrÇrÎrÏ)r:ráÚflagsrrrrâ’s   ÿûzPipeListener._new_handlec Cs¶|j | ¡¡|j d¡}ztj|dd�}Wn0tk r^}z|jtjkrN‚W5d}~XYnPXzrâr°Ú staticmethodrårrrrr¨ƒs  r¨c Csœtƒ}z6t |d¡t |tjtjBdtjtjtjtj¡}Wq‚t k rz}z |j tj tj fksht |ƒrj‚W5d}~XYqXq‚q‚t |tjdd¡t|ƒS)zU Return a connection object connected to the pipe given by `address` éèrN)rrxZ WaitNamedPiperÐrÅrÆrÏrÑrÉrCr‰ZERROR_SEM_TIMEOUTZERROR_PIPE_BUSYrrÒrÌru)r3rÚhr�rrrr·»s8  ýÿÿÿr·és #CHALLENGE#s #WELCOME#s #FAILURE#cCs‚ddl}t|tƒs$td t|ƒ¡ƒ‚t t¡}|  t |¡|  ||t ¡  ¡}| d¡}||krl|  t¡n|  t¡tdƒ‚dS)Nrú Authkey must be bytes, not {0!s}ézdigest received was wrong)Úhmacr«rNr%Úformatr.r!ÚurandomÚMESSAGE_LENGTHrVÚ CHALLENGEÚnewÚHMAC_DIGEST_NAMEÚdigestr^ÚWELCOMEÚFAILUREr©Z connectionr¯rðÚmessager÷Zresponserrrr±às  ÿ    r±cCsxddl}t|tƒs$td t|ƒ¡ƒ‚| d¡}|ttƒd…}|  ||t ¡  ¡}|  |¡| d¡}|t krttdƒ‚dS)Nrrîrïzdigest sent was rejected)rðr«rNr%rñr.r^rOrôrõrör÷rVrørrúrrrr²ïs  ÿ   r²c@s$eZdZdd„Zdd„Zdd„ZdS)ÚConnectionWrappercCs6||_||_||_dD]}t||ƒ}t|||ƒqdS)N)rKrGrjr^rV)Ú_connÚ_dumpsÚ_loadsrÙÚsetattr)r:ÚconnrXrdÚattrrZrrrr>s  zConnectionWrapper.__init__cCs| |¡}|j |¡dSr)rþrýrV)r:rZràrrrr[ s zConnectionWrapper.sendcCs|j ¡}| |¡Sr)rýr^rÿrßrrrrf s zConnectionWrapper.recvN)rqrrrsr>r[rfrrrrrüsrücCst |fdddd¡ d¡S)Nrúutf-8)Ú xmlrpclibrXÚencode)rZrrrÚ _xml_dumpssrcCst | d¡¡\\}}|S)Nr)rrdÚdecode)ràrZÚmethodrrrÚ _xml_loadssr c@seZdZdd„ZdS)Ú XmlListenercCs"ddlmat |¡}t|ttƒSr—)Ú xmlrpc.clientÚclientrrr°rürr rYrrrr°s  zXmlListener.acceptN)rqrrrsr°rrrrr sr cOsddlmatt||ŽttƒSr—)r r rrürrr )rØÚkwdsrrrÚ XmlClients rcCs®t|ƒ}g}|rªt |d|¡}|tkr*qªn\t|krFtt|ƒkrTnn |t8}n2t|krptt|ƒkr~nn |t8}ntdƒ‚| ||¡||dd…}d}q |S)NFzShould not get hererr) Úlistrxr{r r rOr rŒrç)ZhandlesrÚLÚreadyrérrrÚ_exhaustive_wait)s    rc s^|dkrt}n|dkrd}nt|ddƒ}t|ƒ}i‰g}tƒ‰tƒ}�z@|D�]&}zt|dƒ} Wn tk r„|ˆ| ¡<YqPXzt  | ƒdd¡\}}Wn8tk rÖ}zd|j}}|tkrÆ‚W5d}~XYnX|t jkrø| |¡|ˆ|j <qP|�rjt ¡dd…d k�rjz| d ¡\}}Wn*tk �rP}z |j}W5d}~XYnX|�sjt |dƒ�rjd|_ˆ  |¡d}qPtˆ ¡|ƒ}W5|D]}| ¡�q�|D]Œ}z| d¡\}}Wn6tk �rð}z|j}|tk�rà‚W5d}~XYnX|t j k�r¤ˆ|j }ˆ  |¡|dk�r¤t |dƒ�r¤d|_�q¤Xˆ ‡fd d „|Dƒ¡‡fd 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. Nrrëgà?Tr‚rKé)érFc3s|]}ˆ|VqdSrr)Ú.0rì)Úwaithandle_to_objrrÚ Šszwait..csg|]}|ˆkr|‘qSrr)rÚo)Ú ready_objectsrrÚ ‹súwait..)rÚintrÚsetr}ryrCr‰Ú _ready_errorsrxZERROR_OPERATION_ABORTEDr|Úaddr+r‚rÙÚAttributeErrorr6r†rzrçr)ZgetwindowsversionrÚkeysÚupdate) Ú object_listrZov_listZ ready_handlesr~rÕrr�rrKr)rrrr?sh              Ú PollSelectorc Cs˜tƒ�ˆ}|D]}| |tj¡q |dk r4t ¡|}| |¡}|r\dd„|DƒW5QR£S|dk r4|t ¡}|dkr4|W5QR£Sq4W5QRXdS)rNcSsg|]\}}|j‘qSr)Zfileobj)rÚkeyZeventsrrrr©srr)Ú _WaitSelectorÚregisterÚ selectorsZ EVENT_READrrZselect)r$rZselectorrZZdeadlinerrrrr™s   c CsZ| ¡}t |tjtj¡�6}ddlm}| |¡}t||j |j ffW5QR£SQRXdS)Nr)Úresource_sharer) rKr,ZfromfdrZ SOCK_STREAMrr*Z DupSocketÚrebuild_connectionr<r=)rr;ràr*ÚdsrrrÚreduce_connectionµs   r-cCs| ¡}t| ¡||ƒSr©r½r•)r,r<r=Zsockrrrr+»sr+cCsB|jr tjnd|jrtjndB}t | ¡|¡}t||j|jffSr—) r<rxZFILE_GENERIC_READr=ZFILE_GENERIC_WRITEr Z DupHandlerKÚrebuild_pipe_connection)rrÔÚdhrrrÚreduce_pipe_connectionÀs ÿr1cCs| ¡}t|||ƒSr)r½ru)r0r<r=r;rrrr/Åsr/cCs t | ¡¡}t||j|jffSr)r ZDupFdrKr+r<r=)rÚdfrrrr-ËscCs| ¡}t|||ƒSrr.)r2r<r=Úfdrrrr+Îs)NN)T)T)N)N)JÚ__all__rƒr!r)r,r rr Ú itertoolsr¥rrrr Úcontextr ZForkingPicklerrWrxr r r rÚ ImportErrorr*rÇZCONNECTION_TIMEOUTröÚcountr$r§Zfamiliesr+rrr(r-r4r5rur•Úobjectrrrrªr¸r¨r·rórôrørùr±r²rürr r rrrŠZERROR_NETNAME_DELETEDrrr)r%r'ZSelectSelectorr-r+r(r1r/rrrrÚ s¤           PT=    ,, 8   P