B
    u9aãj  ã               @   sl  d dl Z d dl T d dlZd dlZd dlZd dlZd dlmZmZ yd dlZW n e	k
rd   dZY nX e
eddƒZe
eddƒZe
eddƒZd	d
dddgZe e e ¡¡ e dedd„ ¡ e dedd„ ¡ e dedd„ ¡ e dedd„ ¡ dZdZdd„ ZeZej ¡  d¡rœi Zded< ded< ded< d ed!< d"ed#< d$ed%< d&ed'< d(ed)< d*ed+< d,ed-< d.ed/< d0ed1< d2ed3< d4ed5< d6ed7< e d8¡ G d9d:„ d:eƒZG d;d<„ d<e jƒZdLd=d	„Ze e jd>ƒrèd?d@„ Z!e d@¡ e e dAƒrde"d fdBdA„Z#ne$e"d fdCdA„Z#e dA¡ dDe#_%eehZ&G dEdF„ dFej'ƒZ(dMdHd
„Z)e*ƒ Z+e+dfdId„Z,dNdJdK„Z-dS )Oé    N)Ú*)ÚIntEnumÚIntFlagÚEBADFé	   ÚEAGAINé   ÚEWOULDBLOCKÚfromfdÚgetfqdnÚcreate_connectionÚAddressFamilyÚ
SocketKindc             C   s   |   ¡ o|  d¡S )NZAF_)ÚisupperÚ
startswith)ÚC© r   ú/usr/lib/python3.7/socket.pyÚ<lambda>L   ó    r   c             C   s   |   ¡ o|  d¡S )NZSOCK_)r   r   )r   r   r   r   r   Q   r   ZMsgFlagc             C   s   |   ¡ o|  d¡S )NZMSG_)r   r   )r   r   r   r   r   V   r   ZAddressInfoc             C   s   |   ¡ o|  d¡S )NZAI_)r   r   )r   r   r   r   r   [   r   z	127.0.0.1z::1c             C   s"   y|| ƒS  t k
r   | S X d S )N)Ú
ValueError)ÚvalueZ
enum_klassr   r   r   Ú_intenum_convertera   s    r   ÚwinzThe operation was interrupted.i'  zA bad file handle was passed.i'  zPermission denied.i'  z!A fault occurred on the network??i'  z#An invalid operation was attempted.i&'  z The socket operation would blocki3'  z,A blocking operation is already in progress.i4'  zThe network address is in use.i@'  zThe connection has been reset.iF'  zThe network has been shut down.iJ'  zThe operation timed out.iL'  zConnection refused.iM'  zThe name is too long.iO'  zThe host is down.iP'  zThe host is unreachable.iQ'  ÚerrorTabc               @   s   e Zd ZdS )Ú_GiveupOnSendfileN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   ‚   s    r   c                   s(  e Zd ZdddgZd8dd„Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Z	dd„ Z
d9ddddœdd„Zeedƒrvd:dd„Zn
d;dd„Zd<dd„Zdd „ Zd=d!d"„Zd#d$„ Zejfd%d&„Zd'd(„ Z‡ fd)d*„Ze‡ fd+d,„ƒZe‡ fd-d.„ƒZejd/krd0d1„ Zd2d3„ Znd4d1„ Zd5d3„ Zd6e_d7e_‡  ZS )>ÚsocketÚ__weakref__Ú_io_refsÚ_closedéÿÿÿÿNc             C   sP   |d kr,|dkrt }|dkr t}|dkr,d}tj | ||||¡ d| _d| _d S )Nr#   r   F)ÚAF_INETÚSOCK_STREAMÚ_socketr   Ú__init__r!   r"   )ÚselfÚfamilyÚtypeÚprotoÚfilenor   r   r   r'   ‹   s    zsocket.__init__c             C   s   | S )Nr   )r(   r   r   r   Ú	__enter__›   s    zsocket.__enter__c             G   s   | j s|  ¡  d S )N)r"   Úclose)r(   Úargsr   r   r   Ú__exit__ž   s    zsocket.__exit__c             C   s¸   t | ddƒ}d| jj| jj|r"dnd|  ¡ | j| j| jf }|s¬y |  ¡ }|r^|dt	|ƒ 7 }W n t
k
rt   Y nX y |  ¡ }|r”|dt	|ƒ 7 }W n t
k
rª   Y nX |d7 }|S )	Nr"   Fz,<%s.%s%s fd=%i, family=%s, type=%s, proto=%iz	 [closed]Ú z
, laddr=%sz
, raddr=%sú>)ÚgetattrÚ	__class__r   r   r,   r)   r*   r+   ÚgetsocknameÚstrÚerrorZgetpeername)r(   ÚclosedÚsZladdrZraddrr   r   r   Ú__repr__¢   s0    

zsocket.__repr__c             C   s   t dƒ‚d S )NzCannot serialize socket object)Ú	TypeError)r(   r   r   r   Ú__getstate__¿   s    zsocket.__getstate__c             C   s6   t |  ¡ ƒ}| j| j| j| j|d}| |  ¡ ¡ |S )N)r,   )Údupr,   r4   r)   r*   r+   Ú
settimeoutÚ
gettimeout)r(   ÚfdÚsockr   r   r   r=   Â   s    z
socket.dupc             C   sF   |   ¡ \}}t| j| j| j|d}tƒ d kr>|  ¡ r>| d¡ ||fS )N)r,   T)Z_acceptr   r)   r*   r+   Zgetdefaulttimeoutr?   Úsetblocking)r(   r@   ÚaddrrA   r   r   r   ÚacceptÍ   s
    
zsocket.acceptÚr)ÚencodingÚerrorsÚnewlinec            C   sü   t |ƒdddhks td|f ƒ‚d|k}d|kp4| }d|k}d}	|rN|	d7 }	|rZ|	d7 }	t| |	ƒ}
|  jd7  _|d kr~d}|dk rŒtj}|dkr¤|s td	ƒ‚|
S |r¼|r¼t |
|
|¡}n|rÎt |
|¡}nt |
|¡}|râ|S t 	||||¡}||_
|S )
NrE   ÚwÚbz&invalid mode %r (only r, w, b allowed)r1   é   r#   r   z!unbuffered streams must be binary)Úsetr   ÚSocketIOr!   ÚioÚDEFAULT_BUFFER_SIZEÚBufferedRWPairÚBufferedReaderÚBufferedWriterÚTextIOWrapperÚmode)r(   rT   Ú	bufferingrF   rG   rH   ZwritingZreadingZbinaryZrawmodeÚrawÚbufferÚtextr   r   r   ÚmakefileÝ   s<    
zsocket.makefileÚsendfiler   c          
   C   sê  |   |||¡ |  ¡ }y| ¡ }W n0 ttjfk
