
    tniF                     x	   U d dl mZmZ ddlZej         ej        ej                  k    se e	d           ej
                    s e	d          d dlmZ d dlmZmZm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 dd
lmZ ddlmZmZmZmZmZm Z  ddl!m"Z" e#e$e%f         Z&e#e$e%e%e%f         Z'ej(        Z(ej)        Z)ej*        Z*ej+        Z+ej,        Z,ej-        Z-ej.        Z.ej/        Z/ej0        Z0ej1        Z1ej2        Z2ej3        Z3ej4        Z4ej5        Z5ej6        Z6ej7        Z7ej8        Z8ej9        Z9ej:        Z:ej;        Z;ej<        Z<ej=        Z=ej>        Z>ej?        Z?ej@        Z@ejA        ZAejB        ZCejD        ZEejF        ZGejH        ZIejJ        ZKejL        ZMejN        ZOejP        ZQejR        ZSejT        ZUejV        ZWejX        ZYejZ        Z[ej\        Z]ej^        Z_ej`        Zaejb        Zcejd        Zeejf        Zgejh        Zi e ejj         ejk        ejl                                      ZmdZn G d deo          Zpi Zqeedf         erd<    ejs                    d             Zt ejs                    d             Zu ejs                    d             Zv ejs                    d             Zw ejs                    d             Zxd Zyd Zzd Z{ G d d          Z| e|            Z} G d d          Z~e G d d                      Ze G d d                       Ze G d! d"                      Ze G d# d$                      Ze G d% d&                      Ze G d' d(                      Ze G d) d*                      Ze G d+ d,                      Ze G d- d.                      Ze G d/ d0                      Ze G d1 d2                      Ze G d3 d4                      Ze G d5 d6                      Ze G d7 d8                      Ze G d9 d:                      Ze G d; d<                      Ze G d= d>                      Ze G d? d@                      Ze G dA dB                      Ze G dC dD                      Ze G dE dF                      ZdGefdHZdGefdIZdGefdJZdGefdKZdGefdLZdMZdS )N   )ffilib    NzCould not initialize c-aresz&c-ares is not built with thread safety)errno)ascii_bytes	maybe_str
parse_name)__version__)CallableIterable)	dataclass)Anyr   LiteralOptionalDictUnion)SimpleQueue   c                       e Zd ZdS )	AresErrorN)__name__
__module____qualname__     M/var/www/html/gpu-tools/venv/lib/python3.11/site-packages/pycares/__init__.pyr   r   V   s        Dr   r   Channel_handle_to_channelc                 H    t          j        |           } ||||           d S N)_ffifrom_handle)data	socket_fdreadablewritablesock_state_cbs        r   _sock_state_cbr(   _   s.     $T**MM)Xx00000r   c                     | t           vrd S t          j        |           }|t          j        k    rd }nt          |          }d } |||           t                               | d            d S r    )r   r!   r"   _libARES_SUCCESSparse_hostentpop)argstatustimeoutshostentcallbackresults         r   _host_cbr4   f   sz     $$$$$H"""w''HVV3%%%%%r   c                     | t           vrd S t          j        |           }|t          j        k    rd }nt          ||          }d } |||           t                               | d            d S r    )r   r!   r"   r*   r+   parse_nameinfor-   )r.   r/   r0   nodeservicer2   r3   s          r   _nameinfo_cbr9   w   s|     $$$$$H"""g..HVV3%%%%%r   c                     | t           vrdS t          j        |           }|t          j        k    rd}nt          |          \  }}||}nd} |||           t                               | d           dS )z'Callback for new DNS record API queriesN)r   r!   r"   r*   r+   parse_dnsrecr-   )r.   r/   r0   dnsrecr2   r3   parse_statuss          r   _query_dnsrec_cbr>      s     $$$$$H"""+F33#!FF FHVV3%%%%%r   c                     | t           vrd S t          j        |           }|t          j        k    rd }nt          |          }d } |||           t                               | d            d S r    )r   r!   r"   r*   r+   parse_addrinfor-   )r.   r/   r0   resr2   r3   s         r   _addrinfo_cbrB      sz     $$$$$H"""$$HVV3%%%%%r   c                    t          j        | |          }|dk    rg S g }t          |          D ]}t          j        d          }t          j        d          }t          j        | ||||          }|d         t          j        k    r/t          t          j        |d         |d                             }nd}|	                    ||f           |S )zIExtract OPT params as list of (key, value) tuples for HTTPS/SVCB records.r   zunsigned char **size_t *r   )
r*   ares_dns_rr_get_opt_cntranger!   newares_dns_rr_get_optNULLbytesbufferappend)	rrkeyopt_cntparamsival_ptrval_lenopt_keyvals	            r   _extract_opt_paramsrV      s    *2s33G!||	F7^^ & &(-..(:&&*2sAwHH1:""GAJ
;;<<CCCwn%%%%Mr   c                 x   |t           j        k    rt          j        | t           j                  }t	          j        dt           j                  }t          j        t          j	        ||t           j                   t          t          t	          j        |                              S |t           j        k    rt          j        | t           j                  }t	          j        dt           j                  }t          j        t          j        ||t           j                   t#          t          t	          j        |                              S |t           j        k    rnt          j        | t           j                  }t          j        | t           j                  }t/          |t          t	          j        |                              S |t           j        k    rt          j        | t           j                  }g }t7          |          D ]}}t	          j        d          }	t          j        | t           j        ||	          }
|
t          j        k    r6|                    t	          j        |
|	d                   dd                    ~tA          d!                    |                    S |t           j"        k    rt          j#        | t           j$                  }t          j        | t           j%                  }t	          j        d          }	t          j&        | t           j'        |	          }t          t	          j        ||	d                   dd                   }tQ          |t          t	          j        |                    |	          S |t           j)        k    rNt          j        | t           j*                  }tW          t          t	          j        |                    
          S |t           j,        k    rKt          j        | t           j-                  }t          j        | t           j.                  }t          j        | t           j/                  }t          j        | t           j0                  }t          j        | t           j1                  }t          j        | t           j2                  }tg          ||t          t	          j        |                    t          t	          j        |                    t          t	          j        |                    t          t	          j        |                              S |t           j4        k    rNt          j        | t           j5                  }tm          t          t	          j        |                              S |t           j7        k    rNt          j        | t           j8                  }ts          t          t	          j        |                              S |t           j:        k    r-t          j        | t           j;                  }t          j        | t           j<                  }t          j=        | t           j>                  }t          j=        | t           j?                  }t          j=        | t           j@                  }t          j=        | t           jA                  }t          j=        | t           jB                  }t          t          t	          j        |                    t          t	          j        |                    |||||          S |t           jD        k    rt          j        | t           jE                  }t          j        | t           jF                  }t          j        | t           jG                  } t          j        | t           jH                  }!t          ||| t          t	          j        |!                              S |t           jJ        k    rt          j#        | t           jK                  }"t          j#        | t           jL                  }#t          j#        | t           jM                  }$t	          j        d          }%t          j&        | t           jN        |%          }&|&t          j        k    r(t          t	          j        |&|%d                             nd}'t          |"|#|$|'          S |t           jQ        k    rt          j        | t           jR                  }t          j        | t           jS                  }!t          | t           jU                  }(t          |t          t	          j        |!                    |(          S |t           jW        k    rt          j        | t           jX                  }t          j        | t           jY                  }t          j        | t           jZ                  }!t          ||t          t	          j        |!                              S t          d|           )zVExtract type-specific data from a DNS resource record and return appropriate dataclasschar[])addr)priorityexchangerD   r   Nr   )r#   )criticaltagvalue)cname)order
