
    	FZj)                     ,
   U d dl mZmZ ddlZej                   ej                  ej                        k7  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jP                  Z(ejR                  Z)ejT                  Z*ejV                  Z+ejX                  Z,ejZ                  Z-ej\                  Z.ej^                  Z/ej`                  Z0ejb                  Z1ejd                  Z2ejf                  Z3ejh                  Z4ejj                  Z5ejl                  Z6ejn                  Z7ejp                  Z8ejr                  Z9ejt                  Z:ejv                  Z;ejx                  Z<ejz                  Z=ej|                  Z>ej~                  Z?ej                  Z@ej                  ZAej                  ZCej                  ZEej                  ZGej                  ZIej                  ZKej                  ZMej                  ZOej                  ZQej                  ZSej                  ZUej                  ZWej                  ZYej                  Z[ej                  Z]ej                  Z_ej                  Zaej                  Zcej                  Zeej                  Zgej                  Zi e ej                   ej                  ej                                    ZmdZn G d deo      Zpi Zqeedf   erd<    ej                         d        Zt ej                         d        Zu ej                         d        Zv ej                         d        Zw ej                         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ZdMZy)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y)	AresErrorN)__name__
__module____qualname__     RC:\Users\Rodrigo\frota-trucks-cliente\python\Lib\site-packages\pycares/__init__.pyr   r   V   s    r   r   Channel_handle_to_channelc                 B    t        j                  |       } ||||       y N)_ffifrom_handle)data	socket_fdreadablewritablesock_state_cbs        r   _sock_state_cbr(   _   s      $$T*M)Xx0r   c                     | t         vry t        j                  |       }|t        j                  k7  rd }nt        |      }d } |||       t         j                  | d        y r    )r   r!   r"   _libARES_SUCCESSparse_hostentpop)argstatustimeoutshostentcallbackresults         r   _host_cbr4   f   s\     $$$H"""w'VV3%r   c                     | t         vry t        j                  |       }|t        j                  k7  rd }nt        ||      }d } |||       t         j                  | d        y r    )r   r!   r"   r*   r+   parse_nameinfor-   )r.   r/   r0   nodeservicer2   r3   s          r   _nameinfo_cbr9   w   s^     $$$H"""g.VV3%r   c                     | t         vryt        j                  |       }|t        j                  k7  rd}nt        |      \  }}||}nd} |||       t         j                  | d       y)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>      sn     $$$H"""+F3#!F FVV3%r   c                     | t         vry t        j                  |       }|t        j                  k7  rd }nt        |      }d } |||       t         j                  | d        y r    )r   r!   r"   r*   r+   parse_addrinfor-   )r.   r/   r0   resr2   r3   s         r   _addrinfo_cbrB      s\     $$$H"""$VV3%r   c                    t        j                  | |      }|dk(  rg S g }t        |      D ]  }t        j                  d      }t        j                  d      }t        j
                  | ||||      }|d   t        j                  k7  r&t        t        j                  |d   |d               }nd}|j                  ||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3G!|	F7^((-.((:&**2sAwH1:"GAJ
;<C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(  rqt        j&                  | t         j(                        }t        j*                  | t         j,                        }t/        |t        t	        j                  |                  S |t         j0                  k(  rt        j2                  | t         j4                        }g }t7        |      D ]|  }t	        j
                  d      }	t        j8                  | t         j4                  ||	      }
|
t        j:                  k7  sR|j=                  t	        j>                  |
|	d         dd        ~ tA        djC                  |            S |t         jD                  k(  rt        jF                  | t         jH                        }t        j*                  | t         jJ                        }t	        j
                  d      }	t        jL                  | t         jN                  |	      }t        t	        j>                  ||	d         dd       }tQ        |t        t	        j                  |            |	      S |t         jR                  k(  rLt        j*                  | t         jT                        }tW        t        t	        j                  |            
      S |t         jX                  k(  rYt        j&                  | t         jZ                        }t        j&                  | t         j\                        }t        j*                  | t         j^                        }t        j*                  | t         j`                        }t        j*                  | t         jb                        }t        j*                  | t         jd                        }tg        ||t        t	        j                  |            t        t	        j                  |            t        t	        j                  |            t        t	        j                  |                  S |t         jh                  k(  rLt        j*                  | t         jj                        }tm        t        t	        j                  |                  S |t         jn                  k(  rLt        j*                  | t         jp                        }ts        t        t	        j                  |                  S |t         jt                  k(  rFt        j*                  | t         jv                        }t        j*                  | t         jx                        }t        jz                  | t         j|                        }t        jz                  | t         j~                        }t        jz                  | t         j                        }t        jz                  | t         j                        }t        jz                  | t         j                        }t        t        t	        j                  |            t        t	        j                  |            |||||      S |t         j                  k(  rt        j&                  | t         j                        }t        j&                  | t         j                        }t        j&                  | t         j                        } t        j*                  | t         j                        }!t        ||| t        t	        j                  |!                  S |t         j                  k(  rt        jF                  | t         j                        }"t        jF                  | t         j                        }#t        jF                  | t         j                        }$t	        j
                  d      }%t        jL                  | t         j                  |%      }&|&t        j:                  k7  r"t        t	        j>                  |&|%d               nd}'t        |"|#|$|'      S |t         j                  k(  rt        j&                  | t         j                        }t        j*                  | t         j                        }!t        | t         j                        }(t        |t        t	        j                  |!            |(      S |t         j                  k(  rt        j&                  | t         j                        }t        j&                  | t         j                        }t        j*                  | t         j                        }!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hhx!6!67FNND#t7L7LM	$++c*: ;<<	//	/))"d.D.DEhhx!6!67FOOT38M8MN9T[[-=#>??	--	-++B0J0JK++B0H0HIX	$++hBW8XYY	..	.++B0E0EFsAXXj)F,,R1F1F6RDtyy dkk$q	:1=>	 
 #((6"233	..	.**2t/H/HI&&r4+?+?@*%((T-C-CVLdkk%;A>?	hIdkk#>N4OW`aa	00	0((T-E-EFYt{{5/A%BCC	00	0((T-E-EF--b$2O2OP
