
[[\                 @   s   d  Z  d d l m Z d d l Z d d l Z d d d g Z d Z d Z d Z d Z d	 d   Z	 d
 d   Z
 d d   Z d d   Z d d   Z d d   Z d d   Z e e d d  Z e e d d  Z d S)zPseudo terminal utilities.    )selectNopenptyforkspawn      c              C   sN   y t  j   SWn t t f k
 r( Yn Xt   \ }  } t |  } |  | f S)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.4/pty.pyr      s    c              C   s^   y t  j   \ }  } Wn t t f k
 r0 Yn' Xt  j |  } t  j |  |  | f St   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.)r   r   r	   r
   ttynamecloser   )r   r   r   r   r   r   master_open!   s    
r   c              C   s   xm d D]e }  x\ d D]T } d |  | } y t  j | t  j  } Wn t k
 rX w Yn X| d |  | f SWq Wt d   d S)z1Open pty master and return (master_fd, tty_name).ZpqrstuvwxyzPQRSTZ0123456789abcdefz/dev/ptyz/dev/ttyzout of pty devicesN)r   openO_RDWRr
   )xyZpty_namefdr   r   r   r   1   s    r   c             C   s   t  j |  t  j  } y d d l m } m } Wn t k
 rG | SYn Xy$ | | | d  | | | d  Wn t k
 r Yn X| S)zslave_open(tty_name) -> slave_fd
    Open the pty slave and acquire the controlling terminal, returning
    opened filedescriptor.
    Deprecated, use openpty() instead.r   )ioctlI_PUSHZptemZldterm)r   r   r   Zfcntlr   r   ImportErrorr
   )Ztty_nameresultr   r   r   r   r   r   =   s    	r   c              C   s<  y t  j   \ }  } Wn t t f k
 r0 Yn= X|  t k rc y t  j   Wqc t k
 r_ Yqc Xn  |  | f St   \ } } t  j   }  |  t k r%t  j   t  j |  t  j	 | t
  t  j	 | t  t  j	 | t  | t k r t  j |  n  t  j t  j t  t  j  } t  j |  n t  j |  |  | f S)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   Ztmp_fdr   r   r   r   O   s0    

c             C   s3   x, | r. t  j |  |  } | | d  } q Wd S)z#Write all the data to a descriptor.N)r   write)r   datanr   r   r   _writenw   s    	r)   c             C   s   t  j |  d  S)zDefault read function.i   )r   read)r   r   r   r   _read}   s    r+   c             C   s   |  t  g } x t | g  g   \ } } } |  | k rk | |   } | sX | j |   qk t j t |  n  t  | k r | t   } | s | j t   q t |  |  q q d S)zParent copy loop.
    Copies
            pty master -> standard output   (master_read)
            standard input -> pty master    (stdin_read)N)r"   r   remover   r&   r#   r)   )r   master_read
stdin_readZfdsZrfdsZwfdsZxfdsr'   r   r   r   _copy   s    r/   c             C   s  t  |   t  d  k r$ |  f }  n  t   \ } } | t k rV t j |  d |   n  y& t j t  } t j t  d } Wn t j	 k
 r d } Yn Xy t
 | | |  Wn1 t k
 r | r t j t t j |  n  Yn Xt j |  t j | d  d S)zCreate a spawned process. r   r   )typer   r   r   execlpttyZ	tcgetattrr"   Zsetrawerrorr/   r
   Z	tcsetattrZ	TCSAFLUSHr   waitpid)argvr-   r.   r%   r   modeZrestorer   r   r   r      s$    
)__doc__r   r   r3   __all__r"   r#   r$   r   r   r   r   r   r   r)   r+   r/   r   r   r   r   r   <module>   s"   (