preferenceflagsr8   regexpreplacement)nsdname)dname)mnamernameserialrefreshretryexpireminimum)rZ   weightporttarget)
cert_usageselectormatching_typecert_association_data)rZ   rp   rP   )rZ   rn   rp   zUnsupported DNS record type: )]r*   ARES_REC_TYPE_Aares_dns_rr_get_addrARES_RR_A_ADDRr!   rG   INET6_ADDRSTRLENares_inet_ntopsocketAF_INETARecordDatar   stringARES_REC_TYPE_AAAAares_dns_rr_get_addr6ARES_RR_AAAA_ADDRAF_INET6AAAARecordDataARES_REC_TYPE_MXares_dns_rr_get_u16ARES_RR_MX_PREFERENCEares_dns_rr_get_strARES_RR_MX_EXCHANGEMXRecordDataARES_REC_TYPE_TXTares_dns_rr_get_abin_cntARES_RR_TXT_DATArF   ares_dns_rr_get_abinrI   rL   rK   TXTRecordDatajoinARES_REC_TYPE_CAAares_dns_rr_get_u8ARES_RR_CAA_CRITICALARES_RR_CAA_TAGares_dns_rr_get_binARES_RR_CAA_VALUECAARecordDataARES_REC_TYPE_CNAMEARES_RR_CNAME_CNAMECNAMERecordDataARES_REC_TYPE_NAPTRARES_RR_NAPTR_ORDERARES_RR_NAPTR_PREFERENCEARES_RR_NAPTR_FLAGSARES_RR_NAPTR_SERVICESARES_RR_NAPTR_REGEXPARES_RR_NAPTR_REPLACEMENTNAPTRRecordDataARES_REC_TYPE_NSARES_RR_NS_NSDNAMENSRecordDataARES_REC_TYPE_PTRARES_RR_PTR_DNAMEPTRRecordDataARES_REC_TYPE_SOAARES_RR_SOA_MNAMEARES_RR_SOA_RNAMEares_dns_rr_get_u32ARES_RR_SOA_SERIALARES_RR_SOA_REFRESHARES_RR_SOA_RETRYARES_RR_SOA_EXPIREARES_RR_SOA_MINIMUMSOARecordDataARES_REC_TYPE_SRVARES_RR_SRV_PRIORITYARES_RR_SRV_WEIGHTARES_RR_SRV_PORTARES_RR_SRV_TARGETSRVRecordDataARES_REC_TYPE_TLSAARES_RR_TLSA_CERT_USAGEARES_RR_TLSA_SELECTORARES_RR_TLSA_MATCHARES_RR_TLSA_DATArJ   TLSARecordDataARES_REC_TYPE_HTTPSARES_RR_HTTPS_PRIORITYARES_RR_HTTPS_TARGETrV   ARES_RR_HTTPS_PARAMSHTTPSRecordDataARES_REC_TYPE_URIARES_RR_URI_PRIORITYARES_RR_URI_WEIGHTARES_RR_URI_TARGETURIRecordData
ValueError))rM   record_typerY   bufrZ   r[   cntchunksrQ   lengthr#   r\   r]   r^   	value_strr_   r`   ra   rb   r8   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   data_lendata_ptr	cert_datarP   s)                                            r   extract_record_datar      s   d***(T-@AAhx!677FND#t7LMMM	$+c*:*: ; ;<<<<	/	/	/)"d.DEEhx!677FOT38MNNN9T[-=-=#>#>????	-	-	-+B0JKK+B0HIIX	$+hBWBW8X8XYYYY	.	.	.+B0EFFs 	? 	?AXj))F,R1F6RRDty  dk$q	::111=>>>#((6"2"23333	.	.	.*2t/HII&r4+?@@*%%(T-CVLLdk%;;AAA>??	hIdk#>N>N4O4OW`aaaa	0	0	0(T-EFFYt{5/A/A%B%BCCCC	0	0	0(T-EFF-b$2OPP
(T-EFF*2t/JKK)"d.GHH.r43QRR!DK..//dk'2233T[0011!$+k":":;;
 
 
 	
 
-	-	-*2t/FGGIdk'.B.B$C$CDDDD	.	.	.(T-CDD9T[-?-?#@#@AAAA	.	.	.(T-CDD(T-CDD)"d.EFF*2t/GHH(T-CDD)"d.EFF*2t/GHHDK..//DK..//
 
 
 	
 
.	.	.+B0IJJ)"d.EFF'D,ABB)"d.EFFT[0011	
 
 
 	
 
/	/	/,R1MNN
*2t/IJJ/D4KLL8J''+B0FQQAITYAVAVE$+h<<===\_	!'"+	
 
 
 	
 
0	0	0+B0KLL)"d.GHH$R)BCCT[0011
 
 
 	
 
.	.	.+B0IJJ)"d.EFF)"d.EFFT[0011
 
 
 	
 FFFGGGr   c           
      6   | t           j        k    rdt          j        fS g }g }g }t          j        | t          j                  }t          |          D ]}t          j        | t          j        |          }|t           j        k    rt          t          j	        t          j
        |                              }t          j        |          }t          j        |          }	t          j        |          }
	 t          ||          }|                    t!          |||	|
