U e5dÇ ã @ sš d Z ddlmZ ddlZddlZddlZdddgZdZdZdZdZ d d„ Z d d„ Zdd „ Zdd„ Z dd„ Zdd„ Zdd„ Zeefdd„Zeefdd„ZdS )zPseudo terminal utilities.é )ÚselectNÚopenptyÚforkÚspawné é 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 ÚAttributeErrorÚOSErrorÚ_open_terminalÚ slave_open)Ú master_fdÚ slave_nameÚslave_fd© r ú/usr/lib64/python3.8/pty.pyr s c C sL zt ¡ \} }W n ttfk r( Y nX t |¡}t |¡ | |fS 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 dD ]\} dD ]R}d| | }zt |t j¡}W n tk rF Y qY nX |d| | f S qtdƒ‚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Úfdr 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 )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)r r r Zfcntlr r ÚImportErrorr )Ztty_nameÚresultr 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 ¡ } | tkrÞt ¡ t |¡ t |t ¡ t |t¡ t |t¡ |tkr¾t |¡ t t t¡t j¡}t |¡ n t |¡ | |fS )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 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 ÚdataÚnr r r Ú_writenx s r) c C s t | d¡S )zDefault read function.i )r Úread)r r r r Ú_read~ s r+ c C sv | t g}t|g g ƒ\}}}| |krF|| ƒ}|s:| | ¡ nt t|¡ t |kr|t ƒ}|sf| t ¡ qt| |ƒ qdS )z�Parent copy loop. Copies pty master -> standard output (master_read) standard input -> pty master (stdin_read)N)r" r Úremover r&