3
\� � @ s� d Z ddlZejdkred��ddlZddlZddlZddlZddlZddl Z ddl
Z
ddlZddddd gZd
Z
e jZe jZej� Zeed�r�ejZnejejdfdd�Zdde
d�dd�ZG dd � d �ZG dd� de j�ZdS )z*
Various Windows specific bits and pieces
� NZwin32z
win32 only�
socketpair�pipe�Popen�PIPE�
PipeHandlei c
C s | t jkrd}n| t jkr d}ntd��|t jkr:td��|dkrJtd��t j | ||�}z�|j|df� |jd� |j� dd � \}}t j | ||�}yP|jd
� y|j ||f� W n t
tfk
r� Y nX |jd� |j� \}} W n |j
� � Y nX W d|j
� X ||fS )z�A socket pair usable as a self-pipe, for Windows.
Origin: https://gist.github.com/4325783, by Geert Jansen.
Public domain.
z 127.0.0.1z::1z?Only AF_INET and AF_INET6 socket address families are supportedz)Only SOCK_STREAM socket type is supportedr zOnly protocol zero is supported� N� FT)�socket�AF_INETZAF_INET6�
ValueError�SOCK_STREAMZbindZlistenZgetsocknameZsetblockingZconnect�BlockingIOError�InterruptedErrorZaccept�close)
Zfamily�type�proto�hostZlsockZaddrZportZcsockZssock�_� r �-/usr/lib64/python3.6/asyncio/windows_utils.pyr % s8
FT)�duplex�
overlapped�bufsizec C s" t jdtj� tt�f d�}| r>tj}tjtj B }|| }}ntj
}tj }d| }}|tjO }|d rp|tjO }|d r�tj}nd}d } }
yZtj
||tjd||tjtj�} tj||dtjtj|tj�}
tj| dd�}|jd� | |
fS | dk �rtj| � |
dk �rtj|
� � Y nX dS )zELike os.pipe() but with overlapped support and using handles not fds.z\\.\pipe\python-pipe-%d-%d-)�prefixr r NT)r )�tempfileZmktemp�os�getpid�next�
_mmap_counter�_winapiZPIPE_ACCESS_DUPLEXZGENERIC_READZ
GENERIC_WRITEZPIPE_ACCESS_INBOUNDZFILE_FLAG_FIRST_PIPE_INSTANCEZFILE_FLAG_OVERLAPPEDZCreateNamedPipeZ PIPE_WAITZNMPWAIT_WAIT_FOREVERZNULLZ
CreateFileZ
OPEN_EXISTINGZConnectNamedPipeZGetOverlappedResult�CloseHandle)r r r ZaddressZopenmode�accessZobsizeZibsizeZflags_and_attribsZh1Zh2Zovr r r r S s@
c @ s\ e Zd ZdZdd� Zdd� Zedd� �Zdd � Ze j
d
�dd�Zd
d� Zdd� Z
dd� ZdS )r z�Wrapper for an overlapped pipe handle which is vaguely file-object like.
The IOCP event loop can use these instead of socket objects.
c C s
|| _ d S )N)�_handle)�self�handler r r �__init__� s zPipeHandle.__init__c C s* | j d k rd| j }nd}d| jj|f S )Nz handle=%r�closedz<%s %s>)r" � __class__�__name__)r# r$ r r r �__repr__� s
zPipeHandle.__repr__c C s | j S )N)r" )r# r r r r$ � s zPipeHandle.handlec C s | j d krtd��| j S )NzI/O operatioon on closed pipe)r" r )r# r r r �fileno� s
zPipeHandle.fileno)r c C s | j d k r|| j � d | _ d S )N)r" )r# r r r r r � s
zPipeHandle.closec C s* | j d k r&tjd| t| d� | j� d S )Nzunclosed %r)�source)r" �warnings�warn�ResourceWarningr )r# r r r �__del__� s
zPipeHandle.__del__c C s | S )Nr )r# r r r � __enter__� s zPipeHandle.__enter__c C s | j � d S )N)r )r# �t�v�tbr r r �__exit__� s zPipeHandle.__exit__N)r( �
__module__�__qualname__�__doc__r% r) �propertyr$ r* r r r r/ r0 r4 r r r r r � s c s" e Zd ZdZd� fdd� Z� ZS )r z�Replacement for subprocess.Popen using overlapped pipe handles.
The stdin, stdout, stderr are None or instances of PipeHandle.
Nc s� |j d� st�|j dd�dks$t�d } }}d } }
}|tkrdtd dd�\}} tj|tj�}n|}|tkr�td
d�\}
}
tj|
d�}n|}|tkr�tdd�\}}tj|d�}n|tkr�|}n|}z�y t � j
|f|||d�|�� W n8 x(| |
|fD ]}|d k � r�tj|� � q�W � Y n>X | d k �r6t
| �| _|
d k �rJt
|
�| _|d k �r^t
|�| _W d |tk�rvtj|� |tk�r�tj|� |tk�r�tj|� X d S )NZuniversal_newlinesr r FT)r r )r )�stdin�stdout�stderr)FT)TF)TF)�get�AssertionErrorr r �msvcrtZopen_osfhandler �O_RDONLY�STDOUT�superr% r r r r9 r: r; r )r# �argsr9 r: r; �kwdsZ stdin_rfdZ
stdout_wfdZ
stderr_wfdZstdin_whZ stdout_rhZ stderr_rhZstdin_rhZ stdout_whZ stderr_wh�h)r' r r r% � sL
zPopen.__init__)NNN)r( r5 r6 r7 r% �
__classcell__r r )r' r r � s )TT)r7 �sys�platform�ImportErrorr � itertoolsr> r r �
subprocessr r, �__all__ZBUFSIZEr r@ �countr �hasattrr r
r r r r r r r r �