|                     # t"          t$          f$ r Y w xY wt          j        | t          j                  }t          |          D ]}t          j        | t          j        |          }|t           j        k    rt          t          j	        t          j
        |                              }t          j        |          }t          j        |          }	t          j        |          }
	 t          ||          }|                    t!          |||	|
|                     # t"          t$          f$ r Y w xY wt          j        | t          j                  }t          |          D ]}t          j        | t          j        |          }|t           j        k    rt          t          j	        t          j
        |                              }t          j        |          }t          j        |          }	t          j        |          }
	 t          ||          }|                    t!          |||	|
|                     # t"          t$          f$ r Y w xY wt+          |||          }|dfS )z8Parse ares_dns_record_t into DNSResult with all sectionsN)nametyperecord_classttlr#   )answer	authority
additional)r!   rI   r*   ARES_EBADRESPares_dns_record_rr_cntARES_SECTION_ANSWERrF   ares_dns_record_rr_get_constr   r}   ares_dns_rr_get_nameares_dns_rr_get_typeares_dns_rr_get_classares_dns_rr_get_ttlr   rL   	DNSRecordr   	ExceptionARES_SECTION_AUTHORITYARES_SECTION_ADDITIONAL	DNSResult)r<   answer_recordsauthority_recordsadditional_recordsanswer_countrQ   rM   r   rec_type	rec_classr   r#   authority_countadditional_countr3   s                  r   r;   r;   K  s   T'''N .vt7OPPL<    .vt7OQRSS??T[)B2)F)FGGHHD044H2266I*2..C*2x88%%i!!*' ' '     	*    ( 1&$:UVVO?##  .vt7RTUVV??T[)B2)F)FGGHHD044H2266I*2..C*2x88!((!!** * *     	*    ( 264;WXX#$$  .vt7SUVWW??T[)B2)F)FGGHHD044H2266I*2..C*2x88")))!!*+ + +     	*    & #%  F 4<s6   57D--E E7II! I!57M--N Nc                   2    e Zd ZdZddZddZddZddZdS )	_ChannelShutdownManagerzLManages channel destruction in a single background thread using SimpleQueue.returnNc                 j    t                      | _        d | _        t          j                    | _        d S r    )r   _queue_thread	threadingLock_start_lockselfs    r   __init__z _ChannelShutdownManager.__init__  s*    #.==37$>++r   c                     	 | j                                         \  }}t          j        |d                    t          j        |d         d           |t          j        |d                    n)z4Process channel destruction requests from the queue.Tr   )r   getr*   ares_cancelares_queue_wait_emptyares_destroy)r   channel_s      r   _run_safe_shutdown_loopz/_ChannelShutdownManager._run_safe_shutdown_loop  sn    	.**JGQ WQZ((( &wqz2666 "!'!*---	.r   c                     | j         dS | j        5  | j         	 ddd           dS t          j        | j        d          | _         | j                                          ddd           dS # 1 swxY w Y   dS )z3Start the background thread if not already started.NT)rp   daemon)r   r   r   Threadr  startr   s    r   r  z_ChannelShutdownManager.start  s    <#F 	! 	!|'	! 	! 	! 	! 	! 	! 	! 	! %+43OX\]]]DLL   	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!s   	A-9A--A14A1c                 >    | j                             ||f           dS )a  
        Schedule channel destruction on the background thread.

        The socket state callback handle is passed along to ensure it remains
        alive until the channel is destroyed.

        Thread Safety and Synchronization:
        This method uses SimpleQueue which is thread-safe for putting items
        from multiple threads. The background thread processes channels
        sequentially waiting for queries to end before each destruction.
        N)r   put)r   r  sock_state_cb_handles      r   destroy_channelz'_ChannelShutdownManager.destroy_channel  s$     	"6788888r   r   N)r   r   r   __doc__r   r  r  r  r   r   r   r   r     sj        VV, , , ,
. . . . 	! 	! 	! 	!9 9 9 9 9 9r   r   c            $          e Zd Zej        ej        ej        ej        ej        ej	        ej
        ej        ej        ej        ej        ej        ej        ej        ej        fZej        ej        ej        ej        ej        fZddddddddddddddddddee         dee         dee         dee         dee         d	ee         d
eeeee f                           deeeee f                           deee df         dee!ee"e"gdf                  dee         dee         de"deee df         dee         deee df         ddf"dZ#d9dZ$d Z%d9dZ&d9dZ'e(de)e         fd            Z*e*j+        d
eeee f                  ddfd            Z*dededdfdZ,deddfdZ-deddfd Z.d:d!Z/d"ed#e!e0egdf         ddfd$Z1d%d%d%d%d&d'ed(ee         d)e2j3        d*ed+eded#e!e0egdf         ddfd,Z4e5d-d.ed/ed0ed#e!e0egdf         ddf
d1Z6e5d-d.ed/ed0ed#e!e0egdf         ddf
d2Z7d3 Z8d4ee9e:f         ded#e!e0egdf         ddfd5Z;d6 Z<d9d7Z=d:dede"fd8Z>dS );r   NF)rb   timeouttriesndotstcp_portudp_portserversdomainslookupsr'   socket_send_buffer_sizesocket_receive_buffer_sizerotatelocal_ip	local_devresolvconf_pathrb   r  r  r  r  r  r  r  r  r'   r  r  r  r  r  r  r   c                ^   d | _         ||nd| _        t          j        d          }t          j        d          }d}|||_        |t
          j        z  }|&t          |dz            |_        |t
          j	        z  }|||_
        |t
          j        z  }|||_        |t
          j        z  }|||_        |t
          j        z  }|||_        |t
          j        z  }|||_        |t
          j        z  }|||_        |t
          j        z  }|
