
    hG                        S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKrSSKrSSKJrJrJr  SSKJrJr  \R(                  " S5      R*                  rS\SS4S jrSr\R2                  " \5      rS	r " S
 S\R:                  5      r " S S\R>                  5      r  " S S5      r! " S S\\RD                  5      r" " S S\5      r# " S S5      r$g)zKBi-directional asyncio.Transport implementations based on file descriptors.    N)AnyClassVarSequence   )
JsonObjectget_intargsreturnc                  2    [        U 6 S:w  a  [        S5      eg )Nr   zprctl() failed)	sys_prctlOSError)r	   s    4/usr/lib/python3/dist-packages/cockpit/transports.pyprctlr   '   s     $1&''     i   c                   D  ^  \ rS rSr% Sr\\   \S'   \R                  \S'   \R                  \S'   S\S'   \\S'   \\S	'   \\S
'   \\S'   \\S'   Sr\\S'     S0S\R                  S\R                  S\S\SS4
U 4S jjjrS1S jrS\4S jrS1S jrS1S jrS1S jrS1S jrS2S3S jjrS\4S jrS1S  jrS\4S! jrS4S" jrS5S6S# jjrS1S$ jrS1S% jrS1S& jrS'\SS4S( jrS'\SS4S) jrS1S* jr S\RB                  4S+ jr"S\4S, jr#S\RB                  SS4S- jr$S1S. jr%S/r&U =r'$ )7
_Transport3   i   
BLOCK_SIZE_loop	_protocolzcollections.deque[bytes] | None_queue_in_fd_out_fd_closing_is_reading_eofF_eio_is_eofNloopprotocolin_fdout_fdextrazdict[str, object] | Nonec                 v  > [         TU ]  U5        Xl        X l        [        R                  SXX45        S U l        SU l        SU l        SU l	        X0l
        X@l        [        R                  " US5        XC:w  a  [        R                  " US5        U R                  R                  U 5        U R                  5         g )Nz/Created transport %s for protocol %s, fds %d %dF)super__init__r   r   loggerdebugr   r   r   r   r   r   osset_blockingconnection_maderesume_reading)selfr   r   r    r!   r"   	__class__s         r   r%   _Transport.__init__B   s    
 	
