U
    pd                     @   s   d Z ddlmZ ddl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>   z
t  W 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   /usr/lib/python3.8/pty.pyr      s    

c               	   C   sL   z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   sn   dD ]\} dD ]R}d|  | }zt |t j}W n tk
rF   Y qY nX |d|  | f    S q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   2   s    
r   c                 C   sr   t | t j}zddlm}m} W n tk
r:   | Y S X z|||d |||d W n tk
rl   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   zt  \} }W n ttfk
r(   Y n4X | tkrTz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   P   s0    



c                 C   s"   |rt | |}||d }q dS )z#Write all the data to a descriptor.N)r   write)r   datanr   r   r   _writenx   s    r)   c                 C   s   t | dS )zDefault read function.i   )r   read)r   r   r   r   _read~   s    r+   c                 C   sv   | t g}t|g g \}}}| |krF|| }|s:||  ntt| t |kr|t }|sf|t  qt| | q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d|  t \}}|tkrHtj| d f|   ztt	}t
t	 d}W n tjk
r~   d}Y nX zt||| W n( tk
r   |rtt	tj| Y nX t| t|dd S )zCreate a spawned process. z	pty.spawnr   r   )typesysauditr   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   r2   r5   __all__r"   r#   r$   r   r   r   r   r   r   r)   r+   r/   r   r   r   r   r   <module>   s$   
(