
    Rh                         d Z ddlmZ ddlZddlZddlZddlmZmZ ddlmZmZm	Z	 g dZ
dZdZdZdZd	 Zd
 Zd Zd Zd Zd ZeefdZeefdZy)zPseudo terminal utilities.    )selectN)closewaitpid)setraw	tcgetattr	tcsetattr)openptyforkspawn      c                      	 t        j                         S # t        t        f$ r Y nw xY wt	               \  } }t        |      }| |fS )zdopenpty() -> (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.12/pty.pyr	   r	      sL    zz|G$ *,Iz*%Hhs    ((c                     ddl } | j                  dt        d       	 t        j                         \  }}t        j
                  |      }t        j                  |       ||fS # t        t        f$ r Y t               S w xY w)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    &   s{    
 MM.0BqMQ% jjl	8 ZZ)

*$$ G$  s   A# #A>=A>c                      dD ]C  } dD ]<  }d| z   |z   }	 t        j                  |t         j                        }|d| z   |z   fc c S  E t        d      # t        $ r Y Ww xY w)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   s     ,# 	,A!A~)HWWXryy1 
Q*++	,, &
''  s   $A	A A c                    ddl }|j                  dt        d       t        j                  | t        j
                        }	 ddlm}m} 	  |||d        |||d       |S # t        $ r |cY S w xY w# t        $ r Y |S w xY w)	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'fff%ffh' M  
  Ms$   A! A2 !A/.A/2	A?>A?c                     	 t        j                         \  } }| t        k(  r	 t        j                          | |fS | |fS # t        $ r Y | |fS w xY w# t
        t        f$ r Y nw xY wt               \  }}t        j                         } | t        k(  r.t        j                  |       t        j                  |       | |fS t        j                  |       | |fS )zdfork() -> (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    **,R %<		 BwsBw  Bw G$  ")Ix
'')C
e|

X
 	> 	 	>s    A ? 	AAA#"A#c                 .    t        j                  | d      S )zDefault read function.i   )r   read)r)   s    r   _readr;   v   s    772t    c                    t        j                  |       r<t        j                  | d       	 t        | ||       t        j                  | d       yd}| t        k7  }| t
        k7  }d}d}	 g }g }	|r#t        |      |k  r|j                  t               |rt        |      |k  r|j                  |        |r#t        |      dkD  r|	j                  t
               t        |      dkD  r|	j                  |        t        ||	g       \  }}	}
t
        |	v r 	 t        j                  t
        |      }||d }| |v r	  ||       }|sy||z  }| |	v rt        j                  | |      }||d }|rt        |v r |t              }|sd}n||z  }# t        j                  | d       w xY w# t        $ r d}Y ~w xY w# t        $ r d}Y w xY w)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	""4r2dED %HH]E2ab	 "9- TMEE*A!"IE<4/l+D#U  OOIt,2  %$%  s/   F F# 7F4 F #F10F14GGc                    t        | t              r| f} t        j                  d|        t	               \  }}|t
        k(  rt        j                  | d   g|   	 t        t              }t        t               d}	 t        |||       |r t        t        t        j                         	 t!        |       t#        |d      d   S # t        j                  $ r d}Y aw xY w# |r t        t        t        j                         w w xY w)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ij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<   