
    8jJ                       d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZmZ ddlmZmZ ddlZddlmZ ddlmZmZmZmZ ej         G d	 d
ej                              Zeeez  eeeeef         ef         z           ez  Zej         G d dej                              Zej         G d dej                              Z dIdZ!dJdZ"dKdZ#dLdZ$dMdZ%dNdZ&dOd!Z'dPd%Z(dQd(Z)e j*        fdRd-Z+dSd1Z,dSd2Z-dTd3Z.ee j*        d4fdUd:Z/dVd>Z0	 	 dWdXd@Z1ej2        d4e j*        d4fdYdBZ3dZdEZ4d[dGZ5d\dHZ6dS )]a  Multicast DNS Service Discovery for Python, v0.14-wmcbrine
Copyright 2003 Paul Scott-Murphy, 2014 William McBrine

This module provides a framework for the use of DNS Service Discovery
using IP multicast.

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
    )annotationsN)IterableSequence)Anycast   )log)_IPPROTO_IPV6
_MDNS_ADDR_MDNS_ADDR6
_MDNS_PORTc                      e Zd ZdZdZdS )InterfaceChoice   r   N)__name__
__module____qualname__DefaultAll     I/home/user/adhan/venv/lib/python3.11/site-packages/zeroconf/_utils/net.pyr   r   )   s        G
CCCr   r   c                      e Zd ZdZdZdZdS )ServiceStateChanger   r      N)r   r   r   AddedRemovedUpdatedr   r   r   r   r   2   s        EGGGGr   r   c                      e Zd ZdZdZdZdS )	IPVersionr   r   r   N)r   r   r   V4OnlyV6Onlyr   r   r   r   r    r    9   s        FF
CCCr   r    addrbytesreturnboolc                (    t          |           dk    S )N   )len)r#   s    r   _is_v6_addressr*   C   s    t99?r   addressstrc                h    d| v }|rt           j        nt           j        }t          j        ||           S )N:)socketAF_INET6AF_INET	inet_pton)r+   is_ipv6address_familys      r   _encode_addressr5   G   s0    WnG(/CV__V^NNG444r   adaptersIterable[ifaddr.Adapter]	list[str]c                4    t          d | D                       S )Nc                >    h | ]}|j         D ]}|j        	|j        S r   )ipsis_IPv4ip.0ifacer#   s      r   	<setcomp>z)get_all_addresses_ipv4.<locals>.<setcomp>N   s0    UUUU59UU4UUUUUr   listr6   s    r   get_all_addresses_ipv4rE   M   s    UUhUUUVVVr   &list[tuple[tuple[str, int, int], int]]c                4    t          d | D                       S )Nc                L    h | ]!}|j         D ]}|j        	|j        |j        f"S r   )r;   is_IPv6r=   indexr>   s      r   rA   z)get_all_addresses_ipv6.<locals>.<setcomp>U   s7    \\\E%)\\$t|\$'5;	\\\\r   rB   rD   s    r   get_all_addresses_ipv6rK   Q   s'     \\X\\\  r   c                 z    t          j        dt          d           t          t	          j                              S )Nzget_all_addresses is deprecated, and will be removed in a future version. Use ifaddrdirectly instead to get a list of adapters.r   
stacklevel)warningswarnDeprecationWarningrE   ifaddrget_adaptersr   r   r   get_all_addressesrT   Y   ?    M	6	    "&"5"7"7888r   c                 z    t          j        dt          d           t          t	          j                              S )Nzget_all_addresses_v6 is deprecated, and will be removed in a future version. Use ifaddrdirectly instead to get a list of adapters.r   rM   )rO   rP   rQ   rK   rR   rS   r   r   r   get_all_addresses_v6rW   c   rU   r   r=    tuple[tuple[str, int, int], int]c                Z   d|v r|d |                     d                   }t          j        |          }| D ]b}|j        D ]X}|j         Ot	          |j        t                    r5t          j        |j        d                   |k    r|j        |j         fc c S Yct          d|           )N%r   z No adapter found for IP address )rJ   	ipaddress
ip_addressr;   
isinstancer=   tupleRuntimeError)r6   r=   ipaddradapter
adapter_ips        r   ip6_to_address_and_indexrc   m   s    
byy"((3-- !"%%F 6 6!+ 	6 	6J )z}e44 *(q)9::fDD"w}555555	6 >">>
?
??r   rJ   inttuple[str, int, int]c                    | D ]<}|j         |k    r/|j        D ]'}t          |j        t                    r|j        c c S (=t          d|           )NzNo adapter found for index )rJ   r;   r]   r=   r^   r_   )r6   rJ   ra   rb   s       r   interface_index_to_ip6_addressrg   ~   sv     ) )=E!!%k ) )
jmU33 )%=((((() <U<<
=
==r   
interfaces6Sequence[str | int | tuple[tuple[str, int, int], int]]c                Z   g }t          j                    }| D ]}t          |t                    r&|                    t          ||          |f           =t          |t                    r@t          j        |          j	        dk    r#|                    t          ||                     |S )zConvert IPv6 interface addresses to interface indexes.

    IPv4 addresses are ignored.

    :param interfaces: List of IP addresses and indexes.
    :returns: List of indexes.
       )rR   rS   r]   rd   appendrg   r,   r[   r\   versionrc   )rh   resultr6   r@   s       r   ip6_addresses_to_indexesro      s     F"$$H E EeS!! 	EMM9(EJJERSSSSs## 	E	(<U(C(C(Kq(P(PMM28UCCDDDMr   choiceInterfacesType
