U
    -¿áfÇ  ã                   @   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 )z›master_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 )z©slave_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rÞt  ¡  t  |¡ t  	|t
¡ t  	|t¡ t  	|t¡ |tkr¾t  |¡ 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¸   |r´t 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$   
(