((T-E-EF**2t/J/JK))"d.G.GH..r43Q3QR!DKK./dkk'23T[[01!$++k":;
 	
 
--	-**2t/F/FGIdkk'.B$CDD	..	.((T-C-CD9T[[-?#@AA	..	.((T-C-CD((T-C-CD))"d.E.EF**2t/G/GH((T-C-CD))"d.E.EF**2t/G/GHDKK./DKK./
 	
 
..	.++B0I0IJ))"d.E.EF''D,A,AB))"d.E.EFT[[01	
 	
 
//	/,,R1M1MN
**2t/I/IJ//D4K4KL88J'++B0F0FQAITYYAVE$++h<=\_	!'"+	
 	
 
00	0++B0K0KL))"d.G.GH$R)B)BCT[[01
 	
 
..	.++B0I0IJ))"d.E.EF))"d.E.EFT[[01
 	
 8F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                  k7  s<t        t        j                  t        j                  |                  }t        j                  |      }t        j                  |      }	t        j                  |      }
	 t        ||      }|j                  t!        |||	|
|              t        j                  | t        j&                        }t        |      D ]  }t        j                  | t        j&                  |      }|t         j                  k7  s<t        t        j                  t        j                  |                  }t        j                  |      }t        j                  |      }	t        j                  |      }
	 t        ||      }|j                  t!        |||	|
|              t        j                  | t        j(                        }t        |      D ]  }t        j                  | t        j(                  |      }|t         j                  k7  s<t        t        j                  t        j                  |                  }t        j                  |      }t        j                  |      }	t        j                  |      }
	 t        ||      }|j                  t!        |||	|