rat-          |
          st/          d          t          j        |
          }|| _        t
          j        |_        ||_        |t
          j        z  }n'd | _        |t
          j        z  }t
          j        |_         |	r6t          j        dtC          |	                    |_"        |t
          j#        z  }|rd |D             }t          j        dtI          |          d	z   z            }tK          tI          |                    D ]}||         ||<   ||_&        tI          |          |_'        |t
          j(        z  }|r|t
          j)        z  }|6|t
          j*        z  }t          j        dtC          |                    |_+        t          j,        |||          }|t
          j-        k    rt]          d
          || _         |r|| _/        |r| 0                    |           |r| 1                    |           td          3                                 d S )Nr   zares_channel *zstruct ares_options *  zsock_state_cb is not callablerX   c                 R    g | ]$}t          j        d t          |                    %S )rX   )r!   rG   r   ).0rQ   s     r   
<listcomp>z$Channel.__init__.<locals>.<listcomp>/  s*    HHH1DHX{1~~66HHHr   z
char *[%d]r   z#Failed to initialize c-ares channel)4_channel_flagsr!   rG   rb   r*   ARES_OPT_FLAGSintr  ARES_OPT_TIMEOUTMSr  ARES_OPT_TRIESr  ARES_OPT_NDOTSr  ARES_OPT_TCP_PORTr  ARES_OPT_UDP_PORTr  ARES_OPT_SOCK_SNDBUFr  ARES_OPT_SOCK_RCVBUFcallable	TypeError
new_handle_sock_state_cb_handler(   r'   sock_state_cb_dataARES_OPT_SOCK_STATE_CBARES_OPT_EVENT_THREADARES_EVSYS_DEFAULTevsysr   r  ARES_OPT_LOOKUPSlenrF   r  ndomainsARES_OPT_DOMAINSARES_OPT_ROTATEARES_OPT_RESOLVCONFr  ares_init_optionsr+   r   r  set_local_ipset_local_dev_shutdown_managerr  )r   rb   r  r  r  r  r  r  r  r  r'   r  r  r  r  r  r  r  optionsoptmaskuserdatastrscrQ   rs                            r   r   zChannel.__init__  s9   (   %0eea(+,,(233!GM 33G!'D.11GO 77G!GM!44G!GM!44G'G!77G'G!77G"..EG+!::G%11KG.!::G 	4M** A ?@@@}55H *2D&$($7G!)1G&!<<GG)-D&!;;G 3GM 	7"hxW1E1EFFGO!66G 	7HHHHHDW)9:;;A3w<<((  1gqttGO"7||G!66G 	6!55G&!99G&*hx_9U9U&V&VG#"7GW==!!!ABBB 	#"DL 	(h''' 	*y))) 	!!!!!r   c                 .    |                                   dS )z;Ensure the channel is destroyed when the object is deleted.N)closer   s    r   __del__zChannel.__del__P  s    

r   c                 n    | j         t          d          t          j        |          }| t          |<   |S )a  
        Create a callback handle and register it for tracking.

        This ensures that:
        1. The callback data is wrapped in a CFFI handle
        2. The handle is mapped to this channel to keep it alive

        Args:
            callback_data: The data to pass to the callback (usually a callable or tuple)

        Returns:
            The CFFI handle that can be passed to C functions

        Raises:
            RuntimeError: If the channel is destroyed

        Nz,Channel is destroyed, no new queries allowed)r"  RuntimeErrorr!   r/  r   )r   callback_datarB  s      r   _create_callback_handlezChannel._create_callback_handleT  s:    $ = MNNN?=11'+8$r   c                 D    t          j        | j        d                    d S Nr   )r*   r   r"  r   s    r   cancelzChannel.cancelm  s     q)*****r   c                     t          j        | j        d                   }|t           j        k    r"t	          |t          j        |                    d S rN  )r*   ares_reinitr"  r+   r   r   strerror)r   rE  s     r   reinitzChannel.reinitp  sI    T]1-..!!!Au~a00111 "!r   c                 |   t          j        | j        d                   }|t          j        k    r6t          t           j        t          j        t           j                            g }t          t          j
        |                    }t          j        |           d |                    d          D             }|S )Nr   c                 6    g | ]}|                                 S r   )stripr   ss     r   r!  z#Channel.servers.<locals>.<listcomp>  s     @@@Qqwwyy@@@r   ,)r*   ares_get_servers_csvr"  r!   rI   r   ARES_ENOMEMr   rR  r   r}   ares_free_stringsplit)r   csv_strserver_list
