Current File : //usr/local/lib/python3.6/site-packages/ptrace/debugger/__pycache__/child.cpython-36.pyc
3

�d%�@s,dZddlmZmZmZmZmZmZmZm	Z	m
Z
mZmZm
Z
ddlmZddlmZddlmZddlmZddlmZddlmZdd	lZdd	lZyed
�ZWnek
r�dZYnXGdd
�d
e�ZGdd�de�Zdd�Z dd�Z!dd�Z"dd�Z#dd�Z$dffdd�Z%dd�Z&d	dffdd �Z'd	S)!zL
Error pipe and serialization code comes from Python 2.5 subprocess module.
�)�fork�execvp�execvpe�waitpid�close�dup2�pipe�read�write�devnull�sysconf�set_inheritable)�exc_info)�format_exception)�ptrace_traceme)�PtraceError)�exit)�EINTRN�SC_OPEN_MAX�c@seZdZdS)�
ChildErrorN)�__name__�
__module__�__qualname__�rr�>/tmp/pip-build-in2aja_b/python-ptrace/ptrace/debugger/child.pyrsrc@seZdZdS)�ChildPtraceErrorN)rrrrrrrrsrc
CsJy
tj}Wntk
r"d}YnXtj|tj�}tj|tj||B�dS)N�)�fcntl�
FD_CLOEXEC�AttributeError�F_GETFD�F_SETFD)�fdZcloexec_flag�oldrrr�_set_cloexec_flags

r%cCsHxBy
t||�Stk
r>}z|jtkr,wn�WYdd}~XqXqWdS)z%Like os.waitpid, but retries on EINTRN)r�OSError�errnor)�pid�options�errr�_waitpid_no_intr)s

r+cCsHxBy
t||�Stk
r>}z|jtkr,wn�WYdd}~XqXqWdS)z"Like os.read, but retries on EINTRN)r	r&r'r)r#Z
buffersizer*rrr�
_read_no_intr5s

r,cCsHxBy
t||�Stk
r>}z|jtkr,wn�WYdd}~XqXqWdS)z#Like os.write, but retries on EINTRN)r
r&r'r)r#�sr*rrr�_write_no_intrAs

r.cCs2t|d�}t|�|r.t|d�tj|�}|�dS)Nir)r,rr+�pickle�loads)r(�errpipe_read�dataZchild_exceptionrrr�
_createParentMs


r3TcCs�y
t�Wn.tk
r8}ztt|���WYdd}~XnXx|D]}t|d�q@W|r�xFtdt�D]8}||ksb||krxqbyt|�Wqbtk
r�YqbXqbWyt	|||�Wn@t
�\}}	}
t||	|
�}dj|�|	_
t|tj|	��YnXtd�dS)NT���)rrr�strr
�range�MAXFDrr&�
_execChildrr�joinZchild_tracebackr.r/�dumpsr)�	arguments�	no_stdout�env�
errpipe_write�	close_fds�pass_fds�errr#�exc_type�	exc_value�tbZ	exc_linesrrr�_createChildWs,


rGcCs�|rXy.ttd�}t|j�d�tdd�|j�Wn$tk
rVtd�td�YnXy,|dk	rtt|d||�nt|d|�Wn.tk
r�}zt	t
|���WYdd}~XnXdS)N�wbr�r)�openrr�filenor�IOErrorrr�	Exceptionrr7)r=r>r?�nullrCrrrr:{s

r:cCs`|r|rd}t�\}}t|�t�}|r@t|�t||�|St|�t||||||d�dS)a4
    Create a child process:
     - arguments: list of string where (e.g. ['ls', '-la'])
     - no_stdout: if True, use null device for stdout/stderr
     - env: environment variables dictionary

    Use:
     - env={} to start with an empty environment
     - env=None (default) to copy the environment
    T)rArBN)rr%rrr3rG)r=r>r?rArBr1r@r(rrr�createChild�s 


rO)(�__doc__�osrrrrrrrr	r
rrr
�sysr�	tracebackrZptrace.bindingrZptracerrr'rrr/r9rM�RuntimeErrorrrr%r+r,r.r3rGr:rOrrrr�<module>s08