|              t+        |||      }|dfS # t"        t$        f$ r Y w xY w# t"        t$        f$ r Y w xY w# t"        t$        f$ r Y *w xY w)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 ..vt7O7OPL< ..vt7O7OQRS?T[[)B)B2)FGHD004H2226I**2.C*2x8%%i!!*'  !, 11&$:U:UVO?#..vt7R7RTUV?T[[)B)B2)FGHD004H2226I**2.C*2x8!((!!**  $, 2264;W;WX#$..vt7S7SUVW?T[[)B)B2)FGHD004H2226I**2.C*2x8")))!!*+  %* #%F 4<q 	* . 	* . 	* s6   +M+M/+NM,+M,/NNNNc                   0    e Zd ZdZddZddZddZddZy)_ChannelShutdownManagerzLManages channel destruction in a single background thread using SimpleQueue.Nc                 b    t               | _        d | _        t        j                         | _        y r    )r   _queue_thread	threadingLock_start_lockselfs    r   __init__z _ChannelShutdownManager.__init__  s!    #.=37$>>+r   c                     	 | j                   j                         \  }}t        j                  |d          t        j                  |d   d       |t        j
                  |d          i)z4Process channel destruction requests from the queue.r   )r   getr*   ares_cancelares_queue_wait_emptyares_destroy)r   channel_s      r   _run_safe_shutdown_loopz/_ChannelShutdownManager._run_safe_shutdown_loop  sb    *JGQ WQZ( &&wqz26 "!!'!*- r   c                    | j                   y| j                  5  | j                   
	 ddd       yt        j                  | j                  d      | _         | j                   j                          ddd       y# 1 sw Y   yxY w)z3Start the background thread if not already started.NT)rp   daemon)r   r   r   Threadr  startr   s    r   r  z_ChannelShutdownManager.start  sf    <<#||'  %++43O3OX\]DLLL  s   A:A A::Bc                 >    | j                   j                  ||f       y)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8r   returnN)r   r   r   __doc__r   r  r  r
  r   r   r   r   r     s    V,
. 	!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j0                  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*jV                  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)e2jf                  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>y);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  }|
rbt-        |
      st/        d      t        j0                  |
      }|| _        t
        j4                  |_        ||_        |t
        j:                  z  }n/d | _        |t
        j<                  z  }t
        j>                  |_         |	r7t        j                  dtC        |	            |_"        |t
        jF                  z  }|r|D cg c]!  }t        j                  dtC        |            # }}t        j                  dtI        |      dz   z        }tK        tI        |            D ]
  }||   ||<    ||_&        tI        |      |_'        |t
        jP                  z  }|r|t
        jR                  z  }|7|t
        jT                  z  }t        j                  dtC        |            |_+        t        jX                  |||      }|t
        jZ                  k7  rt]        d	      || _         |r|| _/        |r| ja                  |       |r| jc                  |       td        jg                          y c c}w )
Nr   zares_channel *zstruct ares_options *  zsock_state_cb is not callablerX   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userdatarQ   strscrs                            r   r   zChannel.__init__  s   (   %0ea((+,((23!GM 3 33G!'D.1GO 7 77G!GM!4!44G!GM!4!44G'G!7!77G'G!7!77G"..EG+!:!::G%11KG.!:!::GM* ?@@}5H *2D&$($7$7G!)1G&!<!<<G)-D&!;!;;G 33GM"hhxW1EFGO!6!66G@GH1DHHX{1~6DHW)9:;A3w<(1gqt )  GO"7|G!6!66G!5!55G&!9!99G&*hhx_9U&VG#""7GW=!!!ABB"DLh'y) 	!? Is   =&M"c                 $    | j                          y)z;Ensure the channel is destroyed when the object is deleted.N)closer   s    r   __del__zChannel.__del__P  s    

r   c                 p    | 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

        z,Channel is destroyed, no new queries allowed)r  RuntimeErrorr!   r,  r   )r   callback_datar?  s      r   _create_callback_handlezChannel._create_callback_handleT  s8    $ == MNN??=1'+8$r   c                 H    t        j                  | j                  d          y Nr   )r*   r   r  r   s    r   cancelzChannel.cancelm  s    q)*r   c                     t        j                  | j                  d         }|t         j                  k7  rt	        |t        j                  |            y rK  )r*   ares_reinitr  r+   r   r   strerror)r   rB  s     r   reinitzChannel.reinitp  sD    T]]1-.!!!Au~~a011 "r   c                    t        j                  | j                  d         }|t        j                  k(  r;t        t         j                  t        j                  t         j                              g }t        t        j                  |            }t        j                  |       |j                  d      D cg c]  }|j                          }}|S c c}w )Nr   ,)r*   ares_get_servers_csvr  r!   rI   r   ARES_ENOMEMr   rO  r   r}   ares_free_stringsplitstrip)r   csv_strserver_list
csv_stringss        r   r  zChannel.serversu  s    ++DMM!,<=diiD,,ennT=M=M.NOOt{{734
g&*4*:*:3*?@*?Qqwwy*?@ As   9Cc                 j   |D cg c].  }t        |t              rt        |      j                  d      n|0 }}dj	                  |      }t        j                  | j                  d   |j                  d            }|t
        j                  k7  rt        |t        j                  |            y c c}w )NasciirR  r   )
