
    E#i                        % S SK JrJr  SSKr\R                  \R                  " \R                  5      :w  d  \c  \	" S5      eS SK
Jr  S SKJrJrJr  S SKJr  SSKrSSKrSSKrSSKJrJr  SS	KJrJrJrJrJrJr  SS
KJr  \ \!\"4   r#\ \!\"\"\"4   r$\RJ                  r%\RL                  r&\RN                  r'\RP                  r(\RR                  r)\RT                  r*\RV                  r+\RX                  r,\RZ                  r-\R\                  r.\R^                  r/\R`                  r0\Rb                  r1\Rd                  r2\Rf                  r3\Rh                  r4\Rj                  r5\Rl                  r6\Rn                  r7\Rp                  r8\Rr                  r9\Rt                  r:\Rv                  r;\Rx                  r<\Rz                  r=\R|                  r>\R~                  r@\R                  rB\R                  rD\R                  rF\R                  rH\R                  rJ\R                  rL\R                  rN\R                  rP\R                  rR\R                  rT\R                  rV\R                  rX\R                  rZ\R                  r\\R                  r^\R                  r`\" \R                  " \R                  " \R                  5      5      5      rdSre " S S\f5      rg0 rh\\S4   \iS'   \R                  " 5       S 5       rk\R                  " 5       S 5       rl\R                  " 5       S 5       rm\R                  " 5       S 5       rn\R                  " 5       S 5       roS rp " S S5      rq\q" 5       rr " S S5      rs " S S5      rt " S S\t5      ru " S S\t5      rv " S S \t5      rw " S! S"\t5      rx " S# S$\t5      ry " S% S&\t5      rz " S' S(\t5      r{ " S) S*\t5      r| " S+ S,\t5      r} " S- S.\t5      r~ " S/ S0\t5      r " S1 S2\t5      r " S3 S4\t5      r " S5 S6\t5      r " S7 S8\t5      r " S9 S:\t5      r " S; S<\t5      rS=\4S> jrS?rg)@   )ffilib    NzCould not initialize c-ares)errno)ascii_bytes	maybe_str
parse_name)__version__)CallableIterable)Anyr   FinalOptionalDictUnion)SimpleQueue   c                       \ rS rSrSrg)	AresErrorO    N)__name__
__module____qualname____firstlineno____static_attributes__r       J/home/james-whalen/.local/lib/python3.13/site-packages/pycares/__init__.pyr   r   O   s    r   r   Channel_handle_to_channelc                 B    [         R                  " U 5      nU" XU5        g N)_ffifrom_handle)data	socket_fdreadablewritablesock_state_cbs        r   _sock_state_cbr*   X   s     $$T*M)x0r   c                     U [         ;  a  g [        R                  " U 5      nU[        R                  :w  a  S nO[        U5      nS nU" XQ5        [         R                  U S 5        g r"   )r    r#   r$   _libARES_SUCCESSares_host_resultpop)argstatustimeoutshostentcallbackresults         r   _host_cbr6   _   sZ     $$$H"""!'*V3%r   c                     U [         ;  a  g [        R                  " U 5      nU[        R                  :w  a  S nO[        X45      nS nU" Xa5        [         R                  U S 5        g r"   )r    r#   r$   r,   r-   ares_nameinfo_resultr/   )r0   r1   r2   nodeservicer4   r5   s          r   _nameinfo_cbr;   p   sZ     $$$H"""%d4V3%r   c                 L   U [         ;  a  g [        R                  " U 5      u  pVU[        R                  :X  GaL  U[        R
                  :X  Ga(  / n[        R                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                   4 Hx  n[#        XU5      u  pUS [        R$                  [        R&                  4;  a  S n  OVU	c  M?  [)        U	[*        5      (       a  UR-                  U	5        Mg  UR/                  U	5        Mz     S nO[#        XcU5      u  pqOS nU" Xq5        [         R1                  U S 5        g r"   )r    r#   r$   r,   r-   T_ANYT_AT_AAAAT_CAAT_CNAMET_MXT_NAPTRT_NST_PTRT_SOAT_SRVT_TXTparse_resultARES_ENODATAARES_EBADRESP
isinstancer   extendappendr/   )
r0   r1   r2   abufalenr4   
query_typer5   qtypers
             r   	_query_cbrT      sT    $$++C0H"""#F((DKKT\\499VZVbVbdhdmdmosoyoy{  |F  |F  HL  HR  HR  TX  T^  T^  _(d;	$(9(94;M;M!NN!F=!!X..a(a( _ )*DANFFV3%r   c                     U [         ;  a  g [        R                  " U 5      nU[        R                  :w  a  S nO[        U5      nS nU" XQ5        [         R                  U S 5        g r"   )r    r#   r$   r,   r-   ares_addrinfo_resultr/   )r0   r1   r2   resr4   r5   s         r   _addrinfo_cbrX      sZ     $$$H"""%c*V3%r   c                    U [         R                  :X  a  [        R                  " S[        5      n[        R                  " S[        5      n[         R
                  " X[        R                  X45      nU[         R                  :w  a  S nUnXg4$ [        US   5       Vs/ s H  n[        X8   5      PM     nnS n Xg4$ U [         R                  :X  a  [        R                  " S[        5      n[        R                  " S[        5      n[         R                  " X[        R                  X45      nU[         R                  :w  a  S nUnXg4$ [        US   5       Vs/ s H  n[        X8   5      PM     nnS n Xg4$ U [         R                  :X  a  [        R                  " S5      n	[         R                  " XU	5      nU[         R                  :w  a  S nUnXg4$ / nU	S   n
U
[        R                  :w  a<  UR                  [!        U
5      5        U
R"                  n
U
[        R                  :w  a  M<  [         R$                  " U	S   5        S n Xg4$ U [         R&                  :X  a  [        R                  " S5      n[         R
                  " XU[        R                  [        R                  5      nU[         R                  :w  a  S nUnXg4$ [)        US   5      n[         R*                  " US   5        S n Xg4$ U [         R,                  :X  a  [        R                  " S5      n[         R.                  " XU5      nU[         R                  :w  a  S nUnXg4$ / nUS   nU[        R                  :w  a<  UR                  [1        U5      5        UR"                  nU[        R                  :w  a  M<  [         R$                  " US   5        S n Xg4$ U [         R2                  :X  a  [        R                  " S5      n[         R4                  " XU5      nU[         R                  :w  a  S nUnXg4$ / nUS   nU[        R                  :w  a<  UR                  [7        U5      5        UR"                  nU[        R                  :w  a  M<  [         R$                  " US   5        S n Xg4$ U [         R8                  :X  a  [        R                  " S5      n[         R:                  " XU5      nU[         R                  :w  a  S nUnXg4$ / nUS   nSnUR<                  U   [        R                  :w  aO  UR                  [?        UR<                  U   5      5        US	-  nUR<                  U   [        R                  :w  a  MO  [         R*                  " U5        S n Xg4$ U [         R@                  :X  Ga  [        R                  " S5      n[         RB                  " X[        R                  S[D        RF                  U5      nU[         R                  :w  a  S nUnXg4$ / nUS   nSnUR<                  U   [        R                  :w  ac  UR                  [I        [        RJ                  " UR<                  U   5      5      5        US	-  nUR<                  U   [        R                  :w  a  Mc  [M        UU5      n[         R*                  " U5        S n Xg4$ U [         RN                  :X  au  [        R                  " S
5      n[         RP                  " XU5      nU[         R                  :w  a  S nUnXg4$ [S        US   5      n[         R$                  " US   5        S n Xg4$ U [         RT                  :X  a  [        R                  " S5      n[         RV                  " XU5      nU[         R                  :w  a  S nUnXg4$ / nUS   nU[        R                  :w  a<  UR                  [Y        U5      5        UR"                  nU[        R                  :w  a  M<  [         R$                  " US   5        S n Xg4$ U [         RZ                  :X  Ga  [        R                  " S5      n[         R\                  " XU5      nU[         R                  :w  a  S nUnXg4$ / nUS   nS n U[        R                  :X  a  Ub  UR                  [_        U5      5        OqUR`                  S	:X  a)  Ub  UR                  [_        U5      5        [c        U5      nO*[c        U5      nU=Rd                  URd                  -  sl2        UR"                  nM  [         R$                  " US   5        S n Xg4$ [g        S5      es  snf s  snf )Nzstruct ares_addrttl[]zint*r   zstruct ares_addr6ttl[]zstruct ares_caa_reply **zstruct hostent **zstruct ares_mx_reply **zstruct ares_naptr_reply **r   zstruct ares_soa_reply **zstruct ares_srv_reply **zstruct ares_txt_ext **invalid query type specified)4r,   r>   r#   newPYCARES_ADDRTTL_SIZEares_parse_a_replyNULLr-   rangeares_query_a_resultr?   ares_parse_aaaa_replyares_query_aaaa_resultr@   ares_parse_caa_replyrN   ares_query_caa_resultnextares_free_datarA   ares_query_cname_resultares_free_hostentrB   ares_parse_mx_replyares_query_mx_resultrC   ares_parse_naptr_replyares_query_naptr_resultrD   ares_parse_ns_reply	h_aliasesares_query_ns_resultrE   ares_parse_ptr_replysocket	AF_UNSPECr   stringares_query_ptr_resultrF   ares_parse_soa_replyares_query_soa_resultrG   ares_parse_srv_replyares_query_srv_resultrH   ares_parse_txt_reply_extares_query_txt_resultrecord_startares_query_txt_result_chunktext
ValueError)rQ   rO   rP   addrttls	naddrttlsparse_statusr5   r1   i	caa_replycaa_reply_ptrhostmx_replymx_reply_ptrnaptr_replynaptr_reply_ptrr3   aliases	soa_reply	srv_replysrv_reply_ptr	txt_replytxt_reply_ptrtmp_obj	new_chunks                            r   rI   rI      sg   TXX8835IJHHV%9:	..t499hZ4,,,F!Fj >g AFiPQl@ST@S1)(+6@SFTFd >c 
t{{	"8846JKHHV%9:	11$dii]4,,,F!FV >S DISTCVWCVa,X[9CVFWFP >O 
tzz	!HH78	00YG4,,,F!FD >A F%aLM499,3MBC - 2 2  499, 	!-Ft >s 
t||	#xx+,..t4DIIV4,,,F!Fh >e -T!W5F""47+F` >_ 
tyy	 8856//HE4,,,F!FT >Q F#A;L$))+2<@A+00 $))+ ,FD >C 
t||	#hh;<224{K4,,,F!Fx >u F)!nO!TYY.5oFG"1"6"6 "TYY. A/Fh >g 
tyy	 ((.///GD4,,,F!F\ >Y F1:DA..#tyy024>>!3DEFQ ..#tyy0 ""4(FJ >I 
tzz	!((./00TYY6K[K[]de4,,,F!F~ >{ G1:DA..#tyy0yT^^A5F)GHIQ ..#tyy0 +49F""4(Fj >i 
tzz	!HH78	00YG4,,,F!F^ >[ +9Q<8F	!-FV >U 
tzz	!HH78	00YG4,,,F!FJ >G F%aLM499,3MBC - 2 2  499, 	!-F: >9 
tzz	!HH56	44TK4,,,F!F. >+ F%aLMG DII-*&;G&DE --2*&;G&DE9-HG ;M JILLINN2L - 2 2  	!-F > 788c U Xs   eec                   @    \ rS rSrSrS	S jrS	S jrS	S jrS	S jrSr	g)
_ChannelShutdownManageriP  zLManages channel destruction in a single background thread using SimpleQueue.Nc                 d    [        5       U l        S U l        [        R                  " 5       U l        g r"   )r   _queue_thread	threadingLock_start_lockselfs    r   __init__ _ChannelShutdownManager.__init__S  s!    #.=37$>>+r   c                      U R                   R                  5       n[        R                  " US   5        [        R                  " US   S5        Ub  [        R
                  " US   5        Mk  )z4Process channel destruction requests from the queue.r   )r   getr,   ares_cancelares_queue_wait_emptyares_destroyr   channels     r   _run_safe_shutdown_loop/_ChannelShutdownManager._run_safe_shutdown_loopX  s^    kkoo'G WQZ( &&wqz26 "!!'!*- r   c                    U R                   b  gU R                     U R                   b
   SSS5        g[        R                  " U R                  SS9U l         U R                   R                  5         SSS5        g! , (       d  f       g= f)z3Start the background thread if not already started.NT)targetdaemon)r   r   r   Threadr   startr   s    r   r   _ChannelShutdownManager.starth  sf    <<#||'  %++43O3OX\]DLLL  s   A:>A::
Bc                 :    U R                   R                  U5        g)a5  
Schedule channel destruction on the background thread with a safety delay.

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   putr   s     r   destroy_channel'_ChannelShutdownManager.destroy_channels  s     	 r   )r   r   r   returnN)
r   r   r   r   __doc__r   r   r   r   r   r   r   r   r   r   P  s    V,
. 	!	!r   r   c            %          \ rS rSr\R
                  \R                  \R                  \R                  \R                  \R                  \R                  \R                  \R                  \R                  \R                  \R                   4r\R$                  \R&                  \R(                  \R*                  \R,                  4r                 S9S\\   S\\   S\\   S\\   S\\   S\\   S	\\\\\4         S
\\\\\4         S\\\S4   S\\\\ \ /S4      S\\   S\\   S\ S\\\S4   S\\   S\\\S4   S\ SS4$S jjr!S:S jr"S r#S:S jr$S:S jr%\&S\'\   4S j5       r(\(RR                  S	\\\\4      SS4S j5       r(S r*S\S\SS4S jr+S\SS4S  jr,S\SS4S! jr-S;S" jr.S#\S$\\/\/S4   SS4S% jr0S&\S'\1Rd                  S$\\/\/S4   SS4S( jr3    S<S)\S*\\   S$\\/\/S4   S'\1Rd                  S+\S,\S\SS4S- jjr4S;S&\S.\S$\\/\/S4   S/\\   SS4
S0 jjr5S;S1 jr6S;S2 jr7S3 r8S4\\9\:4   S\S$\\/\/S4   SS4S5 jr;S6 r<S:S7 jr=S8r>g)=r   i  Nflagstimeouttriesndotstcp_portudp_portserversdomainslookupsr)   socket_send_buffer_sizesocket_receive_buffer_sizerotatelocal_ip	local_devresolvconf_pathevent_threadr   c           	         S U l         [        R                  " S5      n[        R                  " S5      nSnUb  UUl        U[        R
                  -  nUb&  [        US-  5      Ul        U[        R                  -  nUb  UUl	        U[        R                  -  nUb  UUl        U[        R                  -  nUb  UUl        U[        R                  -  nUb  UUl        U[        R                   -  nUb  UUl        U[        R$                  -  nUb  UUl        U[        R(                  -  nU
(       ay  [+        U
5      (       d  [-        S5      eU(       a  [/        S5      e[        R0                  " U
5      nUU l        [        R4                  Ul        UUl        U[        R:                  -  nU(       aT  [=        5       (       d  [/        S5      eU
(       a  [/        S5      eU[        R>                  -  n[        R@                  Ul!        U	(       a8  [        R                  " S[E        U	5      5      Ul#        U[        RH                  -  nU(       a  U Vs/ s H#  n[        R                  " S[E        U5      5      PM%     nn[        R                  " S	[K        U5      S
-   -  5      n[M        [K        U5      5       H  nUU   UU'   M     UUl'        [K        U5      Ul(        U[        RR                  -  nU(       a  U[        RT                  -  nUb8  U[        RV                  -  n[        R                  " S[E        U5      5      Ul,        [        RZ                  " UUU5      nU[        R\                  :w  a  [_        S5      eUU l0        UU l         U(       a  Xpl1        U(       a  U Re                  U5        U(       a  U Rg                  U5        [h        Rk                  5         g s  snf )Nzares_channel *zstruct ares_options *r   i  zsock_state_cb is not callablez6sock_state_cb and event_thread cannot be used togetherz&c-ares is not built with thread safetychar[]z
char *[%d]r   z#Failed to initialize c-ares channel)6_channelr#   r[   r   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RuntimeError
new_handle_sock_state_cb_handler*   r)   sock_state_cb_dataARES_OPT_SOCK_STATE_CBares_threadsafetyARES_OPT_EVENT_THREADARES_EVSYS_DEFAULTevsysr   r   ARES_OPT_LOOKUPSlenr_   r   ndomainsARES_OPT_DOMAINSARES_OPT_ROTATEARES_OPT_RESOLVCONFr   ares_init_optionsr-   r   _event_threadr   set_local_ipset_local_dev_shutdown_managerr   )r   r   r   r   r   r   r   r   r   r   r)   r   r   r   r   r   r   r   r   optionsoptmaskuserdatar   strscrS   s                             r   r   Channel.__init__  s>   ( ((+,((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$&&"#KLL"#[\\!;!;;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 *"Lh'y) 	!C Is   *Oc                 $    U R                  5         g)z;Ensure the channel is destroyed when the object is deleted.N)closer   s    r   __del__Channel.__del__   s    

r   c                 t    U R                   c  [        S5      e[        R                  " U5      nU [        U'   U$ )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   r   r#   r   r    )r   callback_datar   s      r   _create_callback_handleChannel._create_callback_handle  s8    $ == MNN??=1'+8$r   c                 J    [         R                  " U R                  S   5        g Nr   )r,   r   r   r   s    r   cancelChannel.cancel  s    q)*r   c                     [         R                  " U R                  S   5      nU[         R                  :w  a   [	        U[
        R                  " U5      5      eg r   )r,   ares_reinitr   r-   r   r   strerror)r   rS   s     r   reinitChannel.reinit   sD    T]]1-.!!!Au~~a011 "r   c                    [         R                  " S5      n[        R                  " U R                  S   U5      nU[        R
                  :w  a   [        U[        R                  " U5      5      e/ n[         R                  " SUS   5      n U[         R                  :X  a   U$ [         R                  " S[        R                  5      nUS   n[         R                  [        R                  " UR                  [         R                  " UR                  5      U[        R                  5      :w  a=  UR                  [!        [         R"                  " U[        R                  5      5      5        UR$                  nM  )Nzstruct ares_addr_node **r   char [])r#   r[   r,   ares_get_serversr   r-   r   r   r   r^   INET6_ADDRSTRLENares_inet_ntopfamily	addressofaddrrN   r   rs   re   )r   r   rS   server_listserveripss          r   r   Channel.servers%  s   ((56!!$--"2G<!!!Au~~a0114gajA"  )T%:%:;Bq	AyyD//$..:PRTVZVkVkll""9T[[T=R=R-S#TUVVF r   c           	      d   [         R                  " S[        U5      -  5      n[        U5       GH&  u  p4[        R
                  " [        R                  [        U5      [         R                  " X#   R                  R                  5      5      S:X  a  [        R                  X#   l        O[        R
                  " [        R                  [        U5      [         R                  " X#   R                  R                  5      5      S:X  a  [        R                  X#   l        O[        S5      eUS:  d  GM  [         R                  " X#   5      X#S-
     l        GM)     [        R"                  " U R$                  S   U5      nU[        R&                  :w  a   [)        U[*        R,                  " U5      5      eg )Nzstruct ares_addr_node[%d]r   invalid IP addressr   )r#   r[   r   	enumerater,   ares_inet_ptonrq   AF_INETr   r  r  addr4r  AF_INET6addr6r~   re   ares_set_serversr   r-   r   r   r   )r   r   r   r   r  rS   s         r   r   r  <  s*   HH03w<?@"7+IA""6>>;v3FWXW[W`W`WfWfHghlmm$nn$$V__k&6I4>>Z[Z^ZcZcZiZiKjkopp$oo !5661u $qt 4a% , !!$--"2A6!!!Au~~a011 "r   c                    / n/ n[         R                  " S[        R                  -  5      n[        R                  " U R
                  S   U[        R                  5      n[        [        R                  5       Ha  n[        R                  " XE5      (       a  UR                  X5   5        [        R                  " XE5      (       d  MN  UR                  X5   5        Mc     X4$ )Nzares_socket_t [%d]r   )
r#   r[   r,   ARES_GETSOCK_MAXNUMares_getsockr   r_   ARES_GETSOCK_READABLErN   ARES_GETSOCK_WRITABLE)r   rfdswfdssocksbitmaskr   s         r   getsockChannel.getsockN  s    -0H0HHI##DMM!$4eT=U=UVt//0A))'55EH%))'55EH%	 1 zr   read_fdwrite_fdc                     [         R                  " U R                  S   [        R                  " SU5      [        R                  " SU5      5        g Nr   ares_socket_t)r,   ares_process_fdr   r#   cast)r   r   r!  s      r   
process_fdChannel.process_fd[  s8    T]]1-tyy'/RTXT]T]^mowTxyr   c                     [         R                  " U R                  S   [        R                  " SU5      [        R                  " S[
        5      5        g r#  r,   r%  r   r#   r&  ARES_SOCKET_BAD)r   r   s     r   process_read_fdChannel.process_read_fd^  s;    T]]1-tyy'/RTXT]T]^mo~T  	Ar   c                     [         R                  " U R                  S   [        R                  " S[
        5      [        R                  " SU5      5        g r#  r*  )r   r!  s     r   process_write_fdChannel.process_write_fda  s?    T]]1-tyy//Z\`\e\efuw  ]A  	Br   c                    [         R                  n[         R                  " S5      nUbt  US:  ac  [         R                  " S5      n[        [        R
                  " U5      5      Ul        [        [        R                  " US5      S-  5      Ul        O[        S5      e[        R                  " U R                  S   X#5        U[         R                  :X  a  gUR                  UR                  S-  -   $ )Nzstruct timeval*g        g      ?i@B z-timeout needs to be a positive number or Noner   g    .A)r#   r^   r[   r   mathfloortv_secfmodtv_usecr~   r,   ares_timeoutr   )r   tmaxtvtvs       r   r   Channel.timeoutd  s    		XX'(=Cx!23"4::a=1 #DIIa$5$? @ !PQQ$--*E6?		BJJ223r   r  r4   c                 |   [        U5      (       d  [        S5      e[        R                  " S5      n[        R                  " S5      n[        R
                  " [        R                  [        U5      U5      S:X  a  Un[        R                  nOQ[        R
                  " [        R                  [        U5      U5      S:X  a  Un[        R                  nO[        S5      eU R                  U5      n[        R                  " U R                  S   U[        R                  " US   5      U[        R                  U5        g )Na callable is requiredstruct in_addr*struct ares_in6_addr*r   r  r   )r   r   r#   r[   r,   r  rq   r  r   r  r~   r   ares_gethostbyaddrr   sizeofr6   )r   r  r4   r  r  addressr  r   s           r   gethostbyaddrChannel.gethostbyaddrw  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   namer  c                     [        U5      (       d  [        S5      eU R                  U5      n[        R                  " U R
                  S   [        U5      U[        R                  U5        g )Nr=  r   )r   r   r   r,   ares_gethostbynamer   r	   r6   )r   rE  r  r4   r   s        r   gethostbynameChannel.gethostbyname  sR    !!455//9a 0*T2BFDMM[cdr   r   porttypeprotoc                    [        U5      (       d  [        S5      eUc  [        R                  nO;[	        U[
        5      (       a  [        U5      R                  S5      nO[        U5      nU R                  U5      n	[        R                  " S5      n
Xzl        XJl        XZl        Xjl        [        R                   " U R"                  S   [%        U5      X[        R&                  U	5        g )Nr=  asciizstruct ares_addrinfo_hints*r   )r   r   r#   r^   rL   r   strencoder   r   r[   ai_flags	ai_familyai_socktypeai_protocolr,   ares_getaddrinfor   r	   rX   )r   r   rJ  r4   r  rK  rL  r   r:   r   hintss              r   getaddrinfoChannel.getaddrinfo  s     !!455<iiGc""$i&&w/G!$'G//967  !dmmA.
40@'RVRcRcemnr   rQ   query_classc                 B    U R                  [        R                  XX4S9  g N)rY  )	_do_queryr,   
ares_queryr   rE  rQ   r4   rY  s        r   queryChannel.query  s    t(\r   c                 B    U R                  [        R                  XX4S9  g r[  )r\  r,   ares_searchr^  s        r   searchChannel.search  s    t''8]r   c                 L   [        U5      (       d  [        S5      eX0R                  ;  a  [        S5      eUc  [        R
                  nXPR                  ;  a  [        S5      eU R                  XC45      nU" U R                  S   [        U5      XS[        R                  U5        g )Nr=  rZ   zinvalid query class specifiedr   )r   r   
__qtypes__r~   r,   C_IN__qclasses__r   r   r	   rT   )r   funcrE  rQ   r4   rY  r   s          r   r\  Channel._do_query  s    !!455__,;<<))K///<==//0FGT]]1z$/$..Zbcr   c                    [         R                  " S5      n[         R                  " S5      n[        R                  " [        R
                  [        U5      U5      S:X  aC  [        R                  " U R                  S   [        R                  " UR                  5      5        g [        R                  " [        R                  [        U5      U5      S:X  a%  [        R                  " U R                  S   U5        g [        S5      e)Nr>  r?  r   r   r  )r#   r[   r,   r  rq   r  r   ares_set_local_ip4r   ntohls_addrr  ares_set_local_ip6r~   )r   r	  r  r  s       r   r   Channel.set_local_ip  s    *+01v~~{2F!K##DMM!$4fll5<<6PQ  +b/5IQN##DMM!$4e<122r   rB  c                 f   [        U5      (       d  [        S5      e[        U5      S:X  a  Uu  pE[        R                  " S5      n[
        R                  " [        R                  [        U5      [        R                  " UR                  5      5      S:w  a  [        SU-  5      e[        R                  Ul        [        R                  " U5      Ul        UnO[        U5      S:X  a  Uu  pEp[        R                  " S5      n
[
        R                  " [        R                   [        U5      [        R                  " U
R"                  5      5      S:w  a  [        SU-  5      e[        R                   U
l        [        R                  " U5      U
l        [        R(                  " U5      U
l        Xl        U
nO[        S	5      eU R/                  U5      n[
        R0                  " U R2                  S
   [        R4                  " SU5      [        R6                  " US
   5      U[
        R8                  U5        g )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   r   r#   r[   r,   r  rq   r  r   r  sin_addrr~   
sin_familyhtonssin_portr  	sin6_addrsin6_family	sin6_porthtonlsin6_flowinfosin6_scope_idr   ares_getnameinfor   r&  rA  r;   )r   rB  r   r4   r	  rJ  sa4saflowinfoscope_idsa6r   s               r   getnameinfoChannel.getnameinfo  s   !!455w<1 JR((01C""6>>;r?DNNSVS_S_D`aeff !:R!?@@#^^CN!<<-CLB\Q-4*Rx((12C""6??KOT^^TWTaTaEbcghh !:R!?@@$ooCO"LL.CM &X 6C (B788//9dmmA.		:Lb0QSWS^S^_abc_dSeglnrnn  BJ  	Kr   c                 L    [         R                  " U R                  S   U5        g r   )r,   ares_set_local_devr   )r   devs     r   r   Channel.set_local_dev  s    a 0#6r   c                 p    U R                   c  gU R                   Ssol         [        R                  U5        g)av  
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   s     r   r   Channel.close  s1     ==  "&))'2r   )r   r   r   r   )NNNNNNNNNNNNFNNNFr   r"   )r   r   r   r   )?r   r   r   r   r,   r>   r?   r=   r@   rA   rB   rC   rD   rE   rF   rG   rH   rf  rg  C_CHAOSC_HSC_NONEC_ANYrh  r   r   floatr   r   rO  bytesr   boolr   r   r   r   r   propertylistr   setterr  r'  r,  r/  r   r   rC  rq   AddressFamilyrH  rW  r_  rc  r\  r   IP4IP6r  r   r   r   r   r   r   r   r     s|   ((DKKTZZtyyZ^ZfZfhlhqhqsws}s}  @D  @J  @J  LP  LV  LV  X\  Xb  Xb  cJIIt||TYYTZZPL )-,0(,(,+/+/BFBF48NR:>=A %59,0<@&+#w" w""5/w" !w" !	w"
 $C=w" $C=w" #8E#u*,=#>?w" #8E#u*,=#>?w"  UD 01w" !)3d2CT2I)J Kw" +33-w" .6c]w" w" !eT!12w" %SMw"  #(UD(8"9!w""  $#w"" 15#w"r2+2
 c  , ^^2xc5j(9: 2t 2 2"z# z z zAc Ad AB B B4&u# u3*d:J1K uPT u$e# ev/C/C exY\^aXbdhXhOi enr e ()oo smo C:t+,	o
 $$o o o o 
o:]# ]3 ](C:tCS:T ]cklocp ]  }A ]^d 3K5c? K3 K(TWY\S]_cScJd Kim K873r   c                       \ rS rSrSrS rSrg)
AresResulti  r   c           	          U R                    Vs/ s H  o< S[        X5      < 3PM     nnSU R                  R                  < SSR	                  U5      < 3$ s  snf )N=<z> z, )	__slots__getattr	__class__r   join)r   aattrss      r   __repr__AresResult.__repr__  sJ    :>..I.QAwt/0.I NN33TYYu5EFF Js   AN)r   r   r   r   r  r  r   r   r   r   r  r    s    IGr   r  c                   .    \ rS rSr% SrSr\\S'   S rSr	g)r`   i  r   ttlArK  c                 |   [         R                  " S[        R                  5      n[        R                  " [
        R                  [         R                  " UR                  5      U[        R                  5        [        [         R                  " U[        R                  5      5      U l        UR                  U l        g Nr   )r#   r[   r,   r  r  rq   r  r  ipaddrr   rs   r   r  r   ares_addrttlbufs      r   r   ares_query_a_result.__init__  sq    hhx!6!67FNNDNN<;N;N,OQTVZVkVkldkk#t/D/DEF	##r   N
r   r   r   r   r  rK  r   __annotations__r   r   r   r   r   r`   r`     s    ID%$r   r`   c                   .    \ rS rSr% SrSr\\S'   S rSr	g)rb   i  r  AAAArK  c                 |   [         R                  " S[        R                  5      n[        R                  " [
        R                  [         R                  " UR                  5      U[        R                  5        [        [         R                  " U[        R                  5      5      U l        UR                  U l        g r  )r#   r[   r,   r  r  rq   r  r  ip6addrr   rs   r   r  r  s      r   r   ares_query_aaaa_result.__init__  sq    hhx!6!67FOOT^^L<P<P-QSVX\XmXmndkk#t/D/DEF	##r   Nr  r   r   r   rb   rb     s    ID%$r   rb   c                   .    \ rS rSr% SrSr\\S'   S rSr	g)rd   i%  )criticalr  valuer  CAArK  c                    UR                   U l         [        [        R                  " UR                  UR
                  5      5      U l        [        [        R                  " UR                  UR                  5      5      U l        SU l        g Nr   )	r  r   r#   rs   r  plengthr  lengthr  )r   caas     r   r   ares_query_caa_result.__init__)  sR    !$++cllCKK"HIt{{399cjjAB
r   )r  r  r  r  Nr  r   r   r   rd   rd   %  s    8ID%r   rd   c                   .    \ rS rSr% SrSr\\S'   S rSr	g)rg   i0  )cnamer  CNAMErK  c                 n    [        [        R                  " UR                  5      5      U l        SU l        g r  )r   r#   rs   h_namer  r  )r   r   s     r   r    ares_query_cname_result.__init__4  s"    t{{4;;78
r   Nr  r   r   r   rg   rg   0  s     ID%r   rg   c                   .    \ rS rSr% SrSr\\S'   S rSr	g)rj   i9  )r   priorityr  MXrK  c                     [        [        R                  " UR                  5      5      U l        UR                  U l        SU l        g r  )r   r#   rs   r   r  r  )r   mxs     r   r   ares_query_mx_result.__init__=  s-    dkk"''23	r   Nr  r   r   r   rj   rj   9  s    +ID%r   rj   c                   .    \ rS rSr% SrSr\\S'   S rSr	g)rl   iC  )order
preferencer   r:   regexreplacementr  NAPTRrK  c                    UR                   U l         UR                  U l        [        [        R                  " UR
                  5      5      U l        [        [        R                  " UR                  5      5      U l        [        [        R                  " UR                  5      5      U l        [        [        R                  " UR                  5      5      U l	        SU l
        g r  )r  r  r   r#   rs   r   r:   regexpr  r  r  )r   naptrs     r   r    ares_query_naptr_result.__init__G  s    [[
**t{{5;;78
 U]]!;<t{{5<<89
$T[[1B1B%CDr   )r   r  r  r  r  r:   r  Nr  r   r   r   rl   rl   C  s    ZID%r   rl   c                   .    \ rS rSr% SrSr\\S'   S rSr	g)ro   iQ  r  NSrK  c                 Z    [        [        R                  " U5      5      U l        SU l        g r  )r   r#   rs   r   r  )r   nss     r   r   ares_query_ns_result.__init__U  s    dkk"o.	r   Nr  r   r   r   ro   ro   Q  s    ID%r   ro   c                   .    \ rS rSr% SrSr\\S'   S rSr	g)rt   iZ  )rE  r  r   PTRrK  c                 z    [        [        R                  " UR                  5      5      U l        X l        SU l        g r  )r   r#   rs   r  rE  r   r  )r   r3   r   s      r   r   ares_query_ptr_result.__init__^  s'    dkk'..9:	r   )r   rE  r  Nr  r   r   r   rt   rt   Z  s    *ID%r   rt   c                   .    \ rS rSr% SrSr\\S'   S rSr	g)rv   id  )nsname
hostmasterserialrefreshretryexpiresminttlr  SOArK  c                 t   [        [        R                  " UR                  5      5      U l        [        [        R                  " UR                  5      5      U l        UR
                  U l        UR                  U l        UR                  U l        UR                  U l	        UR                  U l
        SU l        g r  )r   r#   rs   r  r  r  r  r  expirer  r  r  )r   soas     r   r   ares_query_soa_result.__init__h  sr    CJJ 78#DKK$?@jj{{YY
zzjjr   )r  r  r  r  r  r  r  r  Nr  r   r   r   rv   rv   d  s    bID%r   rv   c                   .    \ rS rSr% SrSr\\S'   S rSr	g)rx   is  )r   rJ  r  weightr  SRVrK  c                     [        [        R                  " UR                  5      5      U l        UR                  U l        UR
                  U l        UR                  U l        SU l        g r  )r   r#   rs   r   rJ  r  r  r  )r   srvs     r   r   ares_query_srv_result.__init__w  sC    dkk#((34	HH	jjr   )r   rJ  r  r  r  Nr  r   r   r   rx   rx   s  s    =ID%r   rx   c                   .    \ rS rSr% SrSr\\S'   S rSr	g)rz   i  r}   r  TXTrK  c                 F    [        UR                  5      U l        SU l        g r  )r   r}   r  )r   	txt_chunks     r   r   ares_query_txt_result.__init__  s    inn-	r   Nr  r   r   r   rz   rz         ID%r   rz   c                   .    \ rS rSr% SrSr\\S'   S rSr	g)r|   i  r  r  rK  c                 \    [         R                  " UR                  5      U l        SU l        g r  )r#   rs   txtr}   r  )r   r  s     r   r   $ares_query_txt_result_chunk.__init__  s    KK(	r   Nr  r   r   r   r|   r|     r  r   r|   c                       \ rS rSrSrS rSrg)r.   i  )rE  r   	addressesc                    [        [        R                  " UR                  5      5      U l        / U l        / U l        SnUR                  U   [        R                  :w  am  U R
                  R                  [        [        R                  " UR                  U   5      5      5        US-  nUR                  U   [        R                  :w  a  Mm  SnUR                  U   [        R                  :w  a  [        R                  " S[        R                  5      n[        R                  [        R                  " UR                  UR                  U   U[        R                  5      :w  aG  U R                  R                  [        [        R                  " U[        R                  5      5      5        US-  nUR                  U   [        R                  :w  a  M  g g )Nr   r   r   )r   r#   rs   r  rE  r   r  rn   r^   rN   h_addr_listr[   r,   r  r  
h_addrtype)r   r3   r   r  s       r   r   ares_host_result.__init__  sG   dkk'..9:	"dii/LL	$++g6G6G6J*K LMFA "dii/ !!!$		1((8T%:%:;CyyD//0B0BGDWDWXYDZ\_aeavavww%%iCAVAV0W&XYFA	 !!!$		1r   )r  r   rE  Nr   r   r   r   r  r   r   r   r   r   r.   r.     s    0Ir   r.   c                       \ rS rSrSrS rSrg)r8   i  )r9   r:   c                     [        [        R                  " U5      5      U l        U[        R                  :w  a%  [        [        R                  " U5      5      U l        g S U l        g r"   )r   r#   rs   r9   r^   r:   )r   r9   r:   s      r   r   ares_nameinfo_result.__init__  s>    dkk$/0	:ATYY:NyW!56TXr   Nr  r   r   r   r8   r8     s    #IYr   r8   c                       \ rS rSrSrS rSrg)ares_addrinfo_node_resulti  )r  r   r  socktypeprotocolr  c                 B   UR                   U l        UR                  U l        UR                  U l        UR                  U l        UR                  nUR                  UR                  :X  d   e[        R                  " S[        R                  5      nUR                  [        R                   :X  a  [        R                   U l        [        R$                  " SU5      n[        R&                  [        R(                  " UR*                  [        R,                  " UR.                  5      U[        R                  5      :w  aK  [        R0                  " U[        R                  5      [        R2                  " UR4                  5      4U l        g g UR                  [        R8                  :X  a  [        R8                  U l        [        R$                  " SU5      n[        R&                  [        R(                  " UR:                  [        R,                  " UR<                  5      U[        R                  5      :w  aa  [        R0                  " U[        R                  5      [        R2                  " UR>                  5      UR@                  URB                  4U l        g g [E        S5      e)Nr   rs  ru  zinvalid sockaddr family)#ai_ttlr  rQ  r   rS  r  rT  r  ai_addr	sa_familyrR  r#   r[   r,   r  rq   r  r  r&  r^   r  rw  r  rv  rs   ntohsry  r  r  r{  rz  r|  r~  r  r~   )r   	ares_noder  r	  r
  s        r   r   "ares_addrinfo_node_result.__init__  s   ##''
!--!--  ~~!4!4444XXi!6!67>>V^^+ ..DK		/6AyyD//dnnQZZ>XZ\^b^s^stt![[T-B-BCV\\RSR\R\E]^	 u ^^v. //DK		0$7AyyD//t~~akk?Z\^`d`u`uvv![[T-B-BCV\\RSR]R]E^`a`o`oqr  rA  rA  B	 w 677r   )r  r  r   r  r  r  Nr  r   r   r   r  r    s    JI8r   r  c                       \ rS rSrSrS rSrg)ares_addrinfo_cname_resulti  )r  aliasrE  c                     UR                   U l         [        [        R                  " UR                  5      5      U l        [        [        R                  " UR
                  5      5      U l        g r"   )r  r   r#   rs   r  rE  )r   
ares_cnames     r   r   #ares_addrinfo_cname_result.__init__  sA    >>t{{:+;+;<=
dkk*//:;	r   )r  rE  r  Nr  r   r   r   r  r    s    (I<r   r  c                       \ rS rSrSrS rSrg)rV   i  )cnamesnodesc                    / U l         / U l        UR                   nU[        R                  :w  aF  U R                   R	                  [        U5      5        UR                  nU[        R                  :w  a  MF  UR                  nU[        R                  :w  aF  U R                  R	                  [        U5      5        UR                  nU[        R                  :w  a  MF  [        R                  " U5        g r"   )r  r  r#   r^   rN   r  re   r  ai_nextr,   ares_freeaddrinfo)r   ares_addrinfo	cname_ptrnode_ptrs       r   r   ares_addrinfo_result.__init__  s    
!((	499$KK9)DE!I 499$ !&&$))#JJ7AB''H $))# 	}-r   Nr  r   r   r   rV   rV     s    #I.r   rV   r   c                  >    [        [        R                  " 5       5      $ )zw
Check if c-ares was compiled with thread safety support.

:return: True if thread-safe, False otherwise.
:rtype: bool
)r  r,   r   r   r   r   r   r     s     &&())r   )1ARES_FLAG_USEVCARES_FLAG_PRIMARYARES_FLAG_IGNTCARES_FLAG_NORECURSE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_RULESr+  QUERY_TYPE_AQUERY_TYPE_AAAAQUERY_TYPE_ANYQUERY_TYPE_CAAQUERY_TYPE_CNAMEQUERY_TYPE_MXQUERY_TYPE_NAPTRQUERY_TYPE_NSQUERY_TYPE_PTRQUERY_TYPE_SOAQUERY_TYPE_SRVQUERY_TYPE_TXTQUERY_CLASS_INQUERY_CLASS_CHAOSQUERY_CLASS_HSQUERY_CLASS_NONEQUERY_CLASS_ANYARES_VERSIONr   r   r   r   r
   )_caresr   r#   r   r,   _cffi_backendr-   ares_library_initARES_LIB_INIT_ALLr    r   utilsr   r   r	   _versionr
   r2  rq   r   collections.abcr   r   typingr   r   r   r   r   queuer   tuplerO  r   r  r  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r+  r>   r@  r?   rA  r=   rB  r@   rC  rA   rD  rB   rE  rC   rF  rD   rG  rE   rH  rF   rI  rG   rJ  rH   rK  rg  rL  r  rM  r  rN  r  rO  r  rP  rs   ares_versionr^   rQ  r\   	Exceptionr   r    r  
def_externr*   r6   r;   rT   rX   rI   r   r   r   r  r`   rb   rd   rg   rj   rl   ro   rt   rv   rx   rz   r|   r.   r8   r  r  rV   r  r   __all__r   r   r   <module>ra     s:   , , ..t/E/EFF$,
4
55  5 5 !    . > > CHoCc3 &&** &&.. ,, ,, .. 22 $$22  $$.. (( .. ""    00 ,, 22 #@@ #'#H#H   && xx++<< 		<< 		 LL ;; **T%6%6tyy%ABC 		 	 ,. Di( - 1 1 & &  & &  & &< & & \~,! ,!` ,- ~3 ~3BG G$* $$Z $Z j : j : J J 	Z 	J * z (Y: Y8
 88< <.: ."*4 *=r   