!FX]f 	
u%?OOFE*&&t,r   r
   c                    [         R                  SX R                  U R                  5         [        R
                  " U R                  [        R                  5      nUS:w  a;  [         R                  S[        U5      5        U R                  R                  U5        g [         R                  S5        U R!                  5         U R                  R#                  5       nU(       d  U R%                  5         g g ! [         a     g [         aQ  nU R                  (       a%  UR                  [        R                  :X  a  Sn S nANU R                  U5         S nAg S nAff = f)NzRead ready on %s %s %dr   z  read %d bytesz	  got EOF)r&   r'   r   r   r(   readr   r   BlockingIOErrorr   r   errnoEIOabortlendata_received_close_readereof_receivedclose)r,   dataexc	keep_opens       r   _read_ready_Transport._read_ready]   s    -t^^T[[Q	774;;
(=(=>D 3;LL*CI6NN((.LL% 335I

 %  	 	CII$: 

3	s#   /C5 5
E	E
1E EEc                     U R                   $ N)r   r,   s    r   
is_reading_Transport.is_readingv       r   c                 2    U R                  5         SU l        g N)pause_readingr   rA   s    r   r7   _Transport._close_readery   s    r   c                     U R                   (       a-  U R                  R                  U R                  5        SU l         g g NF)r   r   remove_readerr   rA   s    r   rH   _Transport.pause_reading}   s.    JJ$$T[[1$D r   c                     U R                   (       dI  U R                  S:w  a8  U R                  R                  U R                  U R                  5        SU l         g g g )NrG   T)r   r   r   
add_readerr=   rA   s    r   r+   _Transport.resume_reading   sF     DKK2$5JJ!!$++t/?/?@#D %6r   c                     g r@    rA   s    r   _close_Transport._close   s    r   c                     SU l         U R                  5         U R                  5         U R                  R	                  U R
                  R                  U5        U R                  5         g NT)r   r7   _remove_write_queuer   	call_soonr   connection_lostrS   )r,   r;   s     r   r4   _Transport.abort   sH      "

T^^;;SAr   c                     [         er@   NotImplementedErrorrA   s    r   can_write_eof_Transport.can_write_eof       !!r   c                     U R                   (       a   eSU l         U R                  c'  [        R                  SU 5        U R	                  5         g [        R                  SU 5        g )NTz%s got EOF.  closing backend.z,%s got EOF.  bytes in queue, deferring close)r   r   r&   r'   _write_eof_nowrA   s    r   	write_eof_Transport.write_eof   sI    99}	;;LL8$?!LLGNr   c                 V    U R                   c  g[        S U R                    5       5      $ )Nr   c              3   8   #    U  H  n[        U5      v   M     g 7fr@   )r5   ).0blocks     r   	<genexpr>3_Transport.get_write_buffer_size.<locals>.<genexpr>   s     7;%3u::;s   )r   sumrA   s    r   get_write_buffer_size _Transport.get_write_buffer_size   s$    ;;74;;777r   c                     g)N)r   r   rR   rA   s    r   get_write_buffer_limits"_Transport.get_write_buffer_limits   s    r   c                 2    Ub  US:X  d   eUb	  US:X  d   eg g Nr   rR   )r,   highlows      r   set_write_buffer_limits"_Transport.set_write_buffer_limits   s(    |tqy(({cQh&&h{r   c                     [         er@   r\   rA   s    r   rb   _Transport._write_eof_now   r`   r   c                 |   [         R                  SU 5        U R                  c   e [        R                  " U R
                  U R                  5      n[         R                  SU5        U(       a  U R                  R                  5       n[        U5      U:  a3  [         R                  S5        U R                  R                  X1S  5        O-U[        U5      -  n[         R                  SU5        U(       a  M  U R                  (       d~  [         R                  S5        U R                  5         U R                  (       a%  [         R                  S5        U R                  5         U R                  (       a  U R                  5         g g g ! [         a    Sn GNE[         a  nU R                  U5         S nAg S nAff = f)Nz%s _write_readyr   z,  successfully wrote %d bytes from the queuez  incomplete block.  Stop.z&  removed complete block.  %d remains.z%s queue drained.z'%s queue drained.  closing backend now.)r&   r'   r   r(   writevr   r1   r   r4   popleftr5   
appendleftrW   r   rb   r   )r,   n_bytesr;   rh   s       r   _write_ready_Transport._write_ready   sC   &-{{&&&	iidkk:G 	CWMKK'')E5zG#9:&&uX7s5z!GLLA7K g {{LL,-$$&yyFG##%}}

  %  	G 	JJsO	s   +F F;	F; F66F;c                     U R                   bG  U R                  R                  5         U R                  R	                  U R
                  5        S U l         g g r@   )r   r   resume_writingr   remove_writerr   rA   s    r   rW   _Transport._remove_write_queue   s>    ;;"NN))+JJ$$T\\2DK #r   r:   c                 .   [         R                  SX R                  5        U R                  b   eU R                  R                  U R                  U R                  5        [        R                  " U45      U l        U R                  R                  5         g )Nz!%s creating write queue for fd %s)r&   r'   r   r   r   
add_writerr~   collectionsdequer   pause_writingr,   r:   s     r   _create_write_queue_Transport._create_write_queue   sg    8$M{{"""

dllD,=,=>!''0$$&r   c                    U R                   (       a!  [        R                  SU R                  5        g U R                  (       a   eU R
                  b  U R
                  R                  U5        [        U R
                  5      [        :  aP  SR                  U R
                  5      nU R
                  R                  5         U R
                  R                  U5        g  [        R                  " U R                  U5      nU[        U5      :w  a  U R!                  XS  5        g g ! [         a    Sn N2[         a  nU R                  U5         S nAg S nAff = f)Nz+ignoring write() to closing transport fd %ir   r   )r   r&   r'   r   r   r   appendr5   IOV_MAXjoinclearr(   writer1   r   r4   r   )r,   r:   all_datar}   r;   s        r   r   _Transport.write   s     ==LLFU99};;"KKt$ 4;;')88DKK0!!#""8,	hht||T2G c$i$$T(^4    	G 	JJsO	s   !D" "E0	E9EEc                     U R                   (       a  g SU l         U R                  5         U R                  b  g U R                  5         g rV   )r   r7   r   r4   rA   s    r   r9   _Transport.close   s5    ==;;"

r   c                     U R                   $ r@   )r   rA   s    r   get_protocol_Transport.get_protocol
  s    ~~r   c                     U R                   $ r@   )r   rA   s    r   
is_closing_Transport.is_closing  s    }}r   c                     [         er@   r\   )r,   r   s     r   set_protocol_Transport.set_protocol  r`   r   c                 $    U R                  5         g r@   )rS   rA   s    r   __del___Transport.__del__  s    r   )r   r   r   r   r   r   r   r   )rG   rG   Nr
   Nr@   )r;   zException | Noner
   N)r
   ztuple[int, int])NN)rs   
int | Nonert   r   r
   N)(__name__
__module____qualname____firstlineno__r   r   int__annotations__asyncioAbstractEventLoopProtocolboolr   r%   r=   rB   r7   rH   r+   rS   r4   r^   rc   rl   ro   ru   rb   r~   rW   bytesr   r   r9   BaseProtocolr   r   r   r   __static_attributes____classcell__r-   s   @r   r   r   3   sp    +J+ $$$--KLN
JK
 1359	00"++  +. 3	 62 D  %
$"t "O8s 8
'"B' '$ '5% 5D 5@g22 D "W%9%9 "d " r   r   c                   "    \ rS rSrSrSS jrSrg)SubprocessProtocoli  zBAn extension to asyncio.Protocol for use with SubprocessTransport.Nc                     [         e)z"Called when subprocess has exited.r\   rA   s    r   process_exited!SubprocessProtocol.process_exited  s    !!r   rR   r   )r   r   r   r   __doc__r   r   rR   r   r   r   r     s
    L"r   r   c                   "    \ rS rSrS\4S jrSrg)
WindowSizei  valuec                 H    [        US5      U l        [        US5      U l        g )Nrowscols)r   r   r   )r,   r   s     r   r%   WindowSize.__init__  s    E6*	E6*	r   )r   r   N)r   r   r   r   r   r%   r   rR   r   r   r   r     s    +j +r   r   c                   r  ^  \ rS rSr% SrSrS\S'   SrS\S'   SrS\S'   S	\S
'   SS.S\	S\
4S jjrS(S jrSSS.S\R                  S\S\\
   S\	SSS\4U 4S jjjrS\SS4S jrS\	4S jrS)S jrS\4S jrS*S jrS \S\R4                  4S! jrS"\R:                  SS4S# jrS)S$ jrS)S% jr S)S& jr!S'r"U =r#$ )+SubprocessTransporti$  a  A bi-directional transport speaking with stdin/out of a subprocess.

Note: this is not really a normal SubprocessTransport.  Although it
implements the entire API of asyncio.SubprocessTransport, it is not
designed to be used with asyncio.SubprocessProtocol objects.  Instead, it
pair with normal Protocol objects which also implement the
SubprocessProtocol defined in this module (which only has a
process_exited() method).  Whatever the protocol writes is sent to stdin,
and whatever comes from stdout is given to the Protocol via the
.data_received() function.

If stderr is configured as a pipe, the transport will separately collect
data from it, making it available via the .get_stderr() method.
Nr   _pty_fdzsubprocess.Popen[bytes] | None_process_returncodezSpooler | None_stderrFresetr   r
   c                j    U R                   b&  U R                   R                  US9R                  SS9$ g)Nr   replace)errors )r   getdecode)r,   r   s     r   
get_stderrSubprocessTransport.get_stderr9  s5    <<#<<##%#077y7IIr   c                   ^ ^^^ SU 4S jjmSUUUU 4S jjnS[         S[         SS 4UUU 4S jjn [        R                  " TR                  5      mT R                  R                  TU5        g ! [        [        4 a    Sn[        T R                  US 5      nUcF  [        R                  " 5       nUR                  T R                  5        [        T R                  XE5        UR                  TR                  U5         g f = f)	Nr
   c                     > [        T R                  [        5      (       d   e[        R	                  ST R
                  5        T R                  (       d  T R                  R                  5         g g )NzProcess exited with status %d)
isinstancer   r   r&   r'   r   r   r   rA   s   r   	flag_exit1SubprocessTransport.watch_exit.<locals>.flag_exit@  sL    dnn.@AAAALL8$:J:JK==--/ !r   c                  F  > [         R                  " TR                  S5      u  pU TR                  :X  d   e [         R                  " U5      Tl        TR                  R                  T5        [         R                  " T5        T" 5         g ! [
         a
    UTl         NLf = frr   )	r(   waitpidpidwaitstatus_to_exitcoder   
ValueErrorr   rL   r9   )r   statusr   pidfdprocessr,   s     r   pidfd_ready3SubprocessTransport.watch_exit.<locals>.pidfd_readyF  s    **W[[!4KC'++%%%*#%#<#<V#D  JJ$$U+HHUOK	  *#) *s   B B B r   codec                 F   > TR                   U :X  d   eUTl        T" 5         g r@   )r   r   )r   r   r   r   r,   s     r   child_watch_fired9SubprocessTransport.watch_exit.<locals>.child_watch_firedQ  s"    ;;#%%%#DKr   !_cockpit_transports_child_watcherr   )r   r(   
pidfd_openr   r   rO   AttributeErrorr   getattrr   SafeChildWatcherattach_loopsetattradd_child_handler)r,   r   r   r   quarkwatcherr   r   s   ``    @@r   
watch_exitSubprocessTransport.watch_exit?  s    	0		 			3 	c 	d 	 		FMM'++.EJJ!!%5( 		F7Edjj%6G!224##DJJ/

E3%%gkk3DE		Fs   <A. .BC?>C?)ptywindowr   r   r	   r   r   zWindowSize | Nonekwargsc                  >^ SU4S jjnT(       a  [         R                  " 5       u  U l        nUb  U R                  U5        XS'   [        R
                  " U4XUSS.UD6U l        [         R                  " U5        U R                  U R                  pSU l        O[        R
                  " U4[        R                  [        R                  US.UD6U l        U R                  R                  (       d   eU R                  R                  (       d   eU R                  R                  R                  5       n	U R                  R                  R                  5       n
U R                  R                  b3  [        XR                  R                  R                  5       5      U l        OS U l        [         TU ]E  XX5        U R%                  U R                  5        g )Nc                     > [        [        [        R                  5        T (       a'  [        R
                  " S[        R                  S5        g g rr   )r   SET_PDEATHSIGsignalSIGTERMfcntlioctltermios	TIOCSCTTY)r   s   r   
preexec_fn0SubprocessTransport.__init__.<locals>.preexec_fnt  s/    -0Aw00!4 r   stderrT)stdinstdoutr   start_new_session)r   r   r   r   )r(   openptyr   set_window_size
subprocessPopenr   r9   r   PIPEr   r   filenor   Spoolerr   r$   r%   r   )r,   r   r   r	   r   r   r   r   
session_fdr    r!   r-   s       `      r   r%   SubprocessTransport.__init__j  sp   	5
 ')zz|$DL*!$$V,)8&,,T f3=8BVZf^dfDM HHZ  LL$,,6#D ',,T NQ[Q`Q`8BNFLNDM==&&&&==''''MM((//1E]]((//1F==+"4)=)=)D)D)FGDLDL7&r   sizec           	          U R                   c   e[        R                  " U R                   [        R                  [
        R                  " SUR                  UR                  5      5        g )N2H4x)	r   r   r   r   
TIOCSWINSZstructpackr   r   )r,   r
  s     r   r  #SubprocessTransport.set_window_size  sD    ||'''DLL'"4"4fkk&$))UYU^U^6_`r   c                 P    U R                   c   eU R                   R                  S L$ r@   )r   r   rA   s    r   r^   !SubprocessTransport.can_write_eof  s'    }}(((}}""$..r   c                     U R                   c   eU R                   R                  c   eU R                   R                  R                  5         SU l        g rF   )r   r   r9   r   rA   s    r   rb   "SubprocessTransport._write_eof_now  sE    }}(((}}""...!!#r   c                 L    U R                   c   eU R                   R                  $ r@   )r   r   rA   s    r   get_pidSubprocessTransport.get_pid  s"    }}(((}}   r   c                     U R                   $ r@   )r   rA   s    r   get_returncode"SubprocessTransport.get_returncode  rD   r   fdc                     [         er@   r\   )r,   r  s     r   get_pipe_transport&SubprocessTransport.get_pipe_transport  r`   r   sigc                    U R                   c   eU R                  b+  [        R                  SXR                   R                  5        g  [
        R                  " U R                   R                  U5        [        R                  SXR                   R                  5        g ! [         a-    [        R                  SXR                   R                  5         g f = f)Nz3won't attempt %s to process %i.  It exited already.zsent %s to process %iz3can't send %s to process %i.  It's exited just now.)r   r   r&   r'   r   r(   killProcessLookupError)r,   r  s     r   send_signalSubprocessTransport.send_signal  s    }}((( 'LLNPSUbUbUfUfg	hGGDMM%%s+LL0#}}7H7HI! 	hLLNPSUbUbUfUfg	hs   	AB 4CCc                 B    U R                  [        R                  5        g r@   )r#  r   r   rA   s    r   	terminateSubprocessTransport.terminate      (r   c                 B    U R                  [        R                  5        g r@   )r#  r   SIGKILLrA   s    r   r!  SubprocessTransport.kill  r(  r   c                    U R                   b'  [        R                  " U R                   5        S U l         U R                  b^  U R                  R                  b5  U R                  R                  R                  5         S U R                  l         U R                  5         g g ! [         a-    [        R                  SU R                  R                  5         g f = f)Nzcan't kill %i due to EPERM)
r   r(   r9   r   r   r&  PermissionErrorr&   r'   r   rA   s    r   rS   SubprocessTransport._close  s    <<#HHT\\"DL==$}}"".##))+&*#N  % # N94==;L;LMNs   B! !4CC)r   r   r   r   r   r   )r   zsubprocess.Popen[bytes]r
   Nr   )r
   r   )$r   r   r   r   r   r   r   r   r   r   strr   r   r   r   r   r   r   r%   r   r  r^   rb   r   r  r  	Transportr  r   Signalsr#  r&  r!  rS   r   r   r   s   @r   r   r   $  s"    !G\ 15H.5 $K$*/ 4 C )F` #/3,'00,'-,'  },'
 ,' -,' ,' ,'\aJ a4 a/t /! ! "S "W->-> "hv~~ h$ h0))N Nr   r   c            	          ^  \ rS rSrSrSS\R                  S\R                  S\S\4U 4S jjjr	S\
4S	 jrSS
 jrSrU =r$ )StdioTransporti  zA bi-directional transport that corresponds to stdin/out.

Can talk to just about anything:
    - files
    - pipes
    - character devices (including terminals)
    - sockets
r   r   r   r   c                 &   > [         TU ]  XX45        g r@   )r$   r%   )r,   r   r   r   r   r-   s        r   r%   StdioTransport.__init__  s    7r   r
   c                     grK   rR   rA   s    r   r^   StdioTransport.can_write_eof  s    r   c                     [        S5      e)NzCan't write EOF to stdout)RuntimeErrorrA   s    r   rb   StdioTransport._write_eof_now  s    677r   rR   )r   r   r   )r   r   r   r   r   r   r   r   r   r%   r   r^   rb   r   r   r   s   @r   r3  r3    sR    8W66 8'BRBR 8[^ 8lo 8 8t 8 8r   r3  c                       \ rS rSr% Sr\R                  \S'   \\S'   S\S'   S\R                  S\4S	 jr	SS jr
S
\4S jrSS.S\S
\4S jjrSS jrSS jrSrg)r  i  zConsumes data from an fd, storing it in a buffer.

This makes a copy of the fd, so you don't have to worry about holding it
open.
r   _fdzlist[bytes]	_contentsr   r  c                     Xl         SU l        / U l        [        R                  " U5      U l        [        R
                  " U R                  S5        UR                  U R                  U R                  5        g )NrG   F)r   r<  r=  r(   dupr)   rO   r=   )r,   r   r  s      r   r%   Spooler.__init__  sN    
66":
%($"2"23r   r
   Nc                      [         R                  " U R                  S5      nUS:w  a  U R
                  R                  U5        g U R                  5         g ! [         a     g [         a    Sn NLf = f)Ni    r   )r(   r0   r<  r1   r   r=  r   r9   r   s     r   r=   Spooler._read_ready  s`    	77488T*D 3;NN!!$'JJL  	 	D	s   !A 
A0"A0/A0c                 x    U R                   S:X  a  g[        R                  " U R                   // / S5      / / / 4:g  $ )NrG   Fr   )r<  selectrA   s    r   	_is_readySpooler._is_ready  s6    88r>}}dhhZR3B|CCr   Fr   r   c                    U R                  5       (       a'  U R                  5         U R                  5       (       a  M'  SR                  U R                  5      nU(       a  / U l        U$ )Nr   )rE  r=   r   r=  )r,   r   results      r   r   Spooler.get  sM    nn nn $..)DNr   c                     U R                   S:w  aM  U R                  R                  U R                   5        [        R                  " U R                   5        SU l         g g rF   )r<  r   rL   r(   r9   rA   s    r   r9   Spooler.close"  s?    88r>JJ$$TXX.HHTXXDH r   c                 $    U R                  5         g r@   )r9   rA   s    r   r   Spooler.__del__(  s    

r   )r=  r<  r   r   )r   r   r   r   r   r   r   r   r   r%   r=   r   rE  r   r   r9   r   r   rR   r   r   r  r    sn     $$$	H4W66 4C 4D4 D
 $) D U r   r  )%r   r   r   ctypesr2   r   loggingr(   rD  r   r  r  r   typingr   r   r   jsonutilr   r   CDLLr   r   r   r   	getLoggerr   r&   r   r0  r   r   r   r   r   r3  r  rR   r   r   <module>rT     s   $ R       	      * * )KK##	( ( (
  
		8	$
a"" aH")) "+ +vN*g&A&A vNr8Z 8(8 8r   