Nf]dZddlmZddlZddlZddlZddlmZmZddlmZmZm Z gdZ dZ dZ dZ dZd Zd Zd Zd Zd ZdZdZeefdZeefdZdS)zPseudo terminal utilities.)selectN)closewaitpid)setraw tcgetattr tcsetattr)openptyforkspawnc tjS#ttf$rYnwxYwt \}}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_fds /usr/lib/python3.11/pty.pyr r s` z|| G $     *,,Iz*%%H h s ))c tj\}}tj|}tj|||fS#tt f$rYnwxYwt 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.)rr ttynamerrrr)rrrs r master_openr&sx % jll 8Z))  *$$ G $        sAAAcdD]M}dD]H}d|z|z} tj|tj}n#t$rY7wxYw|d|z|zfccSNtd)z1Open pty master and return (master_fd, tty_name).pqrstuvwxyzPQRST0123456789abcdefz/dev/ptyz/dev/ttyzout of pty devices)ropenO_RDWRr)xypty_namefds rrr6s ,,# , ,A!A~)H WXry11     Q*+ + + + + +  , & ' ''s 2 ??ctj|tj} ddlm}m}n#t $r|cYSwxYw |||d|||dn#t$rYnwxYw|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_PUSHptemldterm)rrrfcntlr%r& ImportErrorr)tty_nameresultr%r&s rrrBs WXry ) )F'''''''''    fff%%% ffh''''      Ms* 99A A%$A%c tj\}}|tkr% tjn#t$rYnwxYw||fS#t tf$rYnwxYwt \}}tj}|tkrtjtj|tj |ttj |ttj |t|tkrtj|tj tjttj}tj|ntj|||fS)zdfork() -> (pid, master_fd) Fork and make the child a session leader with a controlling terminal.)rforkptyCHILDsetsidrrr r rdup2 STDIN_FILENO STDOUT_FILENO STDERR_FILENOrrr)pidr#rrtmp_fds rr r Tse *,,R %<<      Bw G $     "))Ix '))C e||   ,''' -((( -((( m # # HX   M22BI>>    >s A 8 AA A A cP|r#tj||}||d}|!dSdS)z#Write all the data to a descriptor.N)rwrite)r#datans r_writenr;|sF  HR  ABBx c,tj|dS)zDefault read function.i)rread)r#s r_readr?s 72t  r<c\|tg}|rt|gg\}}}||vr= ||}n#t$rd}YnwxYw|sdStjt |t|vr=|t}|s|tnt|||dSdS)zParent copy loop. Copies pty master -> standard output (master_read) standard input -> pty master (stdin_read)r<N)r2rrrr8r3remover;)r master_read stdin_readfdsrfds_wfds_xfdsr9s r_copyrHs l #C )#CR00eU    "{9--     .--- 4  :l++D ) <(((( 4(((+ )))))s 2 AAcdt|tdkr|f}tjd|t\}}|tkrt j|dg|R tt}ttd}n#tj $rd}YnwxYw t||||r tttj|n(#|r!tttj|wwxYwt|t!|ddS)zCreate a spawned process.z pty.spawnrTFr )typesysauditr r/rexeclprr2rttyerrorrHr TCSAFLUSHrr)argvrBrCr5rmoderestores rr r s2 DzzT"XXwIk4   VVNC e|| $q'!D!!!!&&| 99 ij111  9 lCM4 8 8 8  9 lCM4 8 8 8 8 9 ) 3??1 s.*BB-,B-1C%%%D )__doc__rrrLrOrrrrr__all__r2r3r4r/r rrrr r;r?rHr r<rrXs;  ,,,,,,,,,, & & &        ( ( ($&&&P "'5)))):"er<