
    Vh%              	          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      xs d	      Zej8                  j;                  d
      sej8                  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e      Z! G d de      Z" G d de      Z# G d de      Z$ G d de      Z% G 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jR                  Z) ee'      ge)_*        ee)_+        ejX                  Z,e'ge,_*        d" Z-d# Z.d$ Z/y)%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                       e Zd Zd edz  fgZy)in_addr   N__name__
__module____qualname__r   _fields_     R/home/dcms/DCMS/lib/python3.12/site-packages/twisted/internet/test/_posixifaces.pyr   r   ,   s    	GaK Hr'   r   c                       e Zd Zdedz  fgZy)in6_addrr      Nr!   r&   r'   r(   r*   r*   2   s    	GbL!Hr'   r*   c                       e Zd Zedefgz   Zy)sockaddrsin_portN)r"   r#   r$   r   r   r%   r&   r'   r(   r-   r-   8   s    	X" Hr'   r-   c                   "    e Zd Zedefdefgz   Zy)sockaddr_inr.   sin_addrN)r"   r#   r$   r   r   r   r%   r&   r'   r(   r0   r0   >   s!    	X	W" Hr'   r0   c                   (    e Zd Zedefdefdefgz   Zy)sockaddr_in6r.   sin_flowinfor1   N)r"   r#   r$   r   r   r
   r*   r%   r&   r'   r(   r3   r3   E   s)    	X	"	X" Hr'   r3   c                       e Zd Zy)ifaddrsN)r"   r#   r$   r&   r'   r(   r6   r6   M   s    r'   r6   ifa_nextifa_name	ifa_flagsifa_addrifa_netmaskifa_dstaddrifa_datac                 p    t         j                  j                  d      r|dd dk(  r|dd dz   |dd z   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packeds     r(   _maybeCleanupScopeIndexrE   d   sD    ( ||y)fRajK.GbqzK'&*44Mr'   c                     t               } t        t        |             dk  r
t               g }	 | r| d   j                  r| d   j                  d   j
                  }|t        k(  r't        | d   j                  t        t                    }n2|t        k(  r't        | d   j                  t        t                    }nd}|r\t        |d   j                  j                  dd       }t        ||      }|j!                  | d   j"                  |t%        ||      f       | d   j&                  } | rt)        |        |S # t)        |        w xY 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   OSErrorr:   r   r   r   r   r0   r   r3   bytesr1   r   rE   appendr8   r   r7   freeifaddrs)r6   resultsrC   addrrD   s        r(   _interfacesrO   }   s)   
 kG''"#a'iGqz"" ,,Q/::W$
 3 3W[5IJDx'
 3 3W\5JKDD"47#3#3#;#;A#>?F4VVDFNN ,,fi6OP aj))G# & 	GN 	Gs   C>D; ;Ec                      g } t               D ]X  \  }}}t        |      }t        |      }|t        j                  k(  s1|j	                  d      sC| j                  | d|        Z | 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:%)rO   r   socketr   rB   rK   )retList	interfacerC   addresss       r(   posixGetLinkLocalIPv6AddressesrV      sl    
 G&1m 5"	67 +	w'V__$););G)DNNgYa	{34	5
 Nr'   )0__doc__rR   r@   ctypesr   r   r   r   r   r   r	   r
   r   r   r   r   ctypes.utilr   r   r   r   typingr   r   r   twisted.python.compatr   libcrA   rB   r   str__annotations__r   r*   r-   r0   r3   r6   rG   r%   rH   argtypesrestyperL   rE   rO   rV   r&   r'   r(   <module>ra      s  
  
    % / / # # .L#$<<9%)A	G	w.OT%S/*  
x .OT%S/* 
i y y ) 9 	i 	 G	("#GH%&GH%&  __
y)*
 
 !{ 2Br'   