\ddZddlmZddlZddlZddlZddlmZmZddlmZmZm Z gdZ dZ dZ dZ dZd Zd Zd Zd Zd ZdZeefdZeefdZdS)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 ..\python\lib\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 c,tj|dS)zDefault read function.i)rread)r#s r_readr9|s 72t  ctj|rZtj|d t|||tj|dn#tj|dwxYwdSd}|tk}|t k}d}d} g}g} |r-t ||kr|t|r(t ||kr|||r-t |dkr| t t |dkr| |t|| g\}} } t | vr8 tj t |} || d}n#t$rd}YnwxYw||vr( ||} n#t$rd} YnwxYw| sdS|| z }|| vrtj ||} || d}|r#t|vr|t} | sd}n|| z }) zParent copy loop. Copies pty master -> standard output (master_read) standard input -> pty master (stdin_read)F) master_read stdin_readTNir:r r) r get_blocking set_blocking_copyr2r3lenappendrwriter) rr<r=high_waterlevel stdin_avail stdout_availi_bufo_bufrfdswfds_xfdsndatas rr@r@sx  y!!   5))) - ) L L L L OIt , , , ,BOIt , , , ,O|+K -L E E*  &3u::77 KK % % %  #CJJ88 KK " " "  'CJJNN KK & & & u::>> KK " " ""4r22dE D  %H]E22abb  % % %$  %    "{9--      TME   E**A!""IE  <4//:l++D #  U*s/AA*$F FF F'' F65F6cdt|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/rexeclprr2rttyerrorr@r TCSAFLUSHrr)argvr<r=r5rmoderestores 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__rrrQrTrrrrr__all__r2r3r4r/r rrrr r9r@r r:rr]s-  ,,,,,,,,,, & & &        ( ( ($&&&P"'5????B"er: