3 \��@s�dZddlmZddlZddlZdddgZdZdZdZdZd d�Z d d �Z d d �Z dd�Z dd�Z dd�Zdd�Zeefdd�Zeefdd�ZdS)zPseudo terminal utilities.�)�selectN�openpty�fork�spawn��c Cs<ytj�Sttfk r YnXt�\}}t|�}||fS)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/lib64/python3.6/pty.pyrs c CsLytj�\}}Wnttfk r(YnXtj|�}tj|�||fSt�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.)rrr r �ttyname�closer )r rrrrr� master_open!s  rc Cslx^dD]V}xPdD]H}d||}ytj|tj�}Wntk rHwYnX|d||fSWqWtd��dS)z1Open pty master and return (master_fd, tty_name).ZpqrstuvwxyzPQRSTZ0123456789abcdefz/dev/ptyz/dev/ttyzout of pty devicesN)r�open�O_RDWRr )�x�yZpty_name�fdrrrr 1s   r cCsntj|tj�}yddlm}m}Wntk r6|SXy|||d�|||d�Wntk rhYnX|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_PUSHZptemZldterm)rrrZfcntlrr� ImportErrorr )Ztty_name�resultrrrrrr =s r cCs�ytj�\}}Wnttfk r(Yn4X|tkrTy tj�Wntk rRYnX||fSt�\}}tj�}|tkr�tj�tj|�tj |t �tj |t �tj |t �|t kr�tj|�tj tjt �tj�}tj|�n tj|�||fS)zdfork() -> (pid, master_fd) Fork and make the child a session leader with a controlling terminal.)r�forkptyr r �CHILD�setsidrrr�dup2� STDIN_FILENO� STDOUT_FILENO� STDERR_FILENOrrr)�pidrr rZtmp_fdrrrrOs0         cCs&x |r tj||�}||d�}qWdS)z#Write all the data to a descriptor.N)r�write)r�data�nrrr�_writenws r)cCs tj|d�S)zDefault read function.i)r�read)rrrr�_read}sr+cCsz|tg}xlt|gg�\}}}||krH||�}|s<|j|�n tjt|�t|kr |t�}|sh|jt�q t||�q WdS)z�Parent copy loop. Copies pty master -> standard output (master_read) standard input -> pty master (stdin_read)N)r"r�removerr&r#r))r � master_read� stdin_readZfdsZrfdsZwfdsZxfdsr'rrr�_copy�s   r/cCs�t|�td�kr|f}t�\}}|tkrs"    (