ip_version,list[str | tuple[tuple[str, int, int], int]]c                   g }| t           j        u r}|t          j        k    rGd}t	          j        |           t          j        |t          d           |	                    d           |t          j
        k    r|	                    d           n| t           j        u rt          j                    }|t          j        k    r"|                    t          |                     |t          j
        k    r"|                    t!          |                     |st#          d|           nFt%          | t&                    rd | D             }|t)          |           z  }nt+          d|           |S )	a-  Convert the interfaces choice into internal representation.

    :param choice: `InterfaceChoice` or list of interface addresses or indexes (IPv6 only).
    :param ip_address: IP version to use (ignored if `choice` is a list).
    :returns: List of IP addresses (for IPv4) and indexes (for IPv6).
    zIPv6 multicast requests can't be sent using default interface. Use V4Only, InterfaceChoice.All or an explicit list of interfaces.r   rM   ))z::r   r   r   z0.0.0.0zFNo interfaces to listen on, check that any interfaces have IP version c                v    g | ]6}t          |t                    t          j        |          j        d k    4|7S )   r]   r,   r[   r\   rm   r?   is     r   
<listcomp>z.normalize_interface_choice.<locals>.<listcomp>   sA    cccz!S'9'9ci>RST>U>U>]ab>b>b!>b>b>br   z.choice must be a list or InterfaceChoice, got )r   r   r    r!   r	   errorrO   rP   rQ   rl   r"   r   rR   rS   extendrK   rE   r_   r]   rC   ro   	TypeError)rp   rr   rn   messager6   s        r   normalize_interface_choicer      s    <>F((()))U  IgM'#5!DDDDMM+,,,)))MM)$$$	?&	&	&&(()))MM0::;;;)))MM0::;;; 	eYcee  	 
FD	!	! UccVccc*6222SSSTTTMr   ssocket.socketNonec                    	 |                      t          t          j        d           dS # t          $ r t          j        d            w xY w)z?Make V6 sockets work for both V4 and V6 (required for Windows).FzOSupport for dual V4-V6 sockets is not present, use IPVersion.V4 or IPVersion.V6N)
setsockoptr
   r/   IPV6_V6ONLYOSErrorr	   r{   )r   s    r   disable_ipv6_only_or_raiser      sU    	]F$6>>>>>   	cddds	   &*  A
c                    t          t          d          sdS 	 |                     t          j        t          j        d           dS # t
          $ r!}|j        t          j        k    r Y d}~dS d}~ww xY w)z*Set SO_REUSEADDR on a socket if available.SO_REUSEPORTNr   )hasattrr/   r   
SOL_SOCKETr   r   errnoENOPROTOOPT)r   errs     r   set_so_reuseport_if_availabler      s     6>** 	V&(;Q?????   9))) *)))))s   +A 
A1A,,A1c                    |t           j        k    rt          j        dd          }t          j        dd          }|                     t
          j        t
          j        |           |                     t
          j        t
          j        |           dS |t           j	        k    rN|                     t          t
          j        d           |                     t          t
          j        d           dS t          d          )z.Set ttl/hops and loop for mDNS respond socket.   B   r   Tz)Dual-stack responder socket not supportedN)r    r!   structpackr   r/   
IPPROTO_IPIP_MULTICAST_TTLIP_MULTICAST_LOOPr"   r
   IPV6_MULTICAST_HOPSIPV6_MULTICAST_LOOPr_   )r   rr   ttlloops       r   $set_respond_socket_multicast_optionsr      s    
 Y%%% k$$${4##	V&(?EEE	V&(@$GGGGG	y'	'	'	]F$>DDD	]F$>EEEEE FGGGr   F	bind_addr!tuple[str] | tuple[str, int, int]port	apple_p2psocket.socket | Nonec                   t          j        d||||            |t          j        k    rt          j        nt          j        }t	          j        |t          j                  }|t          j        k    rt          |           |
                    t          j        t          j        d           t          |           |r!|
                    t          j        dd           | d         |g| dd          R }	 |                    |           n# t          $ r}|j        t           j        k    rt          j        d|           Y d }~d S |j        t           j        k    rit(          j                            d          st(          j                            d          rt          j        d|           nt          j        d	|            d }~ww xY wt          j        d
