o
    Þý°jy  ã                   @   sÜ   d Z ddlZddlmZmZ ddlZddlZejZej	Z	de
dedefdd„Zde
d	edefd
d„Zdede
fdd„Zdedefdd„Zdedefdd„Zddeee
f de
dB defdd„Zdd„ Zdedefdd„ZdS )z*Generic Internet address helper functions.é    N)ÚAnyÚTupleÚfamilyÚtextÚreturnc                 C   s.   | t kr
tj |¡S | tkrtj |d¡S t‚)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``.
    T)ÚAF_INETÚdnsÚipv4Ú	inet_atonÚAF_INET6Úipv6ÚNotImplementedError)r   r   © r   ú{/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/dns/inet.pyÚ	inet_pton!   s
   r   Úaddressc                 C   s,   | t kr
tj |¡S | tkrtj |¡S t‚)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``.
    )r   r   r	   Ú	inet_ntoar   r   r   )r   r   r   r   r   Ú	inet_ntop6   s
   r   c                 C   sN   z	t j | ¡ tW S  ty&   zt j | d¡ tW  Y S  ty%   t‚w w )zäDetermine 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``.
    T)r   r	   r
   r   Ú	Exceptionr   r   Ú
ValueError©r   r   r   r   Úaf_for_addressK   s   
ÿür   c                 C   sf   zt j | ¡d }|dko|dkW S  ty2   zt j | d¡d }|dkW  Y S  ty1   t‚w w )zÝIs 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éÿ   )r   r	   r
   r   r   r   )r   Úfirstr   r   r   Úis_multicasta   s   ÿür   c                 C   sP   z	t j | ¡ W dS  ty'   zt j | d¡ W Y dS  ty&   Y Y dS w w )z{Is the specified string an IPv4 or IPv6 address?

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

    Returns a ``bool``.
    TF)r   r	   r
   r   r   r   r   r   r   Ú
is_addressw   s   ÿür   Ú
high_tupleÚafc           
      C   sÜ   | \}}|du rt |ƒ}|tkr||fS |tkrg| d¡}|dk r'||ddfS |d|… }||d d… }| ¡ rA||dt|ƒfS z
||dt |¡fW S  tyf   tj	}tj
|||d�^�^ }}	}|	 Y S w td|› �ƒ‚)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ÚiÚaddrpartÚscopeÚai_flagsÚ_Útupr   r   r   Úlow_level_address_tupleŠ   s*   	
ýr3   c                 C   s*   | t jkrdS | t jkrdS td| › �ƒ‚)z:Return the 'any' address for the specified address family.z0.0.0.0z::r#   )r'   r   r   r   )r   r   r   r   Ú
any_for_af¬   s
   

r4   c                 C   sD   zt j | ¡W S  ty!   z	t j | ¡W  Y S  ty    t‚w w )a   Verify that *address* is a valid text form IPv4 or IPv6 address and return its
    canonical text form.  IPv6 addresses with scopes are rejected.

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

    Raises ``ValueError`` if the text is not valid.
    )r   r   Úcanonicalizer   r	   r   r   r   r   r   r5   µ   s   ÿýr5   )N)Ú__doc__r'   Útypingr   r   Údns.ipv4r   Údns.ipv6r   r   r&   ÚstrÚbytesr   r   r   Úboolr   r   r3   r4   r5   r   r   r   r   Ú<module>   s   $"	