U
    d                     @   s   d Z ddlZddlmZmZmZ ddlZddlZej	Z	ej
Z
eeedddZeeeddd	Zeed
ddZeed
ddZeed
ddZdeeef ee edddZdd ZdS )z*Generic Internet address helper functions.    N)AnyOptionalTuple)familytextreturnc                 C   s2   | t krtj|S | tkr*tj|dS tdS )a  Convert the textual form of a network address into its binary form.

    *family* is an ``int``, the address family.

    *text* is a ``str``, the textual address.

    Raises ``NotImplementedError`` if the address family specified is not
    implemented.

    Returns a ``bytes``.
    TN)AF_INETdnsipv4	inet_atonAF_INET6ipv6NotImplementedError)r   r    r   ,/tmp/pip-unpacked-wheel-pk5slln3/dns/inet.py	inet_pton!   s
    r   )r   addressr   c                 C   s0   | t krtj|S | tkr(tj|S tdS )a0  Convert the binary form of a network address into its textual form.

    *family* is an ``int``, the address family.

    *address* is a ``bytes``, the network address in binary form.

    Raises ``NotImplementedError`` if the address family specified is not
    implemented.

    Returns a ``str``.
    N)r   r	   r
   	inet_ntoar   r   r   )r   r   r   r   r   	inet_ntop6   s
    r   )r   r   c                 C   s^   zt j|  tW S  tk
rX   zt j| d tW  Y S  tk
rR   tY nX Y nX dS )zDetermine the address family of a textual-form network address.

    *text*, a ``str``, the textual address.

    Raises ``ValueError`` if the address family cannot be determined
    from the input.

    Returns an ``int``.
    TN)r	   r
   r   r   	Exceptionr   r   
ValueErrorr   r   r   r   af_for_addressK   s    
r   c                 C   sv   z"t j| d }|dko |dkW S  tk
rp   z t j| dd }|dkW  Y S  tk
rj   tY nX Y nX dS )zIs the textual-form network address a multicast address?

    *text*, a ``str``, the textual address.

    Raises ``ValueError`` if the address family cannot be determined
    from the input.

    Returns a ``bool``.
    r         T   N)r	   r
   r   r   r   r   )r   firstr   r   r   is_multicasta   s    r   c                 C   s\   zt j|  W dS  tk
rV   zt j| d W Y dS  tk
rP   Y Y dS X Y nX dS )z{Is the specified string an IPv4 or IPv6 address?

    *text*, a ``str``, the textual address.

    Returns a ``bool``.
    TFN)r	   r
   r   r   r   r   r   r   r   
is_addressw   s    r   )
high_tupleafr   c           
      C   s   | \}}|dkrt |}|tkr(||fS |tkr|d}|dk rN||ddfS |d| }||d d }| r||dt|fS z||dt|fW S  tk
r   tj	}tj
|||d^^ }}	}|	 Y S X ntd| dS )aX  Given a "high-level" address tuple, i.e.
    an (address, port) return the appropriate "low-level" address tuple
    suitable for use in socket calls.

    If an *af* other than ``None`` is provided, it is assumed the
    address in the high-level tuple is valid and has that af.  If af
    is ``None``, then af_for_address will be called.
    N%r      )flagsunknown address family )r   r   r   findisdigitintsocketif_nametoindexAttributeErrorAI_NUMERICHOSTgetaddrinfor   )
r   r    r   portiZaddrpartZscopeZai_flags_tupr   r   r   low_level_address_tuple   s(    
r1   c                 C   s.   | t jkrdS | t jkrdS td|  dS )z:Return the 'any' address for the specified address family.z0.0.0.0z::r$   N)r(   r   r   r   )r    r   r   r   
any_for_af   s
    

r2   )N)__doc__r(   typingr   r   r   Zdns.ipv4r	   Zdns.ipv6r   r   r'   strbytesr   r   r   boolr   r   r1   r2   r   r   r   r   <module>   s$    
 $