U if @ s d Z ddlmZ ddlZddlZddlZdddgZdZdZdZdZ d d Z d d Zdd Zdd Z dd Zdd Zdd ZeefddZeefddZdS )zPseudo terminal utilities. )selectNopenptyforkspawn c C s> z t W S ttfk r" Y nX t \} }t|}| |fS )zdopenpty() -> (master_fd, slave_fd) Open a pty master/slave pair, using os.openpty() if possible.)osr AttributeErrorOSError_open_terminal slave_open) master_fd slave_nameslave_fd r (/opt/alt/python38/lib64/python3.8/pty.pyr s c C sL zt \} }W n ttfk r( Y nX t |}t | | |fS 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 ttynamecloser )r r r r r r master_open" s r c C sn dD ]\} dD ]R}d| | }zt |t j}W n tk rF Y qY nX |d| | f S qtddS )z1Open pty master and return (master_fd, tty_name).ZpqrstuvwxyzPQRSTZ0123456789abcdefz/dev/ptyz/dev/ttyzout of pty devicesN)r openO_RDWRr )xyZpty_namefdr r r r 2 s r c C sr t | t j}zddlm}m} W n tk r: | Y S X z|||d |||d W n tk rl Y nX |S )zslave_open(tty_name) -> slave_fd Open the pty slave and acquire the controlling terminal, returning opened filedescriptor. Deprecated, use openpty() instead.r )ioctlI_PUSHZptemZldterm)r r r Zfcntlr r ImportErrorr )Ztty_nameresultr r r r r r > s r c C s zt \} }W n ttfk r( Y n4X | tkrTzt W n tk rR Y nX | |fS t \}}t } | tkrt t | t |t t |t t |t |tkrt | t t tt j}t | n t | | |fS )zdfork() -> (pid, master_fd) Fork and make the child a session leader with a controlling terminal.)r forkptyr r CHILDsetsidr r r dup2STDIN_FILENO STDOUT_FILENO STDERR_FILENOr r r )pidr r r Ztmp_fdr r r r P s0 c C s" |rt | |}||d }q dS )z#Write all the data to a descriptor.N)r write)r datanr r r _writenx s r) c C s t | dS )zDefault read function.i )r read)r r r r _read~ s r+ c C sv | t g}t|g g \}}}| |krF|| }|s:|| ntt| t |kr|t }|sf|t qt| | qdS )zParent copy loop. Copies pty master -> standard output (master_read) standard input -> pty master (stdin_read)N)r" r remover r&