o
    f]                     @   s   d Z ddlmZ ddlZddlZddlZddlmZmZ ddlmZmZm	Z	 g d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fddZeefddZdS )zPseudo terminal utilities.    )selectN)closewaitpid)setraw	tcgetattr	tcsetattr)openptyforkspawn      c               	   C   s<   zt  W S  ttfy   Y nw t \} }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.10/pty.pyr      s   

r   c               	   C   sH   zt  \} }W n ttfy   Y t S w t |}t | | |f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   ttynamer   r   )r   r   r   r   r   r   master_open&   s   

r   c               
   C   sd   dD ]+} dD ]&}d|  | }z	t |t j}W n	 ty    Y qw |d|  | f    S qtd)z1Open pty master and return (master_fd, tty_name).pqrstuvwxyzPQRST0123456789abcdefz/dev/ptyz/dev/ttyzout of pty devices)r   openO_RDWRr   )xypty_namefdr   r   r   r   6   s   r   c                 C   sn   t | t j}z
ddlm}m} W n ty   | Y S w z|||d |||d W |S  ty6   Y |S w )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_PUSHptemldterm)r   r   r   fcntlr!   r"   ImportErrorr   )tty_nameresultr!   r"   r   r   r   r   B   s   r   c               	   C   s   zt  \} }W n ttfy   Y nw | tkr.z	t   W | |fS  ty-   Y | |fS w | |fS t \}}t  } | tkrvt   t | t 	|t
 t 	|t t 	|t |tkrct | t t tt j}t | | |fS t | | |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   tmp_fdr   r   r   r	   T   s:   





r	   c                 C   s(   |rt | |}||d }|sdS dS )z#Write all the data to a descriptor.N)r   write)r    datanr   r   r   _writen|   s   r5   c                 C   s   t | dS )zDefault read function.i   )r   read)r    r   r   r   _read   s   r7   c                 C   s   | t g}|rHt|g g \}}}| |v r/z|| }W n ty$   d}Y nw |s)dS tt| t |v rD|t }|s?|t  nt| | |sdS dS )zParent copy loop.
    Copies
            pty master -> standard output   (master_read)
            standard input -> pty master    (stdin_read)    N)r-   r   r   r   r2   r.   remover5   )r   master_read
stdin_readfdsrfds_wfds_xfdsr3   r   r   r   _copy   s$   
r@   c              
   C   s   t | t dkr| f} td|  t \}}|tkr%tj| d g| R   ztt}t	t d}W n t
jy=   d}Y nw zt||| W |rOttt
j| n|rZttt
j| w w t| t|dd S )zCreate a spawned process. z	pty.spawnr   TFr   )typesysauditr	   r*   r   execlpr   r-   r   ttyerrorr@   r   	TCSAFLUSHr   r   )argvr:   r;   r0   r   moderestorer   r   r   r
      s.   
r
   )__doc__r   r   rC   rF   r   r   r   r   r   __all__r-   r.   r/   r*   r   r   r   r   r	   r5   r7   r@   r
   r   r   r   r   <module>   s*    (