a ÕDOgÇã@s˜dZddlmZddlZddlZddlZgd¢ZdZdZdZdZ dd„Z d d „Z d d „Z d d„Z dd„Zdd„Zdd„Zeefdd„Zeefdd„ZdS)zPseudo terminal utilities.é)ÚselectN)ÚopenptyÚforkÚspawnééc Cs<z t ¡WSttfy Yn0tƒ\}}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ú(/opt/alt/python39/lib64/python3.9/pty.pyrs  rc CsJzt ¡\}}Wnttfy&Yn0t |¡}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 CsldD]Z}dD]P}d||}zt |tj¡}WntyDYq Yn0|d||fSqtdƒ‚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 2s   r cCsnt |tj¡}zddlm}m}Wnty8|YS0z|||dƒ|||dƒWntyhYn0|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ìzt ¡\}}Wnttfy&Yn20|tkrPz t ¡WntyNYn0||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_fdrrrrPs0          rcCs"|rt ||¡}||d…}qdS)z#Write all the data to a descriptor.N)rÚwrite)rÚdataÚnrrrÚ_writenxs r)cCs t |d¡S)zDefault read function.i)rÚread)rrrrÚ_read~sr+cCsv|tg}t|ggƒ\}}}||vrF||ƒ}|s:| |¡n t t|¡t|vr|tƒ}|sf| t¡qt||ƒqdS)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Ú_copy‚s   r/cCsÒt|ƒtdƒkr|f}t d|¡tƒ\}}|tkrJtj|dg|¢RŽzt t ¡}t  t ¡d}Wntj y~d}Yn0zt |||ƒWn&t y¶|r²t t tj|¡Yn0t |¡t |d¡dS)zCreate a spawned process.Úz pty.spawnrr)ÚtypeÚsysÚauditrrrÚexeclpÚttyZ tcgetattrr"ZsetrawÚerrorr/r Z tcsetattrZ TCSAFLUSHrÚwaitpid)Úargvr-r.r%r ÚmodeZrestorerrrr—s&       r)Ú__doc__rrr2r5Ú__all__r"r#r$rrrr r rr)r+r/rrrrrÚs$   (