isinstancerJ   r   decoder   r*   ares_set_servers_csvr  encoder+   r   r   rO  )r   r  r[  rY  rX  rB  s         r   r  zChannel.servers  s    ^ef^eYZAu9M{1~,,W5STT^ef((;'%%dmmA&6w8OP!!!Au~~a011 "	 gs   3B0read_fdwrite_fdc                     t        j                  | j                  d   t        j                  d|      t        j                  d|             y Nr   ares_socket_t)r*   ares_process_fdr  r!   cast)r   rb  rc  s      r   
process_fdzChannel.process_fd  s8    T]]1-tyy'/RTXT]T]^mowTxyr   c                     t        j                  | j                  d   t        j                  d|      t        j                  dt
                     y re  r*   rg  r  r!   rh  ARES_SOCKET_BAD)r   rb  s     r   process_read_fdzChannel.process_read_fd  s;    T]]1-tyy'/RTXT]T]^mo~T  	Ar   c                     t        j                  | j                  d   t        j                  dt
              t        j                  d|             y re  rk  )r   rc  s     r   process_write_fdzChannel.process_write_fd  s?    T]]1-tyy//Z\`\e\efuw  ]A  	Br   c                    t         j                  }t        j                  d      }|p|dk\  r`t        j                  d      }t        t	        j
                  |            |_        t        t	        j                  |d      dz        |_        nt        d      t        j                  | j                  d   ||       |t         j                  k(  ry|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    		XX'(=Cx!23"4::a=1 #DIIa$5$? @ !PQQ$--*E26?		BJJ223r   rY   r2   c                b   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      | j                  |      }t	        j                  | j                  d   |t        j                  |d         |t        j                  |       y )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   rI  ares_gethostbyaddrr  sizeofr4   )r   rY   r2   addr4addr6addressfamilyr?  s           r   gethostbyaddrzChannel.gethostbyaddr  s    !455*+01v~~{4/@5JaOG^^F  +d2CeMQRRG__F122//9a 0'4;;wqz;RTZ\`\i\ikstr   r   )r  r   protorb   hostro   r  r   r  c                   t        |      st        d      |t        j                  }n6t	        |t
              rt        |      j                  d      }nt        |      }| j                  |      }	t        j                  d      }
||
_        ||
_        ||
_        ||
_        t        j                   | j"                  d   t%        |      ||
t        j&                  |	       y )Nr{  r]  zstruct ares_addrinfo_hints*r   )r*  r+  r!   rI   r^  r"  strra  r   rI  rG   ai_flags	ai_familyai_socktypeai_protocolr*   ares_getaddrinfor  r	   rB   )r   r  ro   r  r   r  rb   r2   r8   r?  hintss              r   getaddrinfozChannel.getaddrinfo  s     !455<iiGc"$i&&w/G!$'G//967  !dmmA.
40@'5RVRcRcemnr   )query_classr   
query_typer  c          	         t        |      st        d      || j                  vrt        d      || j                  vrt        d      | j                  |      }t        j                  d      }t        j                  | j                  d   t        |      ||t        j                  ||      }|t        j                  k7  r5t        j                  |d       t!        |t#        j$                  |            y)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__rI  r!   rG   r*   ares_query_dnsrecr  r	   r>   r+   r   r-   r   r   rO  )r   r   r  r  r2   r?  qidr/   s           r   queryzChannel.query  s     !455T__,;<<d///<==//9hh)*''MM!t!!
 T&&&""8T2FENN6$:;; '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                  k7  rt        |t!        j"                  |            |d   
t        j$                  
t'        |      ||      }|t        j                  k7  r4t        j(                  
       t        |t!        j"                  |            |
fd}| j+                  |      }	t        j,                  | j.                  d   
t        j0                  |	      }|t        j                  k7  rJt2        j5                  |	d       t        j(                  
       t        |t!        j"                  |            y)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                 x    	  | |       t        j                         y # t        j                         w xY wr    )r*   ares_dns_record_destroy)r3   errorr<   original_callbacks     r   cleanup_callbackz(Channel.search.<locals>.cleanup_callback/  s1    5!&%0 ,,V4,,V4s   	" 9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   rO  ares_dns_record_query_addr	   r  rI  ares_search_dnsrecr  r>   r   r-   )r   r   r  r  r2   	dns_flagsdnsrec_pr/   r  r?  r<   r  s             @@r   searchzChannel.search  s    !455T__,;<<d///<== ++(@(@@AtGXGX	8823,,""##
 T&&&FENN6$:;;! //t	
 T&&&((0FENN6$:;; %	5 //0@A((MM!!!	
 T&&&""8T2((0FENN6$:;; 'r   c                    t        j                  d      }t        j                  d      }t        j                  t        j
                  t        |      |      dk(  rAt        j                  | j                  d   t	        j                  |j                               y t        j                  t        j                  t        |      |      dk(  r$t        j                  | j                  d   |       y 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v~~{2F!K##DMM!$4fll5<<6PQ  +b/5IQN##DMM!$4e<122r   r  c                D   t        |      st        d      t        |      dk(  r|\  }}t        j                  d      }t        j                  t        j                  t        |      t        j                  |j                              dk7  rt        d|z        t        j                  |_        t        j                  |      |_        |}nt        |      dk(  r|\  }}}}	t        j                  d      }
t        j                  t        j                   t        |      t        j                  |
j"                              dk7  rt        d|z        t        j                   |
_        t        j                  |      |
_        t        j(                  |      |
_        |	|
_        |
}nt        d	      | j/                  |      }t        j0                  | j2                  d
   t        j4                  d|      t        j6                  |d
         |t
        j8                  |       y )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+  r4  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_idrI  ares_getnameinfor  rh  r  r9   )r   r  rb   r2   r  ro   sa4saflowinfoscope_idsa6r?  s               r   getnameinfozChannel.getnameinfoM  s   !455w<1 JR((01C""6>>;r?DNNSVS_S_D`aeff !:R!?@@#^^CN!<<-CLB\Q-4*Rx((12C""6??KOT^^TWTaTaEbcghh !:R!?@@$ooCO"LL.CM &X 6C (CB788//9dmmA.		:Lb0QSWS^S^_abc_dSeglnrnn  BJ  	Kr   c                 J    t        j                  | j                  d   |       y rK  )r*   ares_set_local_devr  )r   devs     r   r;  zChannel.set_local_devi  s    a 0#6r   c                     | j                   y| j                   dc}| _         t        j                  || j                         y)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
  r-  )r   r   s     r   rD  zChannel.closel  s;     ==  "&))'43M3MNr   c                     t        j                  | j                  d   ||dk\  rt        |dz        nd      }|t         j                  k(  ry|t         j
                  k(  ry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   r  r   TF)	r*   r   r  r"  r+   ARES_ETIMEOUTr   r   rO  )r   r  rB  s      r   waitzChannel.wait  sr     &&t}}Q'7QXQdiptuiu#gn:M{}~!!!$$$$Au~~a0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   rE  rI  rL  rP  propertylistr  setterri  rm  ro  r  r   r  rz   AddressFamilyr  QUERY_CLASS_INr  r  r:  IP4IP6r  r;  rD  r  r   r   r   r   r     s!   &&(?(?AWAWY]YoYoqu  rJ  rJ  LP  Ld  Ld  fj  f{  f{  }A  }U  }U  W[  Wl  Wl  nr  nD  nD  FJ  F\  F\  ^b  ^t  ^t  vz  vM  vM  OS  Oe  Oe  gk  g}  g}  ~J&&(=(=t?U?UW[WkWkmq  nA  nA  BL )-,0(,(,+/+/BFBF48NR:>=A %59,0<@#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"h2+2
 c   ^^2xc5j(9: 2t 2 2z# z z zAc Ad AB B B4&u# uHc3Z=M4N uSW u. ()oo smo
 $$o o o o C:t+,o 
o< GU "<# "<3 "< "<`hjmorisuyiy`z "<  @D "<H HV E<3 E<C E< E<aiknpsjtvzjza{ E<  AE E<N3K5c? K3 KXWZ\_V`bfVfMg Klp K87O.2E 24 2r   c                       e Zd ZU dZeed<   y)r|   z Data for A (IPv4 address) recordrY   Nr   r   r   r  r  __annotations__r   r   r   r|   r|     s
    *
Ir   r|   c                       e Zd ZU dZeed<   y)r   z#Data for AAAA (IPv6 address) recordrY   Nr  r   r   r   r   r     s
    -
Ir   r   c                   &    e Zd ZU dZeed<   eed<   y)r   z"Data for MX (mail exchange) recordrZ   r[   Nr   r   r   r  r"  r  r  r   r   r   r   r     s    ,MMr   r   c                       e Zd ZU dZeed<   y)r   zData for TXT (text) recordr#   N)r   r   r   r  rJ   r  r   r   r   r   r     s
    $
Kr   r   c                   0    e Zd ZU dZeed<   eed<   eed<   y)r   z;Data for CAA (certification authority authorization) recordr\   r]   r^   Nr  r   r   r   r   r     s    EM	HJr   r   c                       e Zd ZU dZeed<   y)r   z&Data for CNAME (canonical name) recordr_   Nr  r   r   r   r   r     s
    0Jr   r   c                   N    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<   y)	r   z0Data for NAPTR (naming authority pointer) recordr`   ra   rb   r8   rc   rd   Nr  r   r   r   r   r     s$    :JOJLKr   r   c                       e Zd ZU dZeed<   y)r   z Data for NS (name server) recordre   Nr  r   r   r   r   r     s
    *Lr   r   c                       e Zd ZU dZeed<   y)r   zData for PTR (pointer) recordrf   Nr  r   r   r   r   r     s
    'Jr   r   c                   X    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<   y	)
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     s(    2JJKLJKLr   r   c                   :    e Zd ZU dZeed<   eed<   eed<   eed<   y)r   zData for SRV (service) recordrZ   rn   ro   rp   Nr  r   r   r   r   r     s    'MK
IKr   r   c                   :    e Zd ZU dZeed<   eed<   eed<   eed<   y)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     s    COM  r   r   c                   0    e Zd ZU dZeed<   eed<   eed<   y)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     s    <MKLr   r   c                   0    e Zd ZU dZeed<   eed<   eed<   y)r   z<Data for URI (Uniform Resource Identifier) record - RFC 7553rZ   rn   rp   Nr  r   r   r   r   r     s    FMKKr   r   c                   f    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<   y)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     sK    1
I
I	H
^\=m]M. / /r   r   c                   B    e Zd ZU dZee   ed<   ee   ed<   ee   ed<   y)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      s#    BOIYr   r   c                   <    e Zd ZU dZeed<   ee   ed<   ee   ed<   y)
HostResultz%Result from gethostbyaddr() operationr   aliases	addressesN)r   r   r   r  r  r  r  r   r   r   r  r  
  s    /
