o
    ¯b'  ã                   @   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ƒpMd	ƒZej d
¡sZejdkrmd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ÚdarwinÚ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$   úD/usr/lib/python3/dist-packages/twisted/internet/test/_posixifaces.pyr   ,   ó    
ÿr   c                   @   s   e Zd Zded fgZdS )Úin6_addrr   é   Nr   r$   r$   r$   r%   r'   2   r&   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*   Ú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_nameÚ	ifa_flagsÚifa_addrÚifa_netmaskÚifa_dstaddrÚifa_datac                 C   s<   t j d¡r|dd… dkr|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   r=   c                  C   sö   t ƒ } tt| ƒƒdk rtƒ ‚g }ze| ro| d jra| d jd j}|tkr/t| d jtt	ƒƒ}n|t
kr>t| d jttƒƒ}nd}|rat|d jjdd… ƒ}t||ƒ}| | d j|t||ƒf¡ | d j} | sW t| ƒ |S W t| ƒ |S t| ƒ w )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   ÚOSErrorr3   r   r   r   r   r+   r   r-   Úbytesr,   r   r=   Úappendr1   r   r0   Úfreeifaddrs)r/   Úresultsr;   Úaddrr<   r$   r$   r%   Ú_interfaces}   s6   

ÿ
ïì
ÿrF   c                  C   sR   g } t ƒ D ]!\}}}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:ú%)rF   r   Úsocketr   r:   rB   )ÚretListÚ	interfacer;   Úaddressr$   r$   r%   ÚposixGetLinkLocalIPv6Addressesž   s   €rL   )0Ú__doc__rH   r8   Úctypesr   r   r   r   r   r   r   r	   r
   r   r   r   Úctypes.utilr   r   r   r   Útypingr   r   r   Útwisted.python.compatr   Úlibcr9   r:   r   ÚstrÚ__annotations__r   r'   r)   r+   r-   r/   r>   r#   r?   ÚargtypesÚrestyperC   r=   rF   rL   r$   r$   r$   r%   Ú<module>   sL   8þÿ


ù
!