o w[e{@sgdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z m Z ddlmZejZzddlZddlmZmZmZmZWneybejdkr^dZYnwd Zd ZeZd Zd gZeed r|d Zed g7Zejdkrd Zed g7ZefddZ ddZ!ddZ"ddZ#ddZ$GdddZ%erGddde%Z&Gddde%Z'Gddde(Z)dPd d!Z*ejdkrdQd#d$Z+ndQd%d$Z+Gd&d'd'e(Z,d(d)Z-ejdkrGd*d+d+e(Z.d,d-Z/d.Z0d/Z1d0Z2d1Z3d2d3Z4d4d5Z5Gd6d7d7e(Z6d8d9Z7d:d;Z8Gdd?Z:ejdkr3d@dAZ;ejdRdBdCZ?nddl@Z@ee@dDrAe@jAZBne@jCZBdRdEdCZ?ejdkrmdFdGZDdHdIZEeFe'eDdJdKZGdLdMZHeFe&eGdSdNdGZDdOdIZEeFe'eDdS)S)ClientListenerPipewaitN)util)AuthenticationErrorBufferTooShort) reduction) WAIT_OBJECT_0WAIT_ABANDONED_0 WAIT_TIMEOUTINFINITEwin32i g4@AF_INETAF_UNIXAF_PIPEcCs t|SNtime monotonic)timeoutr1/usr/lib/python3.10/multiprocessing/connection.py _init_timeout; rcCs t|kSrr)trrr_check_timeout>rrcCsT|dkrdS|dkrtjdtdS|dkr&tjdtttfddStd ) z? Return an arbitrary free address for the given family r) localhostrrz listener-)prefixdirrz\\.\pipe\pyc-%d-%d-zunrecognized family) tempfilemktempr get_temp_dirosgetpidnext _mmap_counter ValueErrorfamilyrrrarbitrary_addressEsr,cCsRtjdkr|dkrtd|tjdkr#|dkr%tt|s'td|dSdSdS)zD Checks if the family is valid for the current environment. rrzFamily %s is not recognized.rN)sysplatformr)hasattrsocketr*rrr_validate_familySs   r1cCsPt|tkrdSt|tur|drdSt|tus t|r"dStd|)z] Return the types of the address This can be 'AF_INET', 'AF_UNIX', or 'AF_PIPE' rz\\rrzaddress type of %r unrecognized)typetuplestr startswithris_abstract_socket_namespacer))addressrrr address_type_s  r8c@seZdZdZd+ddZddZddZd d Zd d Zd dZ e ddZ e ddZ e ddZ ddZddZd,ddZddZd-ddZd.d d!Zd"d#Zd/d%d&Zd'd(Zd)d*ZdS)0_ConnectionBaseNTcCs>|}|dkr td|s|std||_||_||_dS)Nrzinvalid handlez6at least one of `readable` and `writable` must be True) __index__r)_handle _readable _writable)selfhandlereadablewritablerrr__init__us z_ConnectionBase.__init__cCs|jdur |dSdSrr;_closer>rrr__del__s  z_ConnectionBase.__del__cCs|jdur tddS)Nzhandle is closed)r;OSErrorrErrr _check_closeds z_ConnectionBase._check_closedcC|jstddS)Nzconnection is write-only)r<rGrErrr_check_readablez_ConnectionBase._check_readablecCrI)Nzconnection is read-only)r=rGrErrr_check_writablerKz_ConnectionBase._check_writablecCs$|jr d|_td|td)NFzbad message length)r=r<closerGrErrr_bad_message_lengths z#_ConnectionBase._bad_message_lengthcCs |jduS)z True if the connection is closedNr;rErrrcloseds z_ConnectionBase.closedcC|jS)z"True if the connection is readable)r<rErrrr@z_ConnectionBase.readablecCrQ)z"True if the connection is writable)r=rErrrrArRz_ConnectionBase.writablecCs||jS)z+File descriptor or handle of the connection)rHr;rErrrfilenosz_ConnectionBase.filenocCs,|jdurz |Wd|_dSd|_wdS)zClose the connectionNrCrErrrrMs  z_ConnectionBase.closercCs||t|}|jdkrtt|}t|}|dkr#td||kr+td|dur4||}n|dkrbufoffsetsizemnrrr send_bytess"    z_ConnectionBase.send_bytescCs$|||t|dS)zSend a (picklable) objectN)rHrLrX_ForkingPicklerdumpsr>objrrrsendsz_ConnectionBase.sendcCsJ|||dur|dkrtd||}|dur!||S)z7 Receive bytes data as a bytes object. Nrznegative maxlength)rHrJr) _recv_bytesrNgetvalue)r> maxlengthrYrrr recv_bytess z_ConnectionBase.recv_bytescCs||t|K}|j}|t|}|dkrtd||kr&td|}|}|||kr:t| | d| |||||||WdS1sZwYdS)zq Receive bytes data into a writeable bytes-like object. Return the number of bytes read. rznegative offsetzoffset too largeN) rHrJrTrUrWr)rdtellr reseekreadinto)r>rYrZr\rUbytesizeresultr[rrrrecv_bytes_intos&       $z_ConnectionBase.recv_bytes_intocCs&|||}t|S)zReceive a (picklable) object)rHrJrdr_loads getbuffer)r>rYrrrrecvsz_ConnectionBase.recvcCs||||S)z/Whether there is any input available to be read)rHrJ_pollr>rrrrpolls z_ConnectionBase.pollcC|SrrrErrr __enter__z_ConnectionBase.__enter__cC |dSrrMr>exc_type exc_valueexc_tbrrr__exit__rz_ConnectionBase.__exit__)TT)rNr)r)rq)__name__ __module__ __qualname__r;rBrFrHrJrLrNpropertyrPr@rArSrMr^rcrgrmrprtrvr~rrrrr9rs0          r9c@sDeZdZdZdZejfddZddZddd 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. FcC||jdSrrO)r> _CloseHandlerrrrDzPipeConnection._closec Cstj|j|dd\}}z(z|tjkr!t|jgdt}|tks!JWn|W| d\}}n| d\}}w|dksBJ|t |ksJJdS)NT overlappedFr) _winapi WriteFiler;ERROR_IO_PENDINGWaitForMultipleObjectseventrr cancelGetOverlappedResultrW)r>rYoverrwaitresnwrittenrrrrXs     zPipeConnection._send_bytesNc Csh|jr d|_tS|durdnt|d}ztj|j|dd\}}zFz|tjkr7t|j gdt }|t ks7JWn| W| d\}}|dkr[t}|||WS|tjkrg|||WSn2| d\}}|dkrt}|||YWS|tjkr|||YWSwWtdty}z |jtjkrtd}~ww)NFTrrz.shouldn't get here; expected KeyboardInterrupt)_got_empty_messageioBytesIOminrReadFiler;rrrrr rrwriteroERROR_MORE_DATA_get_more_datarGwinerrorERROR_BROKEN_PIPEEOFError RuntimeError) r>maxsizebsizerrrnreadferrrrd&sT        zPipeConnection._recv_bytescCs.|js t|jddkrdStt|g|S)NrT)rr PeekNamedPiper;boolrrsrrrrrFszPipeConnection._pollcCs|}t}||t|jd}|dksJ|dur+t|||kr+|tj |j|dd\}}| d\}}|dksCJ||ksIJ|||S)NrrTr) rorrrrrr;rWrNrr)r>rrrYrleftrrbytesrrrrLs    zPipeConnection._get_more_datar) rrr__doc__rr CloseHandlerDrXrdrrrrrrrr s  rc@s|eZdZdZerejfddZejZ ej Z n e j fddZe jZ e jZ e fddZe fddZd d Zdd d ZddZd S) Connectionzo Connection class based on an arbitrary file descriptor (Unix only), or a socket handle (Windows). cCrrrOr>rDrrrrDcrzConnection._closecCrrrOrrrrrDhrcCs8t|} ||j|}||8}|dkrdS||d}q)NTr)rWr;)r>rYr remainingr]rrr_sendms  zConnection._sendcCsft}|j}|}|dkr1|||}t|}|dkr$||kr ttd||||8}|dks |S)Nrzgot end of file during message)rrr;rWrrGr)r>r[readrYr?rchunkr]rrr_recvvs   zConnection._recvcCst|}|dkr%tdd}td|}||||||dStd|}|dkr;||||dS|||dS)Ni!i!Qi@)rWstructpackr)r>rYr] pre_headerheaderrrrrXs      zConnection._send_bytesNcCs^|d}td|\}|dkr |d}td|\}|dur*||kr*dS||S)Nrrr)rrunpackre)r>rrYr[rrrrds   zConnection._recv_bytescCst|g|}t|Sr)rr)r>rrrrrrrs zConnection._pollr)rrrrr_multiprocessing closesocketrDrc_writerp_readr%rMrrrrrXrdrrrrrrr\s    rc@sReZdZdZdddZddZdd Zed d Zed d Z ddZ ddZ 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|p t}|pt|}t||dkrt|||_nt||||_|dur3t|ts3t d||_ dS)Nrauthkey should be a byte string) r8default_familyr,r1 PipeListener _listenerSocketListener isinstancerV TypeError_authkey)r>r7r+backlogauthkeyrrrrBs  zListener.__init__cCs>|jdur td|j}|jrt||jt||j|S)zz Accept a connection on the bound socket or named pipe of `self`. Returns a `Connection` object. Nzlistener is closed)rrGacceptrdeliver_challengeanswer_challenge)r>crrrrs    zListener.acceptcCs$|j}|durd|_|dSdS)zA Close the bound socket or named pipe of `self`. N)rrM)r>listenerrrrrMs  zListener.closecC|jjSr)r_addressrErrrr7zListener.addresscCrr)r_last_acceptedrErrr last_acceptedrzListener.last_acceptedcCrurrrErrrrvrwzListener.__enter__cCrxrryrzrrrr~rzListener.__exit__)NNrN) rrrrrBrrMrr7rrvr~rrrrrs    rcCsh|pt|}t||dkrt|}nt|}|dur$t|ts$td|dur2t||t|||S)z= Returns a connection to the address of a `Listener` rNr) r8r1 PipeClient SocketClientrrVrrr)r7r+rrrrrrs    rTcCsp|r"t\}}|d|dt|}t|}||fSt\}}t|dd}t|dd}||fS)L Returns pair of connection objects at either end of a pipe TFrAr@)r0 socketpair setblockingrdetachr%pipe)duplexs1s2c1c2fd1fd2rrrrs       rc Cstd}|rtj}tjtjB}tt}}n tj}tj}dt}}t||tjBtj Btj tj Btj Bd||tj tj}t||dtjtjtjtj}t|tj ddtj|dd}|d\} } | dksgJt||d} t||d} | | fS) rrrrNTrrr)r,rPIPE_ACCESS_DUPLEX GENERIC_READ GENERIC_WRITEBUFSIZEPIPE_ACCESS_INBOUNDCreateNamedPipeFILE_FLAG_OVERLAPPEDFILE_FLAG_FIRST_PIPE_INSTANCEPIPE_TYPE_MESSAGEPIPE_READMODE_MESSAGE PIPE_WAITNMPWAIT_WAIT_FOREVERNULL CreateFile OPEN_EXISTINGSetNamedPipeHandleStateConnectNamedPiperr) rr7openmodeaccessobsizeibsizeh1h2r_rrrrrrrs>           c@s*eZdZdZd ddZddZddZd S) rzO Representation of a socket which is bound to an address and listening rcCsttt||_z)tjdkr|jtjtjd|jd|j ||j ||j |_ Wn t y?|jw||_d|_|dkr]t|s]tj|tj|fdd|_dSd|_dS)NposixrTrrargs exitpriority)r0getattr_socketr%name setsockopt SOL_SOCKET SO_REUSEADDRrbindlisten getsocknamerrGrM_familyrrr6Finalizeunlink_unlink)r>r7r+rrrrrBGs*         zSocketListener.__init__cCs&|j\}|_|dt|S)NT)rrrrrrr>srrrr`s  zSocketListener.acceptcCsNz|jW|j}|durd|_|dSdS|j}|dur&d|_|wwr)rrMr)r>r rrrrMes  zSocketListener.closeN)r)rrrrrBrrMrrrrrCs   rcCs\t|}ttt|}|d||t|WdS1s'wYdS)zO Return a connection object connected to the socket given by `address` TN)r8r0rrconnectrr)r7r+rrrrros    $rc@s8eZdZdZd ddZd ddZdd Zed d ZdS)rz0 Representation of a named pipe NcCsL||_|jddg|_d|_td|jtj|tj|j|jfdd|_ dS)NT)firstz listener created with address=%rrr) r _new_handle _handle_queuerr sub_debugr r_finalize_pipe_listenerrM)r>r7rrrrrBs  zPipeListener.__init__Fc CsHtjtjB}|r |tjO}t|j|tjtjBtjBtj t t tj tj Sr) rrrrrrrrrPIPE_UNLIMITED_INSTANCESrrr)r>rflagsrrrrs   zPipeListener._new_handlec Cs|j||jd}z tj|dd}Wnty3}z|jtjkr&WYd}~t|Sd}~wwz+z t |j gdt }Wn | t |W|d\}}|dks\Jt|S|d\}}|dksmJw)NrTrF)rappendrpoprrrGr ERROR_NO_DATArrrrrrr)r>r?rrresrrrrrrs2      zPipeListener.acceptcCs$td||D]}t|qdS)Nz closing listener with address=%r)rrrr)queuer7r?rrrrs  z$PipeListener._finalize_pipe_listenerr)F) rrrrrBrr staticmethodrrrrrrs   rc Cst} zt|dt|tjtjBdtjtjtjtj}Wn t y?}z|j tj tj fvs4t |r5WYd}~nd}~wwnqt|tjddt|S)zU Return a connection object connected to the pipe given by `address` rrN)rr WaitNamedPiperrrrrrrGrERROR_SEM_TIMEOUTERROR_PIPE_BUSYrrrr)r7rhrrrrrs2     rs #CHALLENGE#s #WELCOME#s #FAILURE#cCsddl}t|tstdt|tt}| t || ||d }| d}||kr7| tdS| ttd)Nr Authkey must be bytes, not {0!s}md5zdigest received was wrong)hmacrrVr)formatr2r%urandomMESSAGE_LENGTHr^ CHALLENGEnewdigestrgWELCOMEFAILUREr connectionrr(messager.responserrrrs     rcCsddl}t|tstdt||d}|dtttks'Jd||ttd}| ||d }| ||d}|t krJt ddS)Nrr%r'z message = %rr&zdigest sent was rejected)r(rrVr)r)r2rgrWr,r-r.r^r/rr1rrrrs      rc@s$eZdZddZddZddZdS)ConnectionWrappercCs6||_||_||_dD] }t||}t|||q dS)N)rSrMrtrgr^)_conn_dumps_loadsrsetattr)r>connr`rnattrrbrrrrBs zConnectionWrapper.__init__cCs||}|j|dSr)r7r6r^)r>rbrrrrrcs zConnectionWrapper.sendcCs|j}||Sr)r6rgr8rrrrrps  zConnectionWrapper.recvN)rrrrBrcrprrrrr5s r5cCst|fdddddS)Nrutf-8) xmlrpclibr`encode)rbrrr _xml_dumps sr?cCst|d\\}}|S)Nr<)r=rndecode)rrbmethodrrr _xml_loadssrBc@seZdZddZdS) XmlListenercCs"ddlmat|}t|ttSNr) xmlrpc.clientclientr=rrr5r?rBrarrrrs   zXmlListener.acceptN)rrrrrrrrrCs rCcOs"ddlmatt|i|ttSrD)rErFr=r5rr?rB)rkwdsrrr XmlClients rHcCst|}g}|rZt|d|}|tkr |St|kr$tt|kr+nn|t8}nt|kr9tt|krCntd|t8}ntd|||||dd}d}|s|S)NFzShould not get hererr) listrrr r rWr rr)handlesrLreadyrrrr_exhaustive_wait%s$   rMc s|durt}n|dkrd}nt|dd}t|}ig}tt}z|D]}zt|d}Wnty?||<Yq'wz t|dd\}}Wnt yi}zd|j }}|t vr_WYd}~nd}~ww|tj krz| |||j<q'|rtdddkrz |d \} }Wnt y}z |j }WYd}~nd}~ww|st|d rd|_|d}q't|}W|D]}|q|D]D}z |d\} }Wnt y}z|j }|t vrWYd}~nd}~ww|tjkr|j}||dkrt|d rd|_qnU|D]}|q|D]G}z |d\} }Wnt yC}z|j }|t vr9WYd}~nd}~ww|tjkrb|j}||dkrbt|d rbd|_qwfd d |Dfd d|DS) Wait till an object in object_list is ready/readable. Returns list of those objects in object_list which are ready/readable. Nrrg?rST)rOFrc3s|]}|VqdSrr).0r#)waithandle_to_objrr szwait..csg|]}|vr|qSrr)rQo) ready_objectsrr swait..)rintrIsetrAttributeErrorr:rrrGr _ready_errorsrrrr-getwindowsversionrr/raddrMkeysrERROR_OPERATION_ABORTEDupdate) object_listrov_list ready_handlesrTrSrrrrr)rUrRrr;s                      r PollSelectorcCstE}|D] }||tjq|durt|} ||}|r0dd|DWdS|durG|t}|dkrG|WdSq1sKwYdS)rNNTcSsg|]\}}|jqSr)fileobj)rQkeyeventsrrrrVsrWr) _WaitSelectorregister selectors EVENT_READrrselect)rarselectorrbdeadlinerLrrrrs"    cCsf|}t|tjtj}ddlm}||}t||j |j ffWdS1s,wYdS)Nr)resource_sharer) rSr0fromfdr SOCK_STREAMr!ro DupSocketrebuild_connectionr@rA)r:r?rrodsrrrreduce_connections   $rucCs|}t|||Srrr)rtr@rAsockrrrrssrscCsB|jrtjnd|jr tjndB}t||}t||j|jffSrD) r@rFILE_GENERIC_READrAFILE_GENERIC_WRITEr DupHandlerSrebuild_pipe_connection)r:rdhrrrreduce_pipe_connections r}cC|}t|||Sr)rr)r|r@rAr?rrrr{ r{cCs t|}t||j|jffSr)r DupFdrSrsr@rA)r:dfrrrruscCr~rrv)rr@rAfdrrrrsr)NN)Tr)I__all__rr%r-r0rrr" itertoolsrr!rrr contextr ForkingPicklerr_rr r r r ImportErrorr.rCONNECTION_TIMEOUTcountr(rfamiliesr/rrr,r1r8r9rrobjectrrrrrrrr+r,r/r0rrr5r?rBrCrHrMrERROR_NETNAME_DELETEDr[rrjrdrhSelectSelectorrursrir}r{rrrrs            PT =   ,, 8   P