B -_y@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)timeoutr0/usr/lib/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*cCsJt|tkrdSt|tkr*|dr*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)typetuplestr startswithr#)addressrrr address_type_s  r0c@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)r3_close)r6rrr__del__s z_ConnectionBase.__del__cCs|jdkrtddS)Nzhandle is closed)r3OSError)r6rrr _check_closeds z_ConnectionBase._check_closedcCs|jstddS)Nzconnection is write-only)r4r=)r6rrr_check_readablesz_ConnectionBase._check_readablecCs|jstddS)Nzconnection is read-only)r5r=)r6rrr_check_writablesz_ConnectionBase._check_writablecCs"|jrd|_n|tddS)NFzbad message length)r5r4closer=)r6rrr_bad_message_lengthsz#_ConnectionBase._bad_message_lengthcCs |jdkS)z True if the connection is closedN)r3)r6rrrclosedsz_ConnectionBase.closedcCs|jS)z"True if the connection is readable)r4)r6rrrr8sz_ConnectionBase.readablecCs|jS)z"True if the connection is writable)r5)r6rrrr9sz_ConnectionBase.writablecCs||jS)z+File descriptor or handle of the connection)r>r3)r6rrrfilenosz_ConnectionBase.filenocCs$|jdk r z |Wdd|_XdS)zClose the connectionN)r3r;)r6rrrrAs  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>r@ memoryviewitemsizebyteslenr# _send_bytes)r6bufoffsetsizemnrrr send_bytess"     z_ConnectionBase.send_bytescCs$|||t|dS)zSend a (picklable) objectN)r>r@rI_ForkingPicklerdumps)r6objrrrsendsz_ConnectionBase.sendcCsJ|||dk r(|dkr(td||}|dkrB||S)z7 Receive bytes data as a bytes object. Nrznegative maxlength)r>r?r# _recv_bytesrBgetvalue)r6Z maxlengthrJrrr 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?rErFrHr#rTtellr rUseekreadinto)r6rJrKrMrFZbytesizeresultrLrrrrecv_bytes_intos"       z_ConnectionBase.recv_bytes_intocCs&|||}t|S)zReceive a (picklable) object)r>r?rTrPloads getbuffer)r6rJrrrrecvsz_ConnectionBase.recvcCs||||S)z/Whether there is any input available to be read)r>r?_poll)r6rrrrpollsz_ConnectionBase.pollcCs|S)Nr)r6rrr __enter__sz_ConnectionBase.__enter__cCs |dS)N)rA)r6exc_type exc_valueexc_tbrrr__exit__sz_ConnectionBase.__exit__)TT)rN)N)r)r_)__name__ __module__ __qualname__r3r:r<r>r?r@rBpropertyrCr8r9rDrArOrSrVr[r^rarbrfrrrrr1rs(       r1c@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)r3)r6Z _CloseHandlerrrr;szPipeConnection._closec Cstj|j|dd\}}zHy,|tjkrBt|jgdt}|tksBtWn| YnXWd| d\}}X|dks|t|t |kstdS)NT) overlappedFr) _winapiZ WriteFiler3ERROR_IO_PENDINGWaitForMultipleObjectseventrr AssertionErrorcancelGetOverlappedResultrH)r6rJoverrwaitresZnwrittenrrrrIs   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)rlrz.shouldn't get here; expected KeyboardInterrupt)_got_empty_messageioBytesIOminrmReadFiler3rnrorprr rqrrrswriter]ZERROR_MORE_DATA_get_more_datar=winerrorERROR_BROKEN_PIPEEOFError RuntimeError) r6maxsizeZbsizertrurvZnreadferrrrT&s6     zPipeConnection._recv_bytescCs.|jst|jddkrdStt|g|S)NrT)rxrm PeekNamedPiper3boolr)r6rrrrr`FszPipeConnection._pollcCs|}t}||t|jd}|dks6t|dk rVt|||krV| tj |j|dd\}}| d\}}|dkst||kst|||S)NrrT)rl) r]ryrzr}rmrr3rqrHrBr|rs)r6rtrrJrleftruZrbytesrrrr~Ls    zPipeConnection._get_more_data)N) rgrhri__doc__rxrm CloseHandler;rIrTr`r~rrrrrk s rkc@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)r3)r6r;rrrr;cszConnection._closecCs||jdS)N)r3)r6r;rrrr;hscCs<t|}x.||j|}||8}|dkr(P||d}q WdS)Nr)rHr3)r6rJr} remainingrNrrr_sendms zConnection._sendcCsft}|j}|}xN|dkr`|||}t|}|dkrL||krDtntd||||8}qW|S)Nrzgot end of file during message)ryrzr3rHrr=r})r6rLreadrJr7rchunkrNrrr_recvvs    zConnection._recvcCsDt|}td|}|dkr2||||n|||dS)Nz!ii@)rHstructZpackr)r6rJrNheaderrrrrIs    zConnection._send_bytesNcCs:|d}td|\}|dk r0||kr0dS||S)Nz!i)rrZunpackrU)r6rrJrLrrrrTs  zConnection._recv_bytescCst|g|}t|S)N)rr)r6rrrrrr`s zConnection._poll)N)rgrhrirrm_multiprocessingZ closesocketr;rSZ_writer^Z_readrrAr}rrrrIrTr`rrrrr\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) r0default_familyr%r* PipeListener _listenerSocketListener isinstancerG TypeError_authkey)r6r/r$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)r6crrrrs    zListener.acceptcCs |j}|dk rd|_|dS)zA Close the bound socket or named pipe of `self`. N)rrA)r6ZlistenerrrrrAszListener.closecCs|jjS)N)r_address)r6rrrr/szListener.addresscCs|jjS)N)r_last_accepted)r6rrr last_acceptedszListener.last_acceptedcCs|S)Nr)r6rrrrbszListener.__enter__cCs |dS)N)rA)r6rcrdrerrrrfszListener.__exit__)NNrN) rgrhrirr:rrArjr/rrbrfrrrrrs   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) r0r* PipeClient SocketClientrrGrrr)r/r$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)r9)r8)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)rl)r9)r8)r%rmPIPE_ACCESS_DUPLEX GENERIC_READ GENERIC_WRITEBUFSIZEZPIPE_ACCESS_INBOUNDCreateNamedPipeFILE_FLAG_OVERLAPPEDFILE_FLAG_FIRST_PIPE_INSTANCEPIPE_TYPE_MESSAGEPIPE_READMODE_MESSAGE PIPE_WAITNMPWAIT_WAIT_FOREVERNULL CreateFile OPEN_EXISTINGSetNamedPipeHandleStateConnectNamedPipersrqrk) rr/ZopenmodeaccessZobsizeZibsizeZh1Zh2rl_rurrrrrr 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|_|dkrtj|tj|fdd|_nd|_dS)NposixrTrr)args exitpriority)r)getattr_socketrnameZ setsockoptZ SOL_SOCKETZ SO_REUSEADDRrZbindZlistenZ getsocknamerr=rAZ_familyrrFinalizeunlink_unlink)r6r/r$rrrrr:=s$       zSocketListener.__init__cCs&|j\}|_|dt|S)NT)rrrrrr)r6srrrrUs zSocketListener.acceptcCs0z|jWd|j}|dk r*d|_|XdS)N)rrAr)r6rrrrrAZs zSocketListener.closeN)r)rgrhrirr:rrArrrrr9s rc CsDt|}ttt|"}|d||t|SQRXdS)zO Return a connection object connected to the socket given by `address` TN)r0r)rrZconnectrr)r/r$rrrrrds   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_listenerrA)r6r/rrrrr:xszPipeListener.__init__Fc CsHtjtjB}|r|tjO}t|j|tjtjBtjBtj t t tj tj S)N) rmrrrrrrrrZPIPE_UNLIMITED_INSTANCESrrr)r6rflagsrrrrs   zPipeListener._new_handlec Cs|j||jd}ytj|dd}Wn0tk r^}z|jtjkrNWdd}~XYn\Xzt k r|}z |j tj tj fksjt |rlWdd}~XYqXPqWt|tjddt|S)zU Return a connection object connected to the pipe given by `address` irN)rrmZ WaitNamedPiperrrrrrr=rZERROR_SEM_TIMEOUTZERROR_PIPE_BUSYrrrrk)r/rhrrrrrs"   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)hmacrrGr#formatr+rurandomMESSAGE_LENGTHrO CHALLENGEnewdigestrVWELCOMEFAILUREr) 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)rrrGr#rr+rVrHrrqrrrOrr)rrrrrrrrrrs     rc@s$eZdZddZddZddZdS)ConnectionWrappercCs:||_||_||_x"dD]}t||}t|||qWdS)N)rDrArarVrO)_conn_dumps_loadsrsetattr)r6connrQr\attrrRrrrr:s   zConnectionWrapper.__init__cCs||}|j|dS)N)rrrO)r6rRrrrrrSs zConnectionWrapper.sendcCs|j}||S)N)rrVr)r6rrrrr^s zConnectionWrapper.recvN)rgrhrir:rSr^rrrrrsrcCst|fdddddS)Nrzutf-8) xmlrpclibrQencode)rRrrr _xml_dumpssrcCst|d\\}}|S)Nzutf-8)rr\decode)rrRmethodrrr _xml_loadssrc@seZdZddZdS) XmlListenercCs"ddlmat|}t|ttS)Nr) xmlrpc.clientclientrrrrrr)r6rRrrrr s  zXmlListener.acceptN)rgrhrirrrrrrsrcOsddlmatt||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) listrmror r rHr 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?rDT)rFrxc3s|]}|VqdS)Nr).0r)waithandle_to_objrr {szwait..csg|]}|kr|qSrr)ro) ready_objectsrr |szwait..)rintrsetrAttributeErrorr2rmr|r=r _ready_errorsrnrrpr&Zgetwindowsversionrsr(rxaddrkeysrrZERROR_OPERATION_ABORTEDupdate) object_listrZov_listZ ready_handlesrrDrtrurrr)rrrr0sh              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 rZselectorrRZdeadlinerrrrrs    c CsN|}t|tjtj*}ddlm}||}t||j |j ffSQRXdS)Nr)resource_sharer) rDr)ZfromfdrZ SOCK_STREAMrrZ DupSocketrebuild_connectionr8r9)rr7rrdsrrrreduce_connections   rcCs|}t|||S)N)rr)rr8r9ZsockrrrrsrcCsB|jr tjnd|jrtjndB}t||}t||j|jffS)Nr) r8rmZFILE_GENERIC_READr9ZFILE_GENERIC_WRITEr Z DupHandlerDrebuild_pipe_connection)rrdhrrrreduce_pipe_connectionsrcCs|}t|||S)N)rrk)rr8r9r7rrrrsrcCs t|}t||j|jffS)N)r ZDupFdrDrr8r9)rdfrrrrscCs|}t|||S)N)rr)rr8r9fdrrrrs)NN)T)T)N)N)I__all__ryrr&r)rrr itertoolsrrrrr contextr ZForkingPicklerrPrmr r r r ImportErrorr'rZCONNECTION_TIMEOUTcountr"rZfamiliesr(rrr%r*r0r1rkrobjectrrrrrrrrrrrrrrrrrrrrZERROR_NETNAME_DELETEDrrrr rZSelectSelectorrrrrrrrrr s           PJ=    ,+ 8   P