B ?'d@sddddgZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z m Z dd lmZejZy$ddlZdd lmZmZmZmZWn$ek rejd kr‚dZYnXd Zd ZeZdZdgZeedrdZedg7Zejd krdZedg7ZefddZ ddZ!ddZ"ddZ#ddZ$GdddZ%erhGddde%Z&Gdd d e%Z'Gd!dde(Z)dOd"dZ*ejd krdPd$dZ+n dQd%dZ+Gd&d'd'e(Z,d(d)Z-ejd krGd*d+d+e(Z.d,d-Z/d.Z0d/Z1d0Z2d1Z3d2d3Z4d4d5Z5Gd6d7d7e(Z6d8d9Z7d:d;Z8Gdd?Z:ejd krtd@dAZ;ejdRdBdZ?n,ddl@Z@ee@dCre@jAZBne@jCZBdSdDdZ?ejd krdEdFZDdGdHZEeFe'eDdIdJZGdKdLZHeFe&eGndMdFZDdNdHZEeFe'eDdS)TClientListenerPipewaitN)util)AuthenticationErrorBufferTooShort) reduction) WAIT_OBJECT_0WAIT_ABANDONED_0 WAIT_TIMEOUTINFINITEwin32i g4@AF_INETAF_UNIXAF_PIPEcCs t|S)N)time monotonic)timeoutr?/opt/alt/python37/lib64/python3.7/multiprocessing/connection.py _init_timeout;srcCs t|kS)N)rr)trrr_check_timeout>srcCsX|dkr dS|dkr&tjdtdS|dkrLtjdtttfddStd d S) z? Return an arbitrary free address for the given family r)Z localhostrrz listener-)prefixdirrz\\.\pipe\pyc-%d-%d-zunrecognized familyN) tempfileZmktemprZ get_temp_dirosgetpidnext _mmap_counter ValueError)familyrrrarbitrary_addressEsr%cCsJtjdkr|dkrtd|tjdkrF|dkrFtt|sFtd|dS)zD Checks if the family is valid for the current environment. rrzFamily %s is not recognized.rN)sysplatformr#hasattrsocket)r$rrr_validate_familySs   r*cCsTt|tkrdSt|tkr*|dr*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)typetuplestr startswithris_abstract_socket_namespacer#)addressrrr address_type_s r1c@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>|}|dkrtd|s(|s(td||_||_||_dS)Nrzinvalid handlez6at least one of `readable` and `writable` must be True) __index__r#_handle _readable _writable)selfhandlereadablewritablerrr__init__usz_ConnectionBase.__init__cCs|jdk r|dS)N)r4_close)r7rrr__del__s z_ConnectionBase.__del__cCs|jdkrtddS)Nzhandle is closed)r4OSError)r7rrr _check_closeds z_ConnectionBase._check_closedcCs|jstddS)Nzconnection is write-only)r5r>)r7rrr_check_readablesz_ConnectionBase._check_readablecCs|jstddS)Nzconnection is read-only)r6r>)r7rrr_check_writablesz_ConnectionBase._check_writablecCs"|jrd|_n|tddS)NFzbad message length)r6r5closer>)r7rrr_bad_message_lengthsz#_ConnectionBase._bad_message_lengthcCs |jdkS)z True if the connection is closedN)r4)r7rrrclosedsz_ConnectionBase.closedcCs|jS)z"True if the connection is readable)r5)r7rrrr9sz_ConnectionBase.readablecCs|jS)z"True if the connection is writable)r6)r7rrrr:sz_ConnectionBase.writablecCs||jS)z+File descriptor or handle of the connection)r?r4)r7rrrfilenosz_ConnectionBase.filenocCs$|jdk r z |Wdd|_XdS)zClose the connectionN)r4r<)r7rrrrBs  z_ConnectionBase.closercCs||t|}|jdkr.tt|}t|}|dkrFtd||krVtd|dkrh||}n&|dkrztdn|||krtd|||||dS)z,Send the bytes data from a bytes-like objectrrzoffset is negativezbuffer length < offsetNzsize is negativezbuffer length < offset + size)r?rA memoryviewitemsizebyteslenr# _send_bytes)r7bufoffsetsizemnrrr send_bytess"     z_ConnectionBase.send_bytescCs$|||t|dS)zSend a (picklable) objectN)r?rArJ_ForkingPicklerdumps)r7objrrrsendsz_ConnectionBase.sendcCsJ|||dk r(|dkr(td||}|dkrB||S)z7 Receive bytes data as a bytes object. Nrznegative maxlength)r?r@r# _recv_bytesrCgetvalue)r7Z maxlengthrKrrr recv_bytess z_ConnectionBase.recv_bytesc Cs||t|}|j}|t|}|dkr>tdn||krNtd|}|}|||krvt| | d| |||||||SQRXdS)zq Receive bytes data into a writeable bytes-like object. Return the number of bytes read. rznegative offsetzoffset too largeN) r?r@rFrGrIr#rUtellr rVseekreadinto)r7rKrLrNrGZbytesizeresultrMrrrrecv_bytes_intos"       z_ConnectionBase.recv_bytes_intocCs&|||}t|S)zReceive a (picklable) object)r?r@rUrQloads getbuffer)r7rKrrrrecvsz_ConnectionBase.recvcCs||||S)z/Whether there is any input available to be read)r?r@_poll)r7rrrrpollsz_ConnectionBase.pollcCs|S)Nr)r7rrr __enter__sz_ConnectionBase.__enter__cCs |dS)N)rB)r7exc_type exc_valueexc_tbrrr__exit__sz_ConnectionBase.__exit__)TT)rN)N)r)r`)__name__ __module__ __qualname__r4r;r=r?r@rArCpropertyrDr9r:rErBrPrTrWr\r_rbrcrgrrrrr2rs(       r2c@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. FcCs||jdS)N)r4)r7Z _CloseHandlerrrr<szPipeConnection._closec Cstj|j|dd\}}zHy,|tjkrBt|jgdt}|tksBtWn| YnXWd| d\}}X|dks|t|t |kstdS)NT) overlappedFr) _winapiZ WriteFiler4ERROR_IO_PENDINGWaitForMultipleObjectseventrr AssertionErrorcancelGetOverlappedResultrI)r7rKoverrwaitresZnwrittenrrrrJs   zPipeConnection._send_bytesNc Cs|jrd|_tS|dkr dnt|d}ytj|j|dd\}}zHy,|tjkrnt|j gdt }|t ksnt Wn| YnXWd|d\}}|dkrt}|||S|tjkr|||SXWn:tk r}z|jtjkrtnWdd}~XYnXtddS)NFT)rmrz.shouldn't get here; expected KeyboardInterrupt)_got_empty_messageioBytesIOminrnReadFiler4rorprqrr rrrsrtwriter^ZERROR_MORE_DATA_get_more_datar>winerrorERROR_BROKEN_PIPEEOFError RuntimeError) r7maxsizeZbsizerurvrwZnreadferrrrU&s6     zPipeConnection._recv_bytescCs.|jst|jddkrdStt|g|S)NrT)ryrn PeekNamedPiper4boolr)r7rrrrraFszPipeConnection._pollcCs|}t}||t|jd}|dks6t|dk rVt|||krV| tj |j|dd\}}| d\}}|dkst||kst|||S)NrrT)rm) r^rzr{r~rnrr4rrrIrCr}rt)r7rurrKrleftrvZrbytesrrrrLs    zPipeConnection._get_more_data)N) rhrirj__doc__ryrn CloseHandler<rJrUrarrrrrrl s rlc@s|eZdZdZer,ejfddZejZ ej Z ne 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). cCs||jdS)N)r4)r7r<rrrr<cszConnection._closecCs||jdS)N)r4)r7r<rrrr<hscCs<t|}x.||j|}||8}|dkr(P||d}q WdS)Nr)rIr4)r7rKr~ remainingrOrrr_sendms zConnection._sendcCsft}|j}|}xN|dkr`|||}t|}|dkrL||krDtntd||||8}qW|S)Nrzgot end of file during message)rzr{r4rIrr>r~)r7rMreadrKr8rchunkrOrrr_recvvs    zConnection._recvcCsDt|}td|}|dkr2||||n|||dS)Nz!ii@)rIstructZpackr)r7rKrOheaderrrrrJs    zConnection._send_bytesNcCs:|d}td|\}|dk r0||kr0dS||S)Nz!i)rrZunpackrV)r7rrKrMrrrrUs  zConnection._recv_bytescCst|g|}t|S)N)rr)r7rrrrrras zConnection._poll)N)rhrirjrrn_multiprocessingZ closesocketr<rTZ_writer_Z_readrrBr~rrrrJrUrarrrrr\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|pt}|pt|}t||dkr>t|||_nt||||_|dk rft|tsft d||_ dS)Nrzauthkey should be a byte string) r1default_familyr%r* PipeListener _listenerSocketListener isinstancerH TypeError_authkey)r7r0r$backlogauthkeyrrrr;s zListener.__init__cCs>|jdkrtd|j}|jr:t||jt||j|S)zz Accept a connection on the bound socket or named pipe of `self`. Returns a `Connection` object. Nzlistener is closed)rr>acceptrdeliver_challengeanswer_challenge)r7crrrrs    zListener.acceptcCs |j}|dk rd|_|dS)zA Close the bound socket or named pipe of `self`. N)rrB)r7ZlistenerrrrrBszListener.closecCs|jjS)N)r_address)r7rrrr0szListener.addresscCs|jjS)N)r_last_accepted)r7rrr last_acceptedszListener.last_acceptedcCs|S)Nr)r7rrrrcszListener.__enter__cCs |dS)N)rB)r7rdrerfrrrrgszListener.__exit__)NNrN) rhrirjrr;rrBrkr0rrcrgrrrrrs   cCsh|p t|}t||dkr&t|}nt|}|dk rHt|tsHtd|dk rdt||t|||S)z= Returns a connection to the address of a `Listener` rNzauthkey should be a byte string) r1r* PipeClient SocketClientrrHrrr)r0r$rrrrrrs    TcCsj|r>t\}}|d|dt|}t|}n$t\}}t|dd}t|dd}||fS)zL Returns pair of connection objects at either end of a pipe TF)r:)r9)r)Z socketpair setblockingrdetachrpipe)duplexs1s2c1c2Zfd1Zfd2rrrrs       c Cstd}|r*tj}tjtjB}tt}}ntj}tj}dt}}t||tjBtj Btj tj Btj Bd||tj tj}t||dtjtjtjtj}t|tj ddtj|dd}|d\} } | dkstt||d} t||d} | | fS) zL Returns pair of connection objects at either end of a pipe rrrNT)rm)r:)r9)r%rnPIPE_ACCESS_DUPLEX GENERIC_READ GENERIC_WRITEBUFSIZEZPIPE_ACCESS_INBOUNDCreateNamedPipeFILE_FLAG_OVERLAPPEDFILE_FLAG_FIRST_PIPE_INSTANCEPIPE_TYPE_MESSAGEPIPE_READMODE_MESSAGE PIPE_WAITNMPWAIT_WAIT_FOREVERNULL CreateFile OPEN_EXISTINGSetNamedPipeHandleStateConnectNamedPipertrrrl) rr0ZopenmodeaccessZobsizeZibsizeZh1Zh2rm_rvrrrrrr s4          c@s*eZdZdZd ddZddZddZd S) rzO Representation of a socket which is bound to an address and listening rcCsttt||_yRtjdkr2|jtjtjd|jd|j ||j ||j |_ Wn t k r|jYnX||_d|_|dkrt|stj|tj|fdd|_nd|_dS)NposixrTrr)args exitpriority)r)getattr_socketrnameZ setsockoptZ SOL_SOCKETZ SO_REUSEADDRrZbindZlistenZ getsocknamerr>rBZ_familyrrr/Finalizeunlink_unlink)r7r0r$rrrrr;=s$       zSocketListener.__init__cCs&|j\}|_|dt|S)NT)rrrrrr)r7srrrrVs zSocketListener.acceptcCs0z|jWd|j}|dk r*d|_|XdS)N)rrBr)r7rrrrrB[s zSocketListener.closeN)r)rhrirjrr;rrBrrrrr9s rc CsDt|}ttt|"}|d||t|SQRXdS)zO Return a connection object connected to the socket given by `address` TN)r1r)rrZconnectrr)r0r$rrrrres   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=%rr)rr) r _new_handle _handle_queuerr sub_debugrr_finalize_pipe_listenerrB)r7r0rrrrr;yszPipeListener.__init__Fc CsHtjtjB}|r|tjO}t|j|tjtjBtjBtj t t tj tj S)N) rnrrrrrrrrZPIPE_UNLIMITED_INSTANCESrrr)r7rflagsrrrrs   zPipeListener._new_handlec Cs|j||jd}ytj|dd}Wn0tk r^}z|jtjkrNWdd}~XYn\XzrZ ERROR_NO_DATArprqrrsrrtrrrl)r7r8rurresrrvrrrrs"    zPipeListener.acceptcCs(td|x|D]}t|qWdS)Nz closing listener with address=%r)rrrnr)Zqueuer0r8rrrrs  z$PipeListener._finalize_pipe_listener)N)F) rhrirjrr;rr staticmethodrrrrrrus  rc Cst}x~y6t|dt|tjtjBdtjtjtjtj}Wn>t k r|}z |j tj tj fksjt |rlWdd}~XYqXPqWt|tjddt|S)zU Return a connection object connected to the pipe given by `address` irN)rrnZ WaitNamedPiperrrrrrr>rZERROR_SEM_TIMEOUTZERROR_PIPE_BUSYrrrrl)r0rhrrrrrs"   rs #CHALLENGE#s #WELCOME#s #FAILURE#cCsddl}t|ts$tdt|tt}| t || ||d }| d}||krl| tn| ttddS)Nrz Authkey must be bytes, not {0!s}md5zdigest received was wrong)hmacrrHr#formatr+rurandomMESSAGE_LENGTHrP CHALLENGEnewdigestrWWELCOMEFAILUREr) connectionrrmessagerresponserrrrs     rcCsddl}t|ts$tdt||d}|dtttksNt d||ttd}| ||d }| ||d}|t krtddS)Nrz Authkey must be bytes, not {0!s}rz message = %rrzdigest sent was rejected)rrrHr#rr+rWrIrrrrrrPrr)rrrrrrrrrrs     rc@s$eZdZddZddZddZdS)ConnectionWrappercCs:||_||_||_x"dD]}t||}t|||qWdS)N)rErBrbrWrP)_conn_dumps_loadsrsetattr)r7connrRr]attrrSrrrr;s   zConnectionWrapper.__init__cCs||}|j|dS)N)rrrP)r7rSrrrrrTs zConnectionWrapper.sendcCs|j}||S)N)rrWr)r7rrrrr_s zConnectionWrapper.recvN)rhrirjr;rTr_rrrrrsrcCst|fdddddS)Nrzutf-8) xmlrpclibrRencode)rSrrr _xml_dumpssrcCst|d\\}}|S)Nzutf-8)rr]decode)rrSmethodrrr _xml_loadssrc@seZdZddZdS) XmlListenercCs"ddlmat|}t|ttS)Nr) xmlrpc.clientclientrrrrrr)r7rSrrrr s  zXmlListener.acceptN)rhrirjrrrrrr srcOsddlmatt||ttS)Nr)rrrrrrr)rkwdsrrr XmlClients rcCst|}g}x|rt|d|}|tkr,Pn\t|krHtt|krVnn |t8}n2t|krrtt|krnn |t8}ntd|||||dd}d}qW|S)NFzShould not get hererr) listrnrpr r rIr rr)ZhandlesrLreadyrrrr_exhaustive_waits    rc sl|dkrt}n|dkrd}nt|dd}t|}ig}tt}zFx0|D]&}yt|d}Wn tk r||<YqTXyt|dd\}}Wn8t k r}zd|j }}|t krʂWdd}~XYnX|tj kr| |||j<qT|rntdddkrny|d \} }Wn*t k rT}z |j }Wdd}~XYnX|snt|d rnd|_|d}qTWt|}Wdx|D]}|qWx|D]}y|d\} }Wn6t k r}z|j }|t krWdd}~XYnX|tjkr|j}||dkrt|d rd|_qWXfd d |Dfd d|DS)z Wait till an object in object_list is ready/readable. Returns list of those objects in object_list which are ready/readable. Nrig?rET)rFryc3s|]}|VqdS)Nr).0r)waithandle_to_objrr |szwait..csg|]}|kr|qSrr)ro) ready_objectsrr }szwait..)rintrsetrAttributeErrorr3rnr}r>r _ready_errorsrorrqr&Zgetwindowsversionrtr(ryaddrkeysrsZERROR_OPERATION_ABORTEDupdate) object_listrZov_listZ ready_handlesrrErurvrrr)rrrr1sh              PollSelectorc Cstx}x|D]}||tjqW|dk r8t|}x@||}|rVdd|DS|dk r:|t}|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|]\}}|jqSr)Zfileobj)rkeyZeventsrrrrszwait..r) _WaitSelectorregister selectorsZ EVENT_READrrZselect)r rZselectorrSZdeadlinerrrrrs    c CsN|}t|tjtj*}ddlm}||}t||j |j ffSQRXdS)Nr)resource_sharer) rEr)ZfromfdrZ SOCK_STREAMrrZ DupSocketrebuild_connectionr9r:)rr8rrdsrrrreduce_connections   rcCs|}t|||S)N)rr)rr9r:ZsockrrrrsrcCsB|jr tjnd|jrtjndB}t||}t||j|jffS)Nr) r9rnZFILE_GENERIC_READr:ZFILE_GENERIC_WRITEr Z DupHandlerErebuild_pipe_connection)rrdhrrrreduce_pipe_connectionsrcCs|}t|||S)N)rrl)rr9r:r8rrrrsrcCs t|}t||j|jffS)N)r ZDupFdrErr9r:)rdfrrrrscCs|}t|||S)N)rr)rr9r:fdrrrrs)NN)T)T)N)N)I__all__rzrr&r)rrr itertoolsrrrrr contextr ZForkingPicklerrQrnr r r r ImportErrorr'rZCONNECTION_TIMEOUTcountr"rZfamiliesr(rrr%r*r1r2rlrobjectrrrrrrrrrrrrrrrrrrrrZERROR_NETNAME_DELETEDrrrr rZSelectSelectorrrrrrrrrr s           PJ=    ,, 8   P