I#YCyr   r  c                   ,    e Zd ZU dZeed<   ee   ed<   y)NameInfoResultz#Result from getnameinfo() operationr7   r8   N)r   r   r   r  r  r  r   r   r   r   r  r    s    -
Ic]r   r  c                   N    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<   y)	AddrInfoNodez-Single address node from getaddrinfo() resultr   rb   r  socktypeprotocolrY   N)r   r   r   r  r"  r  tupler   r   r   r  r    s#    7	HJKMM
Kr   r  c                   0    e Zd ZU dZeed<   eed<   eed<   y)AddrInfoCnamez+CNAME information from getaddrinfo() resultr   aliasr   Nr  r   r   r   r  r  !  s    5	HJ
Ir   r  c                   2    e Zd ZU dZee   ed<   ee   ed<   y)AddrInfoResultz,Complete result from getaddrinfo() operationcnamesnodesN)r   r   r   r  r  r  r  r  r   r   r   r  r  (  s    6r   r  r  c                 f   t        t        j                  | j                              }g }g }d}| j                  |   t        j
                  k7  r`|j                  t        t        j                  | j                  |                      |dz  }| j                  |   t        j
                  k7  r`d}| j                  |   t        j
                  k7  rt        j                  dt        j                        }t        j
                  t        j                  | j                  | j                  |   |t        j                        k7  r<|j                  t        t        j                  |t        j                                     |dz  }| j                  |   t        j
                  k7  r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  sH   T[[01DGI	A


A
$))
+yW->->q-A!BCD	Q 

