File: //lib64/python3.6/site-packages/tornado/__pycache__/netutil.cpython-36.opt-1.pyc
3
��f�X � @ s� d Z ddlZddlZddlZddlZddlZddlZddlZddl m
Z
mZ ddlm
Z
ddlmZ ddlmZmZ ddlZddlmZmZmZmZmZmZmZmZ ejr�ddlmZ ejej j!�Z"ejej j#�Z$e%ed �r�e" j&ej'O _&e$ j&ej'O _&d
j(d� d
j(d� ej)ej*fZ+e%ed
��r4e+ej,f7 Z+dZ-dej.e-ddfe/e0ej1e/e/e2eej d�dd�Z3e%ed��r�de-fe0e/e/ejd�dd�Z4ejeejegdf eg df d�dd�Z5e0e2d�dd�Z6G dd� de�Z7ej.fe0e/ej1eee/ef d �d!d"�Z8G d#d$� d$e7�Z9G d%d&� d&e7�Z:G d'd(� d(e:�Z;G d)d*� d*e:�Z<G d+d,� d,e7�Z=e>d-d.d/d0d1d2g�Z?eee0ef ej@f ej@d3�d4d5�ZAd9ejeee0ef ej@f e0eejBd6�d7d8�ZCdS ):z#Miscellaneous network utility code.� N)�dummy_executor�run_on_executor)�IOLoop)�set_close_exec)�Configurable�errno_from_exception)�List�Callable�Any�Type�Dict�Union�Tuple� Awaitable)�Future�OP_NO_COMPRESSIONZfooZidna�latin1�WSAEWOULDBLOCK� F)�port�address�family�backlog�flags�
reuse_port�returnc # C sD |rt td� rtd��g }|dkr(d}tj r@|tjkr@tj}|dkrNtj}d}t� }�x�ttj || |tj
d|�dd� d�D �]�} | |kr�q~|j| � | \}
}}}
}tj
d kr�|d
kr�|
tjkr�|d dkr�q~ytj|
||�}W n: tjk
�r } zt|�tjk�r
w~� W Y dd}~X nX t|j� � tjdk�r�y|jtjtjd
� W n8 tjk
�r� } zt|�tjk�rt� W Y dd}~X nX |�r�|jtjtjd
� |
tjk�r�t td��r�|jtjtjd
� |dd� \}}|dk�r|dk �rt||gt|dd� � �}|j d� |j!|� |j"� d
}|j#|� |j$|� q~W |S )a Creates listening sockets bound to the given port and address.
Returns a list of socket objects (multiple sockets are returned if
the given address maps to multiple IP addresses, which is most common
for mixed IPv4 and IPv6 use).
Address may be either an IP address or hostname. If it's a hostname,
the server will listen on all IP addresses associated with the
name. Address may be an empty string or None to listen on all
available interfaces. Family may be set to either `socket.AF_INET`
or `socket.AF_INET6` to restrict to IPv4 or IPv6 addresses, otherwise
both will be used if available.
The ``backlog`` argument has the same meaning as for
`socket.listen() <socket.socket.listen>`.
``flags`` is a bitmask of AI_* flags to `~socket.getaddrinfo`, like
``socket.AI_PASSIVE | socket.AI_NUMERICHOST``.
``reuse_port`` option sets ``SO_REUSEPORT`` option for every socket
in the list. If your platform doesn't support this option ValueError will
be raised.
�SO_REUSEPORTz)the platform doesn't support SO_REUSEPORT� Nr c S s | d S )Nr � )�xr r �/usr/lib64/python3.6/netutil.py�<lambda>v s zbind_sockets.<locals>.<lambda>)�key�darwinZ localhost� �nt� �IPPROTO_IPV6� F)%�hasattr�socket�
ValueErrorZhas_ipv6� AF_UNSPECZAF_INETZ
AI_PASSIVE�set�sorted�getaddrinfo�SOCK_STREAM�add�sys�platformZAF_INET6�errorr �errnoZEAFNOSUPPORTr �fileno�os�name�
setsockopt�
SOL_SOCKET�SO_REUSEADDR�ENOPROTOOPTr r'