File: //proc/thread-self/root/lib/python3/dist-packages/twisted/internet/__pycache__/tcp.cpython-38.pyc
U
��W[|� � @ s0 d Z ddlmZmZ ddlZddlZddlZddlZddlZddl Z ddl
mZmZ ddl
mZ ddlmZmZ ddlmZ ddlmZmZ zdd lmZmZmZ W nD ek
r� G d
d� de�ZG dd
� d
e�ZG dd� de�ZY nX edk�rxe� Z ddl!m"Z# ddl!m$Z% ddl!m&Z' ddl!m(Z) ddl!m*Z+ ddl!m,Z- ddl!m.Z/ e� Z0e� Z1e%Z2ddl!m3Z4 ddl5m6Z7 n�ddl!m Z ddl!m#Z# ddl!m%Z% ddl!m'Z' ddl!m)Z) ddl!m+Z+ dd l!m-Z- dd!l!m/Z/ dd"l!m0Z0 dd#l!m1Z1 dd$l!m2Z2 dd%l!m4Z4 dd&lm7Z7 dd'l!m8Z8 dd(l9m:Z:m;Z;m<Z< dd)l=m>Z> dd*lm?Z?m@Z@mAZA dd+lBmCZC dd,lDmEZE dd-l9mFZFmGZGmHZHmIZI dd.lJmKZK eLed/d�ZMeNefZOd0d1� ZPd2d3� ZQd4d5� ZRG d6d7� d7e�ZSG d8d9� d9e�ZTeeHjUeHjV�G d:d;� d;eeFjWeSeT��ZXG d<d=� d=e�ZYG d>d?� d?eYeeX�ZZej[eMB Z\d@dA� Z]G dBdC� dCe�Z^G dDdE� dEe^eZ�Z_G dFdG� dGeeX�Z`G dHdI� dIe�Zaeea�e jbG dJdK� dKe���Zceea�G dLdM� dMe��Zdedk�r�ed� ZenecdNdO� �Zee/e-e0e1e4fZfe jbG dPdQ� dQe��ZgdRdS� ZheeHji�G dTdU� dUe:jjeS��ZkG dVdW� dWe:jl�ZmdS )Xzt
Various asynchronous TCP/IP classes.
End users shouldn't use this module directly - use the reactor APIs instead.
� )�division�absolute_importN)� Interface�implementer)�Logger)�
lazyByteSlice�unicode)�platformType)�versions� deprecate)�ConnectionMixin�ClientMixin�ServerMixinc @ s e Zd ZdZdS )�_TLSConnectionMixinFN)�__name__�
__module__�__qualname__ZTLS� r r �6/usr/lib/python3/dist-packages/twisted/internet/tcp.pyr % s r c @ s e Zd ZdS )�_TLSClientMixinN�r r r r r r r r ) s r c @ s e Zd ZdS )�_TLSServerMixinNr r r r r r - s r �win32)� WSAEINVAL)�WSAEWOULDBLOCK)�WSAEINPROGRESS)�WSAEALREADY)�
WSAEISCONN)�
WSAENOBUFS)� WSAEMFILE)�
WSAECONNRESET)�formatError)�EPERM)�EINVAL)�EWOULDBLOCK)�EINPROGRESS)�EALREADY)�EISCONN)�ENOBUFS)�EMFILE)�ENFILE)�ENOMEM)�EAGAIN)�ECONNABORTED)�strerror)� errorcode)�base�address�fdesc)�
deferLater)�log�failure�reflect)�untilConcludes)�CannotListenError)�abstract�main�
interfaces�error)�ProtocolZAI_NUMERICSERVc C sN t | �dkr>t�| tjtjB �d }t|gt| dd� � �S | dd� S dS )ai
Return a 2-tuple of socket IP and port for IPv4 and a 4-tuple of
socket IP, port, flowInfo, and scopeID for IPv6. For IPv6, it
returns the interface portion (the part after the %) as a part of
the IPv6 address, which Python 3.7+ does not include.
@param addr: A 2-tuple for IPv4 information or a 4-tuple for IPv6
information.
� r � N� )�len�socket�getnameinfo�NI_NUMERICHOST�NI_NUMERICSERV�tuple�list)�addr�hostr r r �_getrealnameg s
��rJ c C s t | �� �S �z
See L{_getrealname}.
)rJ Zgetpeername��sktr r r �_getpeername{ s rN c C s t | �� �S rK )rJ �getsocknamerL r r r �_getsockname� s rP c @ s e Zd ZdZdZdd� ZdS )�
_SocketCloserz�
@ivar _shouldShutdown: Set to C{True} if C{shutdown} should be called
before calling C{close} on the underlying socket.
@type _shouldShutdown: C{bool}
Tc C s~ | j }z8|r| jr<|�d� n| j �t jt jt�ddd�� W n t jk
rT Y nX z|� � W n t jk
rx Y nX d S )Nr@ Ziir? r )
rB �_shouldShutdown�shutdown�
setsockopt�
SOL_SOCKETZ SO_LINGER�structZpackr<