csv_strings       r   r  zChannel.serversu  s    +DM!,<==diD,enT=M.N.NOOOt{73344
g&&&@@**:*:3*?*?@@@r   c                    d |D             }d                     |          }t          j        | j        d         |                    d                    }|t          j        k    r"t          |t          j        |                    d S )Nc                     g | ];}t          |t                    r"t          |                              d           n|<S )ascii)
isinstancerJ   r   decoderW  s     r   r!  z#Channel.servers.<locals>.<listcomp>  sB    fffYZAu9M9MT{1~~,,W555STfffr   rY  r   rc  )	r   r*   ares_set_servers_csvr"  encoder+   r   r   rR  )r   r  r_  r^  rE  s        r   r  zChannel.servers  s|    ff^efff((;''%dmA&6w8O8OPP!!!Au~a00111 "!r   read_fdwrite_fdc                     t          j        | j        d         t          j        d|          t          j        d|                     d S Nr   ares_socket_t)r*   ares_process_fdr"  r!   cast)r   rh  ri  s      r   
process_fdzChannel.process_fd  s@    T]1-ty'/R/RTXT]^mowTxTxyyyyyr   c                     t          j        | j        d         t          j        d|          t          j        dt
                               d S rk  r*   rm  r"  r!   rn  ARES_SOCKET_BAD)r   rh  s     r   process_read_fdzChannel.process_read_fd  sO    T]1-ty'/R/RTXT]^mo~TT  	A  	A  	A  	A  	Ar   c                     t          j        | j        d         t          j        dt
                    t          j        d|                     d S rk  rq  )r   ri  s     r   process_write_fdzChannel.process_write_fd  sW    T]1-ty//Z/Z\`\efuw  ]A  ]A  	B  	B  	B  	B  	Br   c                    t           j        }t          j        d          }|z|dk    ret          j        d          }t          t	          j        |                    |_        t          t	          j        |d          dz            |_        nt          d          t          j        | j        d         ||           |t           j        k    rdS |j        |j        dz  z   S )Nzstruct timeval*g        g      ?i@B z-timeout needs to be a positive number or Noner   g    .A)r!   rI   rG   r%  mathfloortv_secfmodtv_usecr   r*   ares_timeoutr"  )r   tmaxtvtvs       r   r  zChannel.timeout  s    	X'((=Cxx!233"4:a==11 #DIa$5$5$? @ @ !PQQQ$-*E2666??3	BJ223r   rY   r2   c                f   t          |          st          d          t          j        d          }t          j        d          }t	          j        t          j        t          |          |          dk    r|}t          j        }nOt	          j        t          j	        t          |          |          dk    r|}t          j	        }nt          d          |                     |          }t	          j        | j        d         |t          j        |d                   |t          j        |           d S )Na callable is requiredstruct in_addr*struct ares_in6_addr*r   invalid IP addressr   )r-  r.  r!   rG   r*   ares_inet_ptonrz   r{   r   r   r   rL  ares_gethostbyaddrr"  sizeofr4   )r   rY   r2   addr4addr6addressfamilyrB  s           r   gethostbyaddrzChannel.gethostbyaddr  s   !! 	64555*++011v~{4/@/@5JJaOOG^FF +d2C2CeMMQRRRG_FF1222//99a 0'4;wqz;R;RTZ\`\ikstttttr   r   )r  r   protorb   hostro   r  r   r  c                   t          |          st          d          |t          j        }nGt	          |t
                    r#t          |                              d          }nt          |          }| 	                    |          }	t          j
        d          }
||
_        ||
_        ||
_        ||
_        t          j        | j        d         t%          |          ||
t          j        |	           d S )Nr  rc  zstruct ares_addrinfo_hints*r   )r-  r.  r!   rI   rd  r%  strrg  r   rL  rG   ai_flags	ai_familyai_socktypeai_protocolr*   ares_getaddrinfor"  r	   rB   )r   r  ro   r  r   r  rb   r2   r8   rB  hintss              r   getaddrinfozChannel.getaddrinfo  s     !! 	64555<iGGc"" 	($ii&&w//GG!$''G//99677  !dmA.
40@0@'5RVRcemnnnnnr   )query_classr   
query_typer  c          	         t          |          st          d          || j        vrt          d          || j        vrt          d          |                     |          }t          j        d          }t          j	        | j
        d         t          |          ||t          j        ||          }|t          j        k    r=t                              |d           t!          |t#          j        |                    dS )a  
        Perform a DNS query.

        Args:
            name: Domain name to query
            query_type: Type of query (e.g., QUERY_TYPE_A, QUERY_TYPE_AAAA, etc.)
            query_class: Query class (default: QUERY_CLASS_IN)
            callback: Callback function that receives (result, errno)

        The callback will receive a DNSResult object containing answer, authority, and additional sections.
        r  invalid query type specifiedinvalid query class specifiedzunsigned short *r   N)r-  r.  
__qtypes__r   __qclasses__rL  r!   rG   r*   ares_query_dnsrecr"  r	   r>   r+   r   r-   r   r   rR  )r   r   r  r  r2   rB  qidr/   s           r   queryzChannel.query  s     !! 	64555T_,,;<<<d///<===//99h)**'M!t!
 
 T&&&""8T222FEN6$:$:;;; '&r   c                  
 t          |          st          d          || j        vrt          d          || j        vrt          d          | j        t          j        z  rdnt          j        }t          j
        d          }t          j        |d|t          j        t          j                  }|t          j        k    r"t          |t!          j        |                    |d         
t          j        
t'          |          ||          }|t          j        k    r6t          j        
           t          |t!          j        |                    |
fd}|                     |          }	t          j        | j        d         
t          j        |	          }|t          j        k    rQt2                              |	d           t          j        
           t          |t!          j        |                    dS )a  
        Perform a DNS search (honors resolv.conf search domains).

        Args:
            name: Domain name to search
            query_type: Type of query (e.g., QUERY_TYPE_A, QUERY_TYPE_AAAA, etc.)
            query_class: Query class (default: QUERY_CLASS_IN)
            callback: Callback function that receives (result, errno)

        The callback will receive a DNSResult object containing answer, authority, and additional sections.
        r  r  r  r   zares_dns_record_t **c                 |    	  | |           t          j                   d S # t          j                   w xY wr    )r*   ares_dns_record_destroy)r3   errorr<   original_callbacks     r   cleanup_callbackz(Channel.search.<locals>.cleanup_callback/  sK    5!!&%000 ,V44444,V4444s   % ;N)r-  r.  r  r   r  r#  r*   ARES_FLAG_NORECURSEARES_FLAG_RDr!   rG   ares_dns_record_createARES_OPCODE_QUERYARES_RCODE_NOERRORr+   r   r   rR  ares_dns_record_query_addr	   r  rL  ares_search_dnsrecr"  r>   r   r-   )r   r   r  r  r2   	dns_flagsdnsrec_pr/   r  rB  r<   r  s             @@r   searchzChannel.search  s    !! 	64555T_,,;<<<d///<=== +(@@XAAtGX	8233,"#
 
 T&&&FEN6$:$:;;;! /t	
 
 T&&&(000FEN6$:$:;;; %	5 	5 	5 	5 	5 	5 //0@AA(M!!	
 
 T&&&""8T222(000FEN6$:$:;;; '&r   c                    t          j        d          }t          j        d          }t          j        t          j        t          |          |          dk    r9t          j        | j        d         t	          j	        |j
                             d S t          j        t          j        t          |          |          dk    r"t          j        | j        d         |           d S t          d          )Nr  r  r   r   r  )r!   rG   r*   r  rz   r{   r   ares_set_local_ip4r"  ntohls_addrr   ares_set_local_ip6r   )r   ipr  r  s       r   r=  zChannel.set_local_ipC  s    *++011v~{2FF!KK#DM!$4fl5<6P6PQQQQQ +b//5IIQNN#DM!$4e<<<<<1222r   r  c                L   t          |          st          d          t          |          dk    r|\  }}t          j        d          }t          j        t          j        t          |          t          j
        |j                            dk    rt          d|z            t          j        |_        t          j        |          |_        |}nt          |          dk    r|\  }}}}	t          j        d          }
