U
    2ÜŸj%  ã                   @   sÞ  U d Z ddlZddlZddlmZmZmZmZmZm	Z	m
Z
mZmZmZmZmZ ddlmZ ddlmZmZmZ ddlmZmZmZ ddlmZ eedƒpšd	ƒZej d
¡s´ejdkrÚde
fde
fgZeeeef  e d< ndefgZeeeef  e d< G dd„ deƒZ!G dd„ deƒZ"G dd„ deƒZ#G dd„ deƒZ$G dd„ deƒZ%G dd„ deƒZ&ee&ƒZ'de'fdefdefdee#ƒfdee#ƒfd ee#ƒfd!efge&_(ej)Z)ee'ƒge)_*ee)_+ej,Z,e'ge,_*d"d#„ Z-d$d%„ Z.d&d'„ Z/dS )(z>
POSIX implementation of local network interface enumeration.
é    N)ÚCDLLÚPOINTERÚ	StructureÚc_char_pÚc_intÚc_ubyteÚc_uint8Úc_uint32Úc_ushortÚc_void_pÚcastÚpointer)Úfind_library)ÚAF_INETÚAF_INET6Ú	inet_ntop)ÚAnyÚListÚTuple)ÚnativeStringÚcÚ ÚfreebsdÚdarwinZsin_lenÚ
sin_familyÚ_sockaddrCommonc                   @   s   e Zd Zd ed fgZdS )Úin_addré   N©Ú__name__Ú
__module__Ú__qualname__r   Ú_fields_© r#   r#   úF/tmp/pip-unpacked-wheel-4b529toj/twisted/internet/test/_posixifaces.pyr   ,   s   
ÿr   c                   @   s   e Zd Zded fgZdS )Úin6_addrr   é   Nr   r#   r#   r#   r$   r%   2   s   
ÿr%   c                   @   s   e Zd Zedefg ZdS )ÚsockaddrÚsin_portN)r   r    r!   r   r
   r"   r#   r#   r#   r$   r'   8   s   ÿr'   c                   @   s    e Zd Zedefdefg ZdS )Úsockaddr_inr(   Úsin_addrN)r   r    r!   r   r
   r   r"   r#   r#   r#   r$   r)   >   s   þr)   c                   @   s&   e Zd Zedefdefdefg ZdS )Úsockaddr_in6r(   Zsin_flowinfor*   N)r   r    r!   r   r
   r	   r%   r"   r#   r#   r#   r$   r+   E   s
   ýr+   c                   @   s   e Zd ZdS )ÚifaddrsN)r   r    r!   r#   r#   r#   r$   r,   M   s   r,   Úifa_nextÚifa_nameZ	ifa_flagsÚifa_addrZifa_netmaskZifa_dstaddrZifa_datac                 C   s<   t j d¡r8|dd… dkr8|dd… d |dd…  S |S )až  
    On FreeBSD, kill the embedded interface indices in link-local scoped
    addresses.

    @param family: The address family of the packed address - one of the
        I{socket.AF_*} constants.

    @param packed: The packed representation of the address (ie, the bytes of a
        I{in_addr} field).
    @type packed: L{bytes}

    @return: The packed address with any FreeBSD-specific extra bits cleared.
    @rtype: L{bytes}

    @see: U{https://twistedmatrix.com/trac/ticket/6843}
    @see: U{http://www.freebsd.org/doc/en/books/developers-handbook/ipv6.html#ipv6-scope-index}

    @note: Indications are that the need for this will be gone in FreeBSD >=10.
    r   Né   s   þ€s     r   )ÚsysÚplatformÚ
startswith)ÚfamilyÚpackedr#   r#   r$   Ú_maybeCleanupScopeIndexd   s    r6   c                  C   sà   t ƒ } tt| ƒƒdk rtƒ ‚g }z°| rÎ| d jrÂ| d jd j}|tkr^t| d jt	t
ƒƒ}n"|tkr|t| d jt	tƒƒ}nd}|rÂt|d jjdd… ƒ}t||ƒ}| | d j|t||ƒf¡ | d j} q"W 5 t| ƒ X |S )z—
    Call C{getifaddrs(3)} and return a list of tuples of interface name, address
    family, and human-readable address representing its results.
    r   N)Ú	ifaddrs_pÚ
getifaddrsr   ÚOSErrorÚfreeifaddrsr/   r   r   r   r   r)   r   r+   Úbytesr*   r   r6   Úappendr.   r   r-   )r,   Úresultsr4   Úaddrr5   r#   r#   r$   Ú_interfaces}   s,    

ÿ
r?   c                  C   sR   g } t ƒ D ]B\}}}t|ƒ}t|ƒ}|tjkr
| d¡r
|  |› d|› �¡ q
| S )z£
    Return a list of strings in colon-hex format representing all the link local
    IPv6 addresses available on the system, as reported by I{getifaddrs(3)}.
    zfe80:ú%)r?   r   Úsocketr   r3   r<   )ZretListZ	interfacer4   Úaddressr#   r#   r$   ÚposixGetLinkLocalIPv6Addressesž   s    rC   )0Ú__doc__rA   r1   Úctypesr   r   r   r   r   r   r   r	   r
   r   r   r   Zctypes.utilr   r   r   r   Útypingr   r   r   Ztwisted.python.compatr   Úlibcr2   r3   r   ÚstrÚ__annotations__r   r%   r'   r)   r+   r,   r7   r"   r8   ÚargtypesÚrestyper:   r6   r?   rC   r#   r#   r#   r$   Ú<module>   sJ   8þÿ


ù
!