o
    i~!                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZmZ d dlmZ ejdkr?d dlmZ da	 da	 g Z	 dd Zd	d
 Zdd Zdd Zdd ZdS )    N)launcher)log	messaging)outputwin32)winapic                   C   s   dt j dS )NzDebuggee[PID=])processpid r   r   T/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/debugpy/launcher/debuggee.pydescribe$   s   r   c                 C   s  t d|| t }z,|r)t \}}t \}}|||||hO }t||d}	ni }	tjdkr:dd }
|	j|
d zt	j
|f|dd|	aW n ty] } z	td	||d }~ww t d
t  tjdkrzStjd d at }tt|}tjttjt||t| |j jtjtjB O  _tj ttjt|| tj!tj"tj#B dtj$}tj%t| W n ty   t j&ddd Y nw t'(t) t*j+,dddtj$| t-.dd d |r	d|tj/fd|tj0ffD ]\}}}t12t ||| |3| qt4j5t6dd}d|_7|8  W |D ]}zt9| W q ty5   t j&dd Y qw d S |D ]}zt9| W q: tyU   t j&dd Y q:w w )NzOSpawning debuggee process:

Command line: {0!r}

Environment variables: {1!r}

)stdoutstderrr   c               
   S   s   z=t   ttjtj} z(t dt j}zt |t   W t 	| nt 	| w W ttj|  W d S ttj|  w  t
yN   tjddd Y d S w )Nz/dev/ttyzFailed to set up process groupinfolevel)ossetpgrpsignalSIGTTOUSIG_IGNopenO_RDWR	tcsetpgrpgetpgrpclose	Exceptionr   swallow_exception)old_handlerttyr   r   r   
preexec_fn?   s   $zspawn.<locals>.preexec_fn)r!   r   )envbufsizez0Couldn't spawn debuggee: {0}

Command line:{1!r}zSpawned {0}.FzFailed to set up job objectwarningr   r	   launchTP   )startMethodisLocalProcesssystemProcessIdnamepointerSizer   r   zwait_for_exit())targetr+   ):r   r   setr   pipedictsysplatformupdate
subprocessPopenr	   r   r   MessageHandlingErrorformatr   r   kernel32CreateJobObjectA
job_handle$JOBOBJECT_EXTENDED_LIMIT_INFORMATIONDWORDctypessizeofQueryInformationJobObject!JobObjectExtendedLimitInformationpointerBasicLimitInformation
LimitFlags"JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSEJOB_OBJECT_LIMIT_BREAKAWAY_OKSetInformationJobObjectOpenProcessPROCESS_TERMINATEPROCESS_SET_QUOTAr
   AssignProcessToJobObjectr   atexitregisterkillr   channel
send_eventstructcalcsizer   r   r   CaptureOutputremove	threadingThreadwait_for_exitdaemonstartr   )process_namecmdliner"   redirect_output	close_fdsstdout_rstdout_wstderr_rstderr_wkwargsr!   excjob_infojob_info_sizeprocess_handlecategoryfdteewait_threadr   r   r   spawn(   s   






rj   c                   C   s   t d u rd S z*t  d u r.tdt  tjdkr#tj	t
d W d S tt jtj W d S W d S  tyA   tdt  Y d S w )NzKilling {0}r   r   zFailed to kill {0})r	   pollr   r   r   r1   r2   r   r8   TerminateJobObjectr:   r   killpgr
   r   SIGKILLr   r   r   r   r   r   rM      s   
	rM   c                     s   zt   tjdkr dk r dM  W n ty#   td d Y nw tdt   t	
  t fddtD } ztjd	d
 i W n	 tyO   Y nw | rUt  z	tjd W d S  tyh   Y d S w )Nr   r      z$Couldn't determine process exit codez{0} exited with code {1}c                 3   s    | ]}| V  qd S )Nr   ).0predcoder   r   	<genexpr>   s    z wait_for_exit.<locals>.<genexpr>exitedexitCode
terminated)r	   waitr1   r2   r   r   r   r   r   r   wait_for_remaining_outputanywait_on_exit_predicatesr   rN   rO   _wait_for_user_input)should_waitr   rs   r   rV      s0   
rV   c                  C   s   t jrUt jrWt j rYddlm}  zdd l}W n ty"   d}Y nw d}|r=| d t j	d t j
  |  d S | d t j	d t j
  t jd	 d S d S d S d S )
Nr   )r   FTz5msvcrt available - waiting for user input via getch()z Press any key to continue . . . z8msvcrt not available - waiting for user input via read()zPress Enter to continue . . .    )r1   r   stdinisattydebugpy.commonr   msvcrtImportErrordebugwriteflushgetchread)r   r   	can_getchr   r   r   r}      s$   



r}   )rK   r=   r   r   rP   r4   r1   rT   debugpyr   r   r   r   debugpy.launcherr   r2   r   r	   r:   r|   r   rj   rM   rV   r}   r   r   r   r   <module>   s2   
 
"