t          j        t          j        t          |          t          j
        |
j                            dk    rt          d|z            t          j        |
_        t          j        |          |
_        t          j        |          |
_        |	|
_        |
}nt          d	          |                     |          }t          j        | j        d
         t          j        d|          t          j        |d
                   |t
          j        |           d S )Nr     struct sockaddr_in*r   zInvalid IPv4 address %r   struct sockaddr_in6*zInvalid IPv6 address %rzInvalid address argumentr   zstruct sockaddr*)r-  r.  r7  r!   rG   r*   r  rz   r{   r   	addressofsin_addrr   
sin_familyhtonssin_portr   	sin6_addrsin6_family	sin6_porthtonlsin6_flowinfosin6_scope_idrL  ares_getnameinfor"  rn  r  r9   )r   r  rb   r2   r  ro   sa4saflowinfoscope_idsa6rB  s               r   getnameinfozChannel.getnameinfoM  s   !! 	64555w<<1 JR(011C"6>;r??DNSVS_D`D`aaefff !:R!?@@@#^CN!<--CLBB\\Q-4*Rx(122C"6?KOOT^TWTaEbEbccghhh !:R!?@@@$oCO"L..CM &X 6 6C (CBB7888//99dmA.	:Lb0Q0QSWS^_abc_dSeSeglnrn  BJ  	K  	K  	K  	K  	Kr   c                 F    t          j        | j        d         |           d S rN  )r*   ares_set_local_devr"  )r   devs     r   r>  zChannel.set_local_devi  s"    a 0#66666r   c                 v    | j         dS | j         dc}| _         t                              || j                   dS )a  
        Close the channel as soon as it's safe to do so.

        This method can be called from any thread. The channel will be destroyed
        safely using a background thread with a 1-second delay to ensure c-ares
        has completed its cleanup.

        Note: Once close() is called, no new queries can be started. Any pending
        queries will be cancelled and their callbacks will receive ARES_ECANCELLED.

        N)r"  r?  r  r0  )r   r  s     r   rG  zChannel.closel  sB     = F "&))'43MNNNNNr   c                    t          j        | j        d         ||dk    rt          |dz            nd          }|t           j        k    rdS |t           j        k    rdS t          |t          j        |                    )z
        Wait until all pending queries are complete or timeout occurs.

        Args:
            timeout: Maximum time to wait in seconds. Use -1 for infinite wait.
        r   Nr  r   TF)	r*   r   r"  r%  r+   ARES_ETIMEOUTr   r   rR  )r   r  rE  s      r   waitzChannel.wait  s     &t}Q'7QXQdiptuiuiu#gn:M:M:M{}~~!!!4$$$$5Au~a00111r   r  r    )?r   r   r   r*   ru   r~   ARES_REC_TYPE_ANYr   r   r   r   r   r   r   r   r   r   r   r   r  ARES_CLASS_INARES_CLASS_CHAOSARES_CLASS_HESOIDARES_CLASS_NONEARES_CLASS_ANYr  r   r%  floatr   r   r  rJ   r   boolr   rH  rL  rO  rS  propertylistr  setterro  rs  ru  r  r   r  rz   AddressFamilyr  QUERY_CLASS_INr  r  r=  IP4IP6r  r>  rG  r  r   r   r   r   r     s'       &(?AWY]Yoqu  rJ  LP  Ld  fj  f{  }A  }U  W[  Wl  nr  nD  FJ  F\  ^b  ^t  vz  vM  OS  Oe  gk  g}  ~J&(=t?UW[Wkmq  nA  BL )-,0(,(,+/+/BFBF48NR:>=A %59,0<@#r" r" r" r" #5/r" !	r"
 !r" $C=r" $C=r" #8E#u*,=#>?r" #8E#u*,=#>?r"  UD 01r" !)3d2CT2I)J Kr" +33-r" .6c]r" r" !eT!12r"  %SM!r"" #(UD(8"9#r"" FJ#r" r" r" r"h     2+ + + +2 2 2 2
 c    X ^2xc5j(9: 2t 2 2 2 ^2z# z z z z z zAc Ad A A A AB B B B B B4 4 4 4&u# uHc3Z=M4N uSW u u u u. ()o o oo smo
 $o o o o C:t+,o 
o o o o< GU "< "< "<# "<3 "< "<`hjmorisuyiy`z "<  @D "< "< "< "<H HV E< E< E<3 E<C E< E<aiknpsjtvzjza{ E<  AE E< E< E< E<N3 3 3K5c? K3 KXWZ\_V`bfVfMg Klp K K K K87 7 7O O O O.2 2E 24 2 2 2 2 2 2r   c                       e Zd ZU dZeed<   dS )r|   z Data for A (IPv4 address) recordrY   Nr   r   r   r  r  __annotations__r   r   r   r|   r|     s         **
IIIIIr   r|   c                       e Zd ZU dZeed<   dS )r   z#Data for AAAA (IPv6 address) recordrY   Nr  r   r   r   r   r     s         --
IIIIIr   r   c                   (    e Zd ZU dZeed<   eed<   dS )r   z"Data for MX (mail exchange) recordrZ   r[   Nr   r   r   r  r%  r  r  r   r   r   r   r     s(         ,,MMMMMMMMr   r   c                       e Zd ZU dZeed<   dS )r   zData for TXT (text) recordr#   N)r   r   r   r  rJ   r  r   r   r   r   r     s         $$
KKKKKr   r   c                   2    e Zd ZU dZeed<   eed<   eed<   dS )r   z;Data for CAA (certification authority authorization) recordr\   r]   r^   Nr  r   r   r   r   r     s1         EEMMM	HHHJJJJJr   r   c                       e Zd ZU dZeed<   dS )r   z&Data for CNAME (canonical name) recordr_   Nr  r   r   r   r   r     s         00JJJJJr   r   c                   P    e Zd ZU dZeed<   eed<   eed<   eed<   eed<   eed<   dS )	r   z0Data for NAPTR (naming authority pointer) recordr`   ra   rb   r8   rc   rd   Nr  r   r   r   r   r     sQ         ::JJJOOOJJJLLLKKKr   r   c                       e Zd ZU dZeed<   dS )r   z Data for NS (name server) recordre   Nr  r   r   r   r   r     s         **LLLLLr   r   c                       e Zd ZU dZeed<   dS )r   zData for PTR (pointer) recordrf   Nr  r   r   r   r   r     s         ''JJJJJr   r   c                   Z    e Zd ZU dZeed<   eed<   eed<   eed<   eed<   eed<   eed<   d	S )
r   z(Data for SOA (start of authority) recordrg   rh   ri   rj   rk   rl   rm   N)r   r   r   r  r  r  r%  r   r   r   r   r     sU         22JJJJJJKKKLLLJJJKKKLLLLLr   r   c                   <    e Zd ZU dZeed<   eed<   eed<   eed<   dS )r   zData for SRV (service) recordrZ   rn   ro   rp   Nr  r   r   r   r   r     s:         ''MMMKKK
IIIKKKKKr   r   c                   <    e Zd ZU dZeed<   eed<   eed<   eed<   dS )r   z9Data for TLSA (DANE TLS authentication) record - RFC 6698rq   rr   rs   rt   N)r   r   r   r  r%  r  rJ   r   r   r   r   r     sB         CCOOOMMM      r   r   c                   2    e Zd ZU dZeed<   eed<   eed<   dS )r   z2Data for HTTPS (service binding) record - RFC 9460rZ   rp   rP   N)r   r   r   r  r%  r  r  r  r   r   r   r   r     s1         <<MMMKKKLLLLLr   r   c                   2    e Zd ZU dZeed<   eed<   eed<   dS )r   z<Data for URI (Uniform Resource Identifier) record - RFC 7553rZ   rn   rp   Nr  r   r   r   r   r     s1         FFMMMKKKKKKKKr   r   c                   n    e Zd ZU dZeed<   eed<   eed<   eed<   eee	e
eeeeeeeeeeef         ed<   dS )r   z'Represents a single DNS resource recordr   r   r   r   r#   N)r   r   r   r  r  r  r%  r   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s~         11
III
III	HHH
^\=m]M. / / / / / /r   r   c                   V    e Zd ZU dZee         ed<   ee         ed<   ee         ed<   dS )r   z8Represents a complete DNS query result with all sectionsr   r   r   N)r   r   r   r  r  r   r  r   r   r   r   r      sH         BBOIYr   r   c                   J    e Zd ZU dZeed<   ee         ed<   ee         ed<   dS )
HostResultz%Result from gethostbyaddr() operationr   aliases	addressesN)r   r   r   r  r  r  r  r   r   r   r  r  
  sA         //
III#YCyr   r  c                   4    e Zd ZU dZeed<   ee         ed<   dS )NameInfoResultz#Result from getnameinfo() operationr7   r8   N)r   r   r   r  r  r  r   r   r   r   r  r    s1         --
IIIc]r   r  c                   P    e Zd ZU dZeed<   eed<   eed<   eed<   eed<   eed<   dS )	AddrInfoNodez-Single address node from getaddrinfo() resultr   rb   r  socktypeprotocolrY   N)r   r   r   r  r%  r  tupler   r   r   r  r    sL         77	HHHJJJKKKMMMMMM
KKKKKr   r  c                   2    e Zd ZU dZeed<   eed<   eed<   dS )AddrInfoCnamez+CNAME information from getaddrinfo() resultr   aliasr   Nr  r   r   r   r  r  !  s1         55	HHHJJJ
IIIIIr   r  c                   @    e Zd ZU dZee         ed<   ee         ed<   dS )AddrInfoResultz,Complete result from getaddrinfo() operationcnamesnodesN)r   r   r   r  r  r  r  r  r   r   r   r  r  (  s:         66r   r  r   c                 &   t          t          j        | j                            }g }g }d}| j        |         t          j        k    r_|                    t          t          j        | j        |                                        |dz  }| j        |         t          j        k    _d}| j        |         t          j        k    rt          j        dt          j
                  }t          j        t          j        | j        | j        |         |t          j
                  k    r?|                    t          t          j        |t          j
                                       |dz  }| j        |         t          j        k    t          |||          S )z.Parse c-ares hostent structure into HostResultr   r   rX   )r   r  r  )r   r!   r}   h_name	h_aliasesrI   rL   h_addr_listrG   r*   rx   ry   
h_addrtyper  )r1   r   r  r  rQ   r   s         r   r,   r,   1  sL   T[0011DGI	A

A
$)
+
+yW->q-A!B!BCCDDD	Q 
A
$)
+
+ 	
A

a
 DI
-
-hx!6779+G,>@STU@VX[]a]rssssYt{38M'N'NOOPPP	Q	 
a
 DI
-
- 4IFFFFr   c                     t          t          j        |                     }|t          j        k    r!t          t          j        |                    nd}t	          ||          S )z)Parse c-ares nameinfo into NameInfoResultN)r7   r8   )r   r!   r}   rI   r  )r7   r8   node_strservice_strs       r   r6   r6   F  sT    T**++H5<	5I5I)DK00111tKx====r   c                 .   | j         }| j        }| j        }| j        }| j        }|j        | j        k    sJ t          j        dt          j
                  }|j        t          j        k    rt          j        }t          j        d|          }t          j        t          j        |j        t          j        |j                  |t          j
                  k    r9t          j        |t          j
                  t          j        |j                  f}	nt-          d          |j        t          j        k    rt          j        }t          j        d|          }t          j        t          j        |j        t          j        |j                  |t          j
                  k    rEt          j        |t          j
                  t          j        |j                  |j        |j        f}	nt-          d          t-          d          t;          ||||||	          S )z5Parse a single c-ares addrinfo node into AddrInfoNodezchar []r  zfailed to convert IPv4 addressr  zfailed to convert IPv6 addresszinvalid sockaddr family)r   rb   r  r   r  rY   )ai_ttlr  r  r  ai_addr	sa_familyr  r!   rG   r*   rx   rz   r{   rn  rI   ry   r  r  r  r}   ntohsr  r   r   r  r  r  r  r  r  )
	ares_noder   rb   r   r  addr_structr  r  rX  rY   s
             r   parse_addrinfo_noder  M  s   

CE$H$H#K I$77777	)T2	3	3B..I+[999+AL$.:T:TVXZ^ZoppppKD$9::FL<T<TUDD=>>>		&/	1	1I,k::9+AM4>!+;V;VXZ\`\qrrrrKD$9::FL<U<UWXWfhihwxDD=>>>2333CuVhYahlmmmmr   c           	          t          | j        t          t          j        | j                            t          t          j        | j                                      S )z7Parse a single c-ares addrinfo cname into AddrInfoCname)r   r  r   )r  r   r   r!   r}   r  r   )
ares_cnames    r   parse_addrinfo_cnamer  n  sM    NJ$45566t{:?3344   r   c                    g }g }| j         }|t          j        k    r9|                    t	          |                     |j        }|t          j        k    9| j        }|t          j        k    r9|                    t          |                     |j        }|t          j        k    9t          j
        |            t          ||          S )z3Parse c-ares addrinfo structure into AddrInfoResult)r  r	  )r  r!   rI   rL   r  nextr	  r  ai_nextr*   ares_freeaddrinfor  )ares_addrinfor  r	  	cname_ptrnode_ptrs        r   r@   r@   w  s    FE$I
ty
 
 *955666N	 ty
 
  "H
di

(22333# di

 	=)))u5555r   )HARES_FLAG_USEVCARES_FLAG_PRIMARYARES_FLAG_IGNTCr  ARES_FLAG_STAYOPENARES_FLAG_NOSEARCHARES_FLAG_NOALIASESARES_FLAG_NOCHECKRESPARES_FLAG_EDNSARES_FLAG_NO_DFLT_SVRARES_NI_NOFQDNARES_NI_NUMERICHOSTARES_NI_NAMEREQDARES_NI_NUMERICSERVARES_NI_DGRAMARES_NI_TCPARES_NI_UDPARES_NI_SCTPARES_NI_DCCPARES_NI_NUMERICSCOPEARES_NI_LOOKUPHOSTARES_NI_LOOKUPSERVICEARES_NI_IDNARES_NI_IDN_ALLOW_UNASSIGNED ARES_NI_IDN_USE_STD3_ASCII_RULESrr  QUERY_TYPE_AQUERY_TYPE_AAAAQUERY_TYPE_ANYQUERY_TYPE_CAAQUERY_TYPE_CNAMEQUERY_TYPE_HTTPSQUERY_TYPE_MXQUERY_TYPE_NAPTRQUERY_TYPE_NSQUERY_TYPE_PTRQUERY_TYPE_SOAQUERY_TYPE_SRVQUERY_TYPE_TLSAQUERY_TYPE_TXTQUERY_TYPE_URIr  QUERY_CLASS_CHAOSQUERY_CLASS_HSQUERY_CLASS_NONEQUERY_CLASS_ANYARES_VERSIONr   r   r   r
   r   r   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  )_caresr   r!   r   r*   _cffi_backendr+   ares_library_initARES_LIB_INIT_ALLrJ  ares_threadsafety r   utilsr   r   r	   _versionr
   rw  rz   r   collections.abcr   r   dataclassesr   typingr   r   r   r   r   queuer   r  r  r%  r  r  r$  r%  r&  r  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  rr  ru   r<  r~   r=  r  r>  r   r?  r   r@  r   rB  r   rC  r   rD  r   rE  r   rF  r   rG  r   rI  r   rH  r   rA  r   rJ  r  r  r  rK  r  rL  r  rM  r  rN  r}   ares_versionrI   rO  PYCARES_ADDRTTL_SIZEr   r   r   r  
def_externr(   r4   r9   r>   rB   rV   r   r;   r   r?  r   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r,   r6   r  r  r@   __all__r   r   r   <module>r`     s	   , , , , , , , , ,    ..t/EFFFF$,
,4
5
55t A
,?
@
@@       5 5 5 5 5 5 5 5 5 5 ! ! ! ! ! !       . . . . . . . . ! ! ! ! ! ! @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @      CHoCc3 &* &. , , . 2 $2  $. ( . "  0 , 2 #@ #'#H   & #)''+ %+ %'''')+ ' #) '' %y%6T%6ty%A%ABBCC 	 	 	 	 		 	 	 	 ,. Di( - - - 1 1 1 & & &  & & &  & & &, & & &"  &DH DH DHNT T Tn/9 /9 /9 /9 /9 /9 /9 /9f ,+-- x2 x2 x2 x2 x2 x2 x2 x2|                        
                                                                 ! ! ! ! ! ! ! !                 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/                                
                        Gj G G G G*>^ > > > >nl n n n nB    6^ 6 6 6 6(Xr   