B °-_›ã@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<yt ¡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/lib/python3.7/pty.pyrs c CsLyt ¡\}}Wnttfk r(YnXt |¡}t |¡||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||}yt |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 cCsnt |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 c Csðyt ¡\}}Wnttfk r(Yn4X|tkrTy t ¡Wntk rRYnX||fStƒ\}}t ¡}|tkrÞt ¡t |¡t  |t ¡t  |t ¡t  |t ¡|t kr¾t |¡t  t t ¡tj¡}t |¡n t |¡||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 t ||¡}||d…}qWdS)z#Write all the data to a descriptor.N)rÚwrite)rÚdataÚnrrrÚ_writenws r)cCs t |d¡S)zDefault read function.i)rÚread)rrrrÚ_read}sr+cCsz|tg}xlt|ggƒ\}}}||krH||ƒ}|s<| |¡n t t|¡t|kr |tƒ}|sh| t¡q t||ƒq WdS)zParent 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Ú_copys   r/cCsÈt|ƒtdƒkr|f}tƒ\}}|tkrs"    (