A
$))
+ 	
A


a
 DII
-hhx!6!6799++G,>,>@S@STU@VX[]a]r]rssYt{{38M8M'NOP	Q	 

a
 DII
- 4IFFr   c                     t        t        j                  |             }|t        j                  k7  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  sB    T*+H5<		5I)DKK0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                        k7  rEt        j&                  |t        j                        t        j(                  |j*                        f}	nt-        d      |j
                  t        j.                  k(  rt        j.                  }t        j                  d|      }t        j                  t        j                  |j0                  t        j"                  |j2                        |t        j                        k7  rZt        j&                  |t        j                        t        j(                  |j4                        |j6                  |j8                  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{   rh  rI   ry   r  r  r  r}   ntohsr  r   r   r  r  r  r  r  r  )
	ares_noder   rb   r  r  addr_structr  r  r[  rY   s
             r   parse_addrinfo_noder  M  s   


CE$$H$$H##K  I$7$7777	)T22	3B.II+[999++ALL$..:TVXZ^ZoZoppKKD$9$9:FLL<TUD=>>			&//	1II,k:99++AMM4>>!++;VXZ\`\q\qrrKKD$9$9:FLL<UWXWfWfhihwhwxD=>>233CuVhYahl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  sB    NNJ$4$456t{{:??34 r   c                    g }g }| j                   }|t        j                  k7  r:|j                  t	        |             |j
                  }|t        j                  k7  r:| j                  }|t        j                  k7  r:|j                  t        |             |j                  }|t        j                  k7  r:t        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
tyy
 *956NN	 tyy
  ""H
dii
(23## dii
 	=)u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_RULESrl  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_ALLrG  ares_threadsafety r   utilsr   r   r	   _versionr
   rq  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)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  rl  ru   r6  r~   r7  r  r8  r   r9  r   r:  r   r<  r   r=  r   r>  r   r?  r   r@  r   rA  r   rC  r   rB  r   r;  r   rD  r  r  r  rE  r  rF  r  rG  r  rH  r}   ares_versionrI   rI  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>rZ     s#   , , ...t/E/EFF$,
4
55t
?
@@  5 5 !    . ! @ @ CHoCc3 &&** &&.. ,, ,, .. 22 $$22  $$.. (( .. ""    00 ,, 22 #@@ #'#H#H   && ##))''''++ %%++ %%''''''''))++ '' ##)) '''' %%%6T%6%6tyy%ABC 		 	 ,. Di( - 1 1 & &  & &  & &, & &"&DHNTn/9 /9f ,- x2 x2|         
                         ! ! !       	/ 	/ 	/            
         Gj G*>^ >nl nB 6^ 6(Xr   