
    F\h                         S r SSKJr  SSKrSSKrSSKrSSKJrJr  SSKJrJrJ	r	  / SQr
SrSrSrSrS	 rS
 rS rS rS rS r\\4S jr\\4S jrg)zPseudo terminal utilities.    )selectN)closewaitpid)setraw	tcgetattr	tcsetattr)openptyforkspawn      c                       [         R                  " 5       $ ! [        [        4 a     Of = f[	        5       u  p[        U5      nX4$ )z`openpty() -> (master_fd, slave_fd)
Open a pty master/slave pair, using os.openpty() if possible.)osr	   AttributeErrorOSError_open_terminal
slave_open)	master_fd
slave_nameslave_fds      /usr/lib/python3.13/pty.pyr	   r	      sH    zz|G$ *,I*%Hs    **c                      SSK n U R                  S[        SS9   [        R                  " 5       u  p[        R
                  " U5      n[        R                  " U5        X4$ ! [        [        4 a     [        5       $ f = f)zmaster_open() -> (master_fd, slave_name)
Open a pty master and return the fd, and the filename of the slave end.
Deprecated, use openpty() instead.r   NUse pty.openpty() instead.r   
stacklevel)
warningswarnDeprecationWarningr   r	   ttynamer   r   r   r   )r   r   r   r   s       r   master_openr    &   sw    
 MM.0BqMQ% jjl	 ZZ)

$$ G$  s   A! !A=<A=c                      S HF  n S H=  nSU -   U-   n [         R                  " U[         R                  5      nUSU -   U-   4s  s  $    MH     [        S5      e! [         a     M]  f = f)z1Open pty master and return (master_fd, tty_name).pqrstuvwxyzPQRST0123456789abcdefz/dev/ptyz/dev/ttyzout of pty devices)r   openO_RDWRr   )xypty_namefds       r   r   r   9   su    #A!A~)HWWXryy1 
Q*++ $   &
''  s   %A
A&%A&c                     SSK nUR                  S[        SS9  [        R                  " U [        R
                  5      n SSKJnJn   U" X$S5        U" X$S5        U$ ! [         a    Us $ f = f! [         a     U$ f = f)	zslave_open(tty_name) -> slave_fd
Open the pty slave and acquire the controlling terminal, returning
opened filedescriptor.
Deprecated, use openpty() instead.r   Nr   r   r   )ioctlI_PUSHptemldterm)r   r   r   r   r$   r%   fcntlr+   r,   ImportErrorr   )tty_namer   resultr+   r,   s        r   r   r   E   s     MM.0BqMQWWXryy)F'ff%fh' M  
  Ms$    A 	A/ A,+A,/
A=<A=c                      [         R                  " 5       u  pU [        :X  a   [         R                  " 5         X4$ X4$ ! [         a     X4$ f = f! [
        [        4 a     Of = f[        5       u  p#[         R                  " 5       n U [        :X  a/  [         R                  " U5        [         R                  " U5        X4$ [         R                  " U5        X4$ )z`fork() -> (pid, master_fd)
Fork and make the child a session leader with a controlling terminal.)
r   forkptyCHILDsetsidr   r   r	   r
   r   	login_tty)pidr)   r   r   s       r   r
   r
   Z   s    **, %<		 wsw  w G$  ")I
'')C
e|

X
 > 	 >s    A ? 
AAA$#A$c                 0    [         R                  " U S5      $ )zDefault read function.i   )r   read)r)   s    r   _readr;   v   s    772t    c                    [         R                  " U 5      (       a:  [         R                  " U S5         [        XUS9  [         R                  " U S5        gSnU [        :g  nU [
        :g  nSnSn / n/ n	U(       a$  [        U5      U:  a  UR                  [        5        U(       a   [        U5      U:  a  UR                  U 5        U(       a$  [        U5      S:  a  U	R                  [
        5        [        U5      S:  a  U	R                  U 5        [        X/ 5      u  pn
[
        U	;   a    [         R                  " [
        U5      nX{S nX;   a   U" U 5      nU(       d  gX|-  nX	;   a  [         R                  " X5      nXkS nU(       a$  [        U;   a  U" [        5      nU(       d  SnOXl-  nGMA  ! [         R                  " U S5        f = f! [         a    Sn Nf = f! [         a    Sn Nf = f)zParent copy loop.
Copies
        pty master -> standard output   (master_read)
        standard input -> pty master    (stdin_read)F)master_read
stdin_readTNi   r<   r   )r   get_blockingset_blocking_copySTDIN_FILENOSTDOUT_FILENOlenappendr   writer   )r   r>   r?   high_waterlevelstdin_availstdout_availi_bufo_bufrfdswfds_xfdsndatas                r   rB   rB   z   s   
 
y!! 		5)	-)L OOIt,O|+K-LEE
3u:7KK%CJ8KK	"CJNKK&u:>KK	""4r2ED %HH]E2b	 "9- ME*A"IE<4/l+D#U  OOIt,2  %$%  s/   
F0 *G G 0G	GGG-,G-c                 ,   [        U [        5      (       a  U 4n [        R                  " SU 5        [	        5       u  p4U[
        :X  a  [        R                  " U S   /U Q76    [        [        5      n[        [        5        Sn [        XAU5        U(       a  [        [        [        R                  W5        [!        U5        [#        US5      S   $ ! [        R                   a    Sn Nef = f! U(       a   [        [        [        R                  W5        f f = f)zCreate a spawned process.z	pty.spawnr   TFr   )
isinstancestrsysauditr
   r5   r   execlpr   rC   r   ttyerrorrB   r   	TCSAFLUSHr   r   )argvr>   r?   r8   r   moderestores          r   r   r      s    $wIIk4 VNC
e|
		$q'!D!&|9ij1lCMM48	)3?1 99  lCMM48 s   ! C C* C'&C'*)D)__doc__r   r   rU   rX   r   r   r   r   r   __all__rC   rD   STDERR_FILENOr5   r	   r    r   r   r
   r;   rB   r    r<   r   <module>rb      sq       	 
 
  , ,
&	
&
(*8 "'5 ?B "e r<   