a
    kÄ#dþ  ã                   @   s¬   d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	m
Z
 ddlmZmZ e d¡Ze d¡Zdd	„ ZejejejeiZd
d„ Zdd„ ZejejejeiZdd„ ZdS )z§
Convert IPv6 addresses between textual representation and binary.

These functions are missing when python is compiled
without IPv6 support, on Windows for instance.
é    )Úabsolute_importN)Ú	plain_strÚ	hex_bytesÚbytes_encodeÚ	bytes_hex)ÚAddressFamilyÚUnionz(?::|^)(0(?::0)+)(?::|$)z-illegal IP address string passed to inet_ptonc              
   C   sn  d}d}t | ƒ} | dkrdS |  d¡r2| dd… } |  d¡rH| dd… } |  d¡}t|ƒ}t|ƒD ]°\}}|s†|du r€t|ƒ}nt‚qb|d |krÚd|v rÚ| d¡d	kr¬t‚z|t 	|¡7 }W n tj
yÖ   t‚Y n0 qbz|t| d
d¡ƒ7 }W qb tjtf�y   t‚Y qb0 qb|du�rXt|ƒdk�r0t‚|d|… ddt|ƒ   ||d…  }t|ƒdk�rjt‚|S )zuConvert an IPv6 address from text representation into binary form,
used when socket.inet_pton is not available.

    Nó    z::s                   é   éÿÿÿÿú:Ú.é   é   Ú0é   ó    )r   Ú
startswithÚendswithÚsplitÚlenÚ	enumerateÚ_INET6_PTON_EXCÚcountÚsocketÚ	inet_atonÚerrorr   ÚrjustÚbinasciiÚErrorÚ	TypeError)ÚaddrZ	joker_posÚresultÚpartsZnpartsÚiÚpart© r&   úF/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/pton_ntop.pyÚ_inet6_pton   sH    





ÿr(   c                 C   s^   t |ƒ}zt | |¡W S  tyX   zt|  |ƒW  Y S  tyR   t d¡‚Y n0 Y n0 dS )z@Convert an IP address from text representation into binary form.z(Address family not supported by protocolN)r   r   Ú	inet_ptonÚAttributeErrorÚ
_INET_PTONÚKeyErrorr   ©Úafr!   r&   r&   r'   r)   V   s    r)   c                    sŒ   t ˆ ƒdkrtdƒ‚d ‡ fdd„tdddƒD ƒ¡}z<tt |¡dd	„ d
�}d |d| ¡ … || 	¡ d… ¡W S  ty†   | Y S 0 dS )zuConvert an IPv6 address from binary form into text representation,
used when socket.inet_pton is not available.

    r   z*invalid length of packed IP address stringr   c                 3   s0   | ](}t tˆ ||d  … ƒƒ d¡p&dV  qdS )é   r   N)r   r   Úlstrip)Ú.0Úidx©r!   r&   r'   Ú	<genexpr>p   s   ÿz_inet6_ntop.<locals>.<genexpr>r   r/   c                 S   s   |   d¡|  d¡ S )Nr
   )ÚendÚstart)Úmr&   r&   r'   Ú<lambda>z   r	   z_inet6_ntop.<locals>.<lambda>)Úkeyz{}::{}N)
r   Ú
ValueErrorÚjoinÚrangeÚmaxÚ
_IP6_ZEROSÚfinditerÚformatr6   r5   )r!   ÚaddressÚmatchr&   r3   r'   Ú_inet6_ntope   s    
ÿ
ÿ&rC   c                 C   s`   t |ƒ}zt | |¡W S  tyZ   zt|  |ƒW  Y S  tyT   td|  ƒ‚Y n0 Y n0 dS )z@Convert an IP address from binary form into text representation.zunknown address family %dN)r   r   Ú	inet_ntopr*   Ú
_INET_NTOPr,   r:   r-   r&   r&   r'   rD   †   s    rD   )Ú__doc__Ú
__future__r   r   Úrer   Zscapy.compatr   r   r   r   r   r   Úcompiler>   r   r   r(   ÚAF_INETr   ÚAF_INET6r+   r)   rC   Ú	inet_ntoarE   rD   r&   r&   r&   r'   Ú<module>   s$   

5þþ