|           |S )NzNCreating new socket with port %s, ip_version %s, apple_p2p %s and bind_addr %rr   i  r   zRAddress not available when binding to %s, it is expected to happen on some systemsdarwinfreebsdzAddress in use when binding to %s; On BSD based systems sharing the same port with another stack may require processes to run with the same UID; When using avahi, make sure disallow-other-stacks is set to no in avahi-daemon.confzvAddress in use when binding to %s; When using avahi, make sure disallow-other-stacks is set to no in avahi-daemon.confzCreated socket %s)r	   debugr    r!   r/   r1   r0   
SOCK_DGRAMr   r   r   r   SO_REUSEADDRr   bindr   r   EADDRNOTAVAILwarning
EADDRINUSEsysplatform
startswithr{   )r   r   rr   r   socket_familyr   bind_tupexs           r   
new_socketr     s    IX   '1I4D&D&DFNN&/MmV%677AY]"""1%%%LL"F$7;;;!!$$$ 3 	
V&222 !d3Yqrr]33H	x   8u***Kd   444448u'''|&&x00 CL4K4KI4V4V 	2
     	2 	   	56 I!1%%%Hs   2D 
G*GA?GGlisten_socket	interface&str | tuple[tuple[str, int, int], int]c                   t          |t                    }t          j        h}t          j        dk    r#|t          t          t                    j        hz  }t          j
        d||                                            	 |r	 t          j        t          j        t                    }n&# t           $ r t          j        d|           Y dS w xY wt%          j        dt          t(          |d                             }||z   }|                     t,          t          j        |           nlt          j        t2                    t          j        t          t4          |                    z   }|                     t          j        t          j        |           nR# t           $ rD}t;          |          }|t          j        k    rt          j        d|           Y d }~dS |t          j        k    rR|s5t          j                             d          rt          j!        d	|           nt          j!        d
|           Y d }~dS |t          j"        k    rt          j        d|           Y d }~dS ||v rt          j        d|           Y d }~dS |t          j#        k    rt          j        d|           Y d }~dS |r+|t          j$        k    rt          j        d|           Y d }~dS  d }~ww xY wdS )Nwin32z(Adding %r (socket %d) to multicast groupzuUnable to translate IPv6 address when adding %s to multicast group, this can happen if IPv6 is disabled on the systemF@Ir   zZAddress in use when adding %s to multicast group, it is expected to happen on some systemslinuxzNo buffer space available when adding %s to multicast group, try increasing `net.ipv4.igmp_max_memberships` to `1024` in sysctl.confz<No buffer space available when adding %s to multicast group.zaAddress not available when adding %s to multicast group, it is expected to happen on some systemszAInterface of %s does not support multicast, it is expected in WSLzdFailed to set socket option on %s, this can happen if the network adapter is in a disconnected statezmAddress in use when adding %s to multicast group, it is expected to happen when the device does not have ipv6T)%r]   r^   r   EINVALr   r   r   r   	WSAEINVALr	   r   filenor/   r2   r0   r   r   infor   r   rd   r   r
   IPV6_JOIN_GROUP	inet_atonr   r,   r   IP_ADD_MEMBERSHIP	get_errnor   ENOBUFSr   r   r   r   ENODEV)	r   r   is_v6
err_einvalmdns_addr6_bytes	iface_bin_valuee_errnos	            r   add_multicast_memberr   C  s2   
 y%((E,J
|wtC''122
I8)]EYEYE[E[\\\B 	Z#)#3FO[#Q#Q     H  
 uu D$sIaL*A*ABBI%	1F$$]F4JFSSSS%j11F4DT#yEYEY4Z4ZZF$$V%68PRXYYY 1 1 11U%%%Hl   55555U]"" 
S\44W== 
^    R   55555U(((HB  
 55555ZHS   55555U&&&HA  
 55555 	Vu|++HN  
 55555c1d 4sb   ?F $B' &F 'C
F 	C

C	F K$ 4KAK<%K'K%K1'KKK$unicastc           
     (   t          | t                    }t          |rEt          t          t          t          t
          t
          f         t
          f         |           d         nt          t          |           f|rdnt          |rt          j        nt          j	        |          }|r|S |sdS t          j        d||            |rUt          j        dt          t
          | d                             }|                    t          t           j        |           nP|                    t           j        t           j        t!          j        t          t          |                                t+          ||rt          j        nt          j	                   |S )zECreate interface specific socket for responding to multicast queries.r   )r   r   rr   r   Nz1Configuring socket %s with multicast interface %sr   r   )r]   r^   r   r   r,   rd   r   r    r"   r!   r	   r   r   r   r   r
   r/   IPV6_MULTICAST_IFr   IP_MULTICAST_IFr   r   )r   r   r   r   respond_socketr   s         r   new_respond_socketr     si    y%((E  JOl$uU3S=1367CCAFFVZ[^`iVjVjUl)QQz(-CI$$93C	  N   tIA>S\]]] 
Kd3	!&=&=>>	!!-1I9UUUU!!"T#y1122	
 	
 	

 )U9h9I9IXaXhiiir   0tuple[socket.socket | None, list[socket.socket]]c                2   |rd }nt          d||          }t          | |          }|s| t          j        u r|t          j        k    rr|D ]*}t          t          t          j        |          |           +t          t          t          j        |          |           |t          t          j        |          gfS g }|D ]V}|s)t          t          t          j        |          |          s-t          |||          }||                    |           W||fS )N) )r   rr   r   )r   r   )r   r   r   r   r    r   r   r   r/   r   r   rl   )	rh   r   rr   r   r   normalized_interfacesr   respond_socketsr   s	            r   create_socketsr     s=     `"UzU^___6z:NN  Cz_%<<<y}A\A\. 	P 	PI fm]!C!CYOOOO,T&--O-OQ[\\\tFM=AABBBO* 3 3	 	3D4V4VXabb 	+IT[\\\%"">222/))r   r   r   c                B    t          t          | j        d                   S )Nr   )r   rd   args)r   s    r   r   r     s    QVAYr   ipv6_socketc                    | rd|v nd|vS )zCheck if the address type matches the socket type.

    This function does not validate if the address is a valid
    ipv6 or ipv4 address.
    r.   r   )r   r+   s     r   can_send_tor     s     )@3'>>c.@@r   c                    t          | t                    rPt          d | D                       }t          d | D                       }|r|rt          j        S |rt          j        S t          j        S )z3Auto detect the IP version when it is not provided.c              3     K   | ]K}t          |t                    p1t          |t                    ot          j        |          j        d k    V  LdS )rk   N)r]   rd   r,   r[   r\   rm   rx   s     r   	<genexpr>z(autodetect_ip_version.<locals>.<genexpr>  sh       
 
 q#_:a#5#5#^):Nq:Q:Q:Y]^:^
 
 
 
 
 
r   c              3  z   K   | ]6}t          |t                    ot          j        |          j        d k    V  7dS )rv   Nrw   rx   s     r   r   z(autodetect_ip_version.<locals>.<genexpr>  sE      eeUVZ3''PI,@,C,C,Kq,Peeeeeer   )r]   rC   anyr    r   r"   r!   )rh   has_v6has_v4s      r   autodetect_ip_versionr     s    *d## 	$ 
 

 
 
 
 
 eeZdeeeee 	!f 	!=  	$##r   )r#   r$   r%   r&   )r+   r,   r%   r$   )r6   r7   r%   r8   )r6   r7   r%   rF   )r%   r8   )r%   rF   )r6   r7   r=   r,   r%   rX   )r6   r7   rJ   rd   r%   re   )rh   ri   r%   rF   )rp   rq   rr   r    r%   rs   )r   r   r%   r   )r   r   rr   r    r%   r   )
r   r   r   rd   rr   r    r   r&   r%   r   )r   r   r   r   r%   r&   )FF)r   r   r   r&   r   r&   r%   r   )
rh   rq   r   r&   rr   r    r   r&   r%   r   )r   r   r%   rd   )r   r&   r+   r,   r%   r&   )rh   rq   r%   r    )7__doc__
__future__r   enumr   r[   r/   r   r   rO   collections.abcr   r   typingr   r   rR   _loggerr	   constr
   r   r   r   uniqueEnumr   r,   rd   r^   rq   r   r    r*   r5   rE   rK   rT   rW   rc   rg   ro   r!   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>r      s   , # " " " " "         



  . . . . . . . .                F F F F F F F F F F F F     di   
 #)eE#sC-,@#,E&FFG/Y             	      5 5 5 5W W W W   9 9 9 99 9 9 9@ @ @ @"> > > >   . 5>4D* * * * *Z      &H H H H> %,	; ; ; ; ;|N N N Nf # # # # #N "1!4%,	"* "* "* "* "*J       A A A A     r   