rR } zt|ƒ‚W d d }~X Y nX yt |¡j}W n* t	k
rŽ } zt|ƒ‚W d d }~X Y nX |s˜dS |s |n|}|  
¡ }	|	dkr¼tdƒ‚ttdƒrÐt ¡ }
nt ¡ }
|
 |tj¡ d}|
j}tj}zÌxÆ|	r||	ƒst d¡‚|r.|| }|dkr.P y|||||ƒ}W n^ tk
rd   |	s^|ƒ  wúY qú t	k
rž } z|dkrˆt|ƒ‚|d ‚W d d }~X Y qúX |dkr¬P ||7 }||7 }qúW |S |dkrät|dƒrä| |¡ X d S )Nr   z&non-blocking sockets are not supportedÚPollSelectorz	timed outÚseek)Ú_check_sendfile_paramsr,   ÚAttributeErrorrN   ÚUnsupportedOperationr   ÚosÚfstatÚst_sizeÚOSErrorr?   r   ÚhasattrÚ	selectorsr[   ZSelectSelectorÚregisterZEVENT_WRITEZselectrZ   r&   ÚtimeoutÚBlockingIOErrorr\   )r(   ÚfileÚoffsetÚcountZsocknor,   ÚerrZfsizeÚ	blocksizerg   ZselectorÚ
total_sentZselector_selectZos_sendfileÚsentr   r   r   Ú_sendfile_use_sendfile	  s`    





zsocket._sendfile_use_sendfilec             C   s   t dƒ‚d S )Nz,os.sendfile() not available on this platform)r   )r(   ri   rj   rk   r   r   r   rp   J  s    c       
   
   C   s   |   |||¡ |  ¡ dkr"tdƒ‚|r0| |¡ |r>t|dƒnd}d}|j}| j}z†x€|rrt|| |ƒ}|dkrrP t||ƒƒ}|s„P xLy||ƒ}	W n tk
r¨   w†Y q†X ||	7 }|	t	|ƒk rÌ||	d … }q†P q†W qVW |S |dkrút
|dƒrú| || ¡ X d S )Nr   z&non-blocking sockets are not supportedi    r\   )r]   r?   r   r\   ÚminÚreadÚsendÚ
memoryviewrh   Úlenrd   )
r(   ri   rj   rk   rm   rn   Z	file_readZ	sock_sendÚdataro   r   r   r   Ú_sendfile_use_sendN  s<    

zsocket._sendfile_use_sendc             C   sd   dt |ddƒkrtdƒ‚| jt@ s*tdƒ‚|d k	r`t|tƒsJtd |¡ƒ‚|dkr`td |¡ƒ‚d S )NrJ   rT   z$file should be opened in binary modez+only SOCK_STREAM type sockets are supportedz+count must be a positive integer (got {!r})r   )r3   r   r*   r%   Ú
isinstanceÚintr;   Úformat)r(   ri   rj   rk   r   r   r   r]   r  s    

zsocket._check_sendfile_paramsc             C   s2   y|   |||¡S  tk
r,   |  |||¡S X d S )N)rp   r   rw   )r(   ri   rj   rk   r   r   r   rZ     s    zsocket.sendfilec             C   s*   | j dkr|  j d8  _ | jr&|  ¡  d S )Nr   rK   )r!   r"   r.   )r(   r   r   r   Ú_decref_socketios–  s    
zsocket._decref_socketiosc             C   s   |  | ¡ d S )N)r.   )r(   Z_ssr   r   r   Ú_real_closeœ  s    zsocket._real_closec             C   s   d| _ | jdkr|  ¡  d S )NTr   )r"   r!   r|   )r(   r   r   r   r.      s    
zsocket.closec                s   d| _ tƒ  ¡ S )NT)r"   ÚsuperÚdetach)r(   )r4   r   r   r~   ¦  s    zsocket.detachc                s   t tƒ jtƒS )N)r   r}   r)   r   )r(   )r4   r   r   r)   °  s    zsocket.familyc                s   t tƒ jtƒS )N)r   r}   r*   r   )r(   )r4   r   r   r*   ¶  s    zsocket.typeÚntc             C   s   t  |  ¡ ¡S )N)r`   Zget_handle_inheritabler,   )r(   r   r   r   Úget_inheritable½  s    zsocket.get_inheritablec             C   s   t  |  ¡ |¡ d S )N)r`   Zset_handle_inheritabler,   )r(   Úinheritabler   r   r   Úset_inheritable¿  s    zsocket.set_inheritablec             C   s   t  |  ¡ ¡S )N)r`   r€   r,   )r(   r   r   r   r€   Â  s    c             C   s   t  |  ¡ |¡ d S )N)r`   r‚   r,   )r(   r   r   r   r   r‚   Ä  s    z&Get the inheritable flag of the socketz&Set the inheritable flag of the socket)r#   r#   r#   N)rE   N)r   N)r   N)r   N)r   N) r   r   r   Ú	__slots__r'   r-   r0   r:   r<   r=   rD   rY   rd   r`   rp   rw   r]   rZ   r{   r&   r   r|   r.   r~   Úpropertyr)   r*   Únamer€   r‚   Ú__doc__Ú__classcell__r   r   )r4   r   r   …   s:   

)
A

$


r   c             C   s   t | ƒ}t||||ƒS )N)r=   r   )r@   r)   r*   r+   Znfdr   r   r   r
   É  s    Zsharec             C   s   t ddd| ƒS )Nr   )r   )Úinfor   r   r   Ú	fromshareÓ  s    r‰   Ú
socketpairc             C   sh   | d kr*yt } W n tk
r(   t} Y nX t | ||¡\}}t| ||| ¡ ƒ}t| ||| ¡ ƒ}||fS )N)ZAF_UNIXÚ	NameErrorr$   r&   rŠ   r   r~   )r)   r*   r+   ÚarJ   r   r   r   rŠ   Þ  s    
c       
   	   C   s  | t krt}n| tkrt}ntdƒ‚|tkr4tdƒ‚|dkrDtdƒ‚t| ||ƒ}z¢| |df¡ | ¡  | 	¡ d d… \}}t| ||ƒ}yP| 
d¡ y| ||f¡ W n ttfk
r¾   Y nX | 
d¡ | ¡ \}}	W n   | ¡  ‚ Y nX W d | ¡  X ||fS )Nz?Only AF_INET and AF_INET6 socket address families are supportedz)Only SOCK_STREAM socket type is supportedr   zOnly protocol zero is supportedé   FT)r$   Ú
_LOCALHOSTZAF_INET6Ú_LOCALHOST_V6r   r%   r   ÚbindZlistenr5   rB   Úconnectrh   ÚInterruptedErrorrD   r.   )
r)   r*   r+   ÚhostZlsockrC   ÚportZcsockZssockÚ_r   r   r   rŠ   ó  s8    


a8  socketpair([family[, type[, proto]]]) -> (socket object, socket object)
Create a pair of socket objects from the sockets returned by the platform
socketpair() function.
The arguments are the same as for socket() except the default family is AF_UNIX
if defined on the platform; otherwise, the default is AF_INET.
c                   sl   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Z‡ fdd„Zdd„ Z	e
dd„ ƒZe
dd„ ƒZdd„ Z‡  ZS )rM   c             C   sZ   |dkrt d| ƒ‚tj | ¡ || _d|kr6|d7 }|| _d|k| _d|k| _d| _d S )N)rE   rI   ÚrwÚrbÚwbZrwbzinvalid mode: %rrJ   rE   rI   F)	r   rN   Ú	RawIOBaser'   Ú_sockÚ_modeÚ_readingÚ_writingÚ_timeout_occurred)r(   rA   rT   r   r   r   r'   3  s    

zSocketIO.__init__c          
   C   s†   |   ¡  |  ¡  | jrtdƒ‚xby| j |¡S  tk
rH   d| _‚ Y q  tk
r| } z|jd t	krjd S ‚ W d d }~X Y q X q W d S )Nz!cannot read from timed out objectTr   )
Ú_checkClosedÚ_checkReadablerž   rc   rš   Z	recv_intorg   r7   r/   Ú_blocking_errnos)r(   rJ   Úer   r   r   Úreadinto?  s    zSocketIO.readintoc          
   C   sX   |   ¡  |  ¡  y| j |¡S  tk
rR } z|jd tkr@d S ‚ W d d }~X Y nX d S )Nr   )rŸ   Ú_checkWritablerš   rs   r7   r/   r¡   )r(   rJ   r¢   r   r   r   ÚwriteV  s    zSocketIO.writec             C   s   | j rtdƒ‚| jS )NzI/O operation on closed socket.)r8   r   rœ   )r(   r   r   r   Úreadablef  s    zSocketIO.readablec             C   s   | j rtdƒ‚| jS )NzI/O operation on closed socket.)r8   r   r   )r(   r   r   r   Úwritablem  s    zSocketIO.writablec                s   | j rtdƒ‚tƒ  ¡ S )NzI/O operation on closed socket.)r8   r   r}   Úseekable)r(   )r4   r   r   r¨   t  s    zSocketIO.seekablec             C   s   |   ¡  | j ¡ S )N)rŸ   rš   r,   )r(   r   r   r   r,   {  s    zSocketIO.filenoc             C   s   | j s|  ¡ S dS d S )Nr#   )r8   r,   )r(   r   r   r   r…     s    zSocketIO.namec             C   s   | j S )N)r›   )r(   r   r   r   rT   ˆ  s    zSocketIO.modec             C   s*   | j r
d S tj | ¡ | j ¡  d | _d S )N)r8   rN   r™   r.   rš   r{   )r(   r   r   r   r.   Œ  s
    
zSocketIO.close)r   r   r   r'   r£   r¥   r¦   r§   r¨   r,   r„   r…   rT   r.   r‡   r   r   )r4   r   rM   "  s   rM   r1   c             C   sn   |   ¡ } | r| dkrtƒ } yt| ƒ\}}}W n tk
r@   Y n*X | d|¡ x|D ]} d| krTP qTW |} | S )Nz0.0.0.0r   Ú.)ÚstripZgethostnameZgethostbyaddrr7   Úinsert)r…   ZhostnameÚaliasesZipaddrsr   r   r   r   —  s    	
c             C   sÆ   | \}}d }xžt ||dtƒD ]Œ}|\}}}	}
}d }y>t|||	ƒ}|tk	rR| |¡ |r`| |¡ | |¡ d }|S  tk
r¦ } z|}|d k	r–| ¡  W d d }~X Y qX qW |d k	rº|‚ntdƒ‚d S )Nr   z!getaddrinfo returns an empty list)	Úgetaddrinfor%   r   Ú_GLOBAL_DEFAULT_TIMEOUTr>   r   r‘   r7   r.   )Zaddressrg   Zsource_addressr“   r”   rl   ÚresÚafÚsocktyper+   Ú	canonnameÚsarA   r•   r   r   r   r   ³  s*    


c             C   sT   g }xJt  | |||||¡D ]2}|\}}	}}
}| t|tƒt|	tƒ||
|f¡ qW |S )N)r&   r­   Úappendr   r   r   )r“   r”   r)   r*   r+   ÚflagsZaddrlistr¯   r°   r±   r²   r³   r   r   r   r­   Û  s    r­   )r   )r1   )r   r   r   r   ).r&   r`   ÚsysrN   re   Úenumr   r   ÚerrnoÚImportErrorr3   r   r   r	   Ú__all__ÚextendÚ_get_exports_listÚ_convertr   rŽ   r   r   r   Z_realsocketÚplatformÚlowerr   r   r´   Ú	Exceptionr   r
   rd   r‰   r%   rŠ   r$   r†   r¡   r™   rM   r   Úobjectr®   r   r­   r   r   r   r   Ú<module>1   sŽ    






  F
	
$
u
'