B
     S]                 @   s   d Z ddlmZ ddlZddlZdddgZdZdZdZdZd	d Z	d
d Z
dd Zdd Zdd Zdd Zdd ZeefddZeefddZdS )zPseudo terminal utilities.    )selectNopenptyforkspawn      c           	   C   s<   yt  S  ttfk
r    Y nX 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_fd r   lib/python3.7/pty.pyr      s    
c           	   C   sL   yt  \} }W n ttfk
r(   Y nX t |}t | | |fS t S )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   r   r	   r
   ttynamecloser   )r   r   r   r   r   r   master_open!   s    

r   c           
   C   sl   x^dD ]V} xPdD ]H}d|  | }yt |t j}W n tk
rH   wY nX |d|  | fS W qW tddS )z1Open pty master and return (master_fd, tty_name).ZpqrstuvwxyzPQRSTZ0123456789abcdefz/dev/ptyz/dev/ttyzout of pty devicesN)r   openO_RDWRr
   )xyZpty_namefdr   r   r   r   1   s    

r   c             C   sn   t | t j}yddlm}m} W n tk
r6   |S X y|||d |||d W n tk
rh   Y nX |S )zslave_open(tty_name) -> slave_fd
    Open the pty slave and acquire the controlling terminal, returning
    opened filedescriptor.
    Deprecated, use openpty() instead.r   )ioctlI_PUSHZptemZldterm)r   r   r   Zfcntlr   r   ImportErrorr
   )Ztty_nameresultr   r   r   r   r   r   =   s    r   c           	   C   s   yt  \} }W n ttfk
r(   Y n4X | tkrTyt   W n tk
rR   Y nX | |fS t \}}t  } | tkrt   t | t 	|t
 t 	|t t 	|t |tkrt | t t tt j}t | n
t | | |fS )zdfork() -> (pid, master_fd)
    Fork and make the child a session leader with a controlling terminal.)r   forkptyr	   r
   CHILDsetsidr   r   r   dup2STDIN_FILENOSTDOUT_FILENOSTDERR_FILENOr   r   r   )pidr   r   r   Ztmp_fdr   r   r   r   O   s0    



c             C   s&   x |r t | |}||d }qW dS )z#Write all the data to a descriptor.N)r   write)r   datanr   r   r   _writenw   s    r)   c             C   s   t | dS )zDefault read function.i   )r   read)r   r   r   r   _read}   s    r+   c             C   sz   | t g}xlt|g g \}}}| |krH|| }|s<||  ntt| t |kr
|t }|sh|t  q
t| | q
W dS )zParent copy loop.
    Copies
            pty master -> standard output   (master_read)
            standard input -> pty master    (stdin_read)N)r"   r   remover   r&   r#   r)   )r   master_read
stdin_readZfdsZrfdsZwfdsZxfdsr'   r   r   r   _copy   s    r/   c             C   s   t | t dkr| f} t \}}|tkr<tj| d f|   ytt}tt d}W n tj	k
rr   d}Y nX yt
||| W n( tk
r   |rtttj| Y nX t| t|dd S )zCreate a spawned process. r   r   )typer   r   r   execlpttyZ	tcgetattrr"   Zsetrawerrorr/   r
   Z	tcsetattrZ	TCSAFLUSHr   waitpid)argvr-   r.   r%   r   modeZrestorer   r   r   r      s$    




)__doc__r   r   r3   __all__r"   r#   r$   r   r   r   r   r   r   r)   r+   r/   r   r   r   r   r   <module>   s"   
(