3
Z_ð]G  ã               @   sÎ   e d ƒZddlZe dƒZddlmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZ ejZd	d
ddddgZeeeƒ eeeƒd� dd	„ ZejZdd
„ ZejZdd„ Zdd„ ZejZdd„ ZejZddd„ZdS )Úosé    NÚsocket)Úgreenio)Ú	get_errno)Úgreenthread)Úhubs)Úslurp_propertiesÚfdopenÚreadÚwriteÚwaitÚwaitpidÚopen)ÚignoreZsrckeysc             O   sZ   t | tƒstd|  ƒ‚ytj| f|ž|ŽS  tk
rT } zt|jŽ ‚W Y dd}~X nX dS )zrfdopen(fd [, mode='r' [, bufsize]]) -> file_object

    Return an open file object connected to a file descriptor.zfd should be int, not %rN)Ú
isinstanceÚintÚ	TypeErrorr   Z	GreenPipeÚIOErrorÚOSErrorÚargs)Úfdr   ÚkwÚe© r   ú5/tmp/pip-build-yz_zf6az/eventlet/eventlet/green/os.pyr	      s    
c             C   s¬   x¦y
t | |ƒS  ttfk
rB } zt|ƒtjkr2‚ W Y dd}~X n8 tjk
rx } zt|ƒtjkrfdS ‚ W Y dd}~X nX yt	j
| dd� W q t	jk
r¢   dS X qW dS )z;read(fd, buffersize) -> string

    Read a file descriptor.NÚ T)r
   )Ú__original_read__r   r   r   ÚerrnoÚEAGAINr   ÚerrorÚEPIPEr   Ú
trampolineZIOClosed)r   Únr   r   r   r   r
   #   s    
c             C   sŒ   x†y
t | |ƒS  ttfk
rB } zt|ƒtjkr2‚ W Y dd}~X n4 tjk
rt } zt|ƒtjkrd‚ W Y dd}~X nX t	j
| dd� qW dS )zPwrite(fd, string) -> byteswritten

    Write a string to a file descriptor.
    NT)r   )Ú__original_write__r   r   r   r   r   r   r   r    r   r!   )r   Ústr   r   r   r   r   9   s    
c               C   s
   t ddƒS )zDwait() -> (pid, status)

    Wait for completion of a child process.r   )r   r   r   r   r   r   J   s    c             C   sX   |t j@ dkrt| |ƒS |t jB }x0t| |ƒ\}}|rF|dkrF||fS tjdƒ q$W dS )zjwaitpid(...)
    waitpid(pid, options) -> (pid, status)

    Wait for completion of a given child process.r   g{®Gáz„?N)Úos_origÚWNOHANGÚ__original_waitpid__r   Úsleep)ÚpidÚoptionsÚnew_optionsZrpidÚstatusr   r   r   r   S   s    

éÿ  c             C   sV   t | ƒjdkr"|||df\} }}}|dk	r<t| |||d�}nt| ||ƒ}tj|ƒ |S )zt Wrap os.open
        This behaves identically, but collaborates with
        the hub's notify_opened protocol.
    Z_NormalAccessorN)Údir_fd)ÚtypeÚ__name__Ú__original_open__r   Znotify_opened)ÚfileÚflagsÚmoder.   r   r   r   r   r   e   s    
)r-   N)Ú
__import__r%   r   r   Zeventletr   Zeventlet.supportr   r   r   Zeventlet.patcherr   Ú__all__Z__patched__ÚglobalsÚdirr	   r
   r   r   r#   r   r   r'   r   r1   r   r   r   r   Ú<module>   s0   