[PATCH 1/2] dnsapi: migrating to res_nquery (split resend)

Donat Enikeev donat at enikeev.net
Mon Jan 11 13:07:40 CST 2016


Splitting the patch per Hans Leidekker feedback

Signed-off-by: Donat Enikeev <donat at enikeev.net>
---
 dlls/dnsapi/query.c | 65 ++++++++++++++++++++++++++++++++++-------------------
 1 file changed, 42 insertions(+), 23 deletions(-)

diff --git a/dlls/dnsapi/query.c b/dlls/dnsapi/query.c
index a66db37..5a41d93 100644
--- a/dlls/dnsapi/query.c
+++ b/dlls/dnsapi/query.c
@@ -46,6 +46,10 @@
 #include "winnls.h"
 #include "windns.h"
 #include "nb30.h"
+#define USE_WS_PREFIX
+#include "inaddr.h"
+#include "in6addr.h"
+#include "ws2tcpip.h"
 
 #include "dnsapi.h"
 
@@ -53,12 +57,16 @@ WINE_DEFAULT_DEBUG_CHANNEL(dnsapi);
 
 #ifdef HAVE_RESOLV
 
-/* call res_init() just once because of a bug in Mac OS X 10.4 */
-/* call once per thread on systems that have per-thread _res */
-static void initialise_resolver( void )
+static res_state initialise_resolver( void )
 {
-    if ((_res.options & RES_INIT) == 0)
-        res_init();
+    res_state dns_res_state = NULL;
+
+    if ( !(dns_res_state = heap_alloc_zero(sizeof(struct __res_state))) )
+        return NULL;
+
+    res_ninit(dns_res_state);
+
+    return dns_res_state;
 }
 
 static const char *dns_section_to_str( ns_sect section )
@@ -543,7 +551,7 @@ exit:
 
 /* res_init() must have been called before calling these three functions.
  */
-static DNS_STATUS dns_set_serverlist( const IP4_ARRAY *addrs )
+static DNS_STATUS dns_set_serverlist( res_state dns_res_state, const IP4_ARRAY *addrs )
 {
     int i;
 
@@ -551,38 +559,39 @@ static DNS_STATUS dns_set_serverlist( const IP4_ARRAY *addrs )
     {
         WARN( "too many servers: %d only using the first: %d\n",
               addrs->AddrCount, MAXNS );
-        _res.nscount = MAXNS;
+        dns_res_state->nscount = MAXNS;
     }
-    else _res.nscount = addrs->AddrCount;
+    else
+        dns_res_state->nscount = addrs->AddrCount;
 
-    for (i = 0; i < _res.nscount; i++)
-        _res.nsaddr_list[i].sin_addr.s_addr = addrs->AddrArray[i];
+    for (i = 0; i < dns_res_state->nscount; i++)
+        dns_res_state->nsaddr_list[i].sin_addr.s_addr = addrs->AddrArray[i];
 
     return ERROR_SUCCESS;
 }
 
-static DNS_STATUS dns_get_serverlist( PIP4_ARRAY addrs, PDWORD len )
+static DNS_STATUS dns_get_serverlist( res_state dns_res_state, PIP4_ARRAY addrs, PDWORD len )
 {
     unsigned int size;
     int i;
 
-    size = FIELD_OFFSET(IP4_ARRAY, AddrArray[_res.nscount]);
+    size = FIELD_OFFSET(IP4_ARRAY, AddrArray[dns_res_state->nscount]);
     if (!addrs || *len < size)
     {
         *len = size;
         return ERROR_INSUFFICIENT_BUFFER;
     }
 
-    addrs->AddrCount = _res.nscount;
+    addrs->AddrCount = dns_res_state->nscount;
 
-    for (i = 0; i < _res.nscount; i++)
-        addrs->AddrArray[i] = _res.nsaddr_list[i].sin_addr.s_addr;
+    for (i = 0; i < dns_res_state->nscount; i++)
+        addrs->AddrArray[i] = dns_res_state->nsaddr_list[i].sin_addr.s_addr;
 
     return ERROR_SUCCESS;
 }
 
 #define DNS_MAX_PACKET_SIZE 4096
-static DNS_STATUS dns_do_query( PCSTR name, WORD type, DWORD options, PDNS_RECORDA *result )
+static DNS_STATUS dns_do_query( res_state dns_res_state, PCSTR name, WORD type, DWORD options, PDNS_RECORDA *result )
 {
     DNS_STATUS ret = DNS_ERROR_RCODE_NOT_IMPLEMENTED;
 
@@ -597,7 +606,9 @@ static DNS_STATUS dns_do_query( PCSTR name, WORD type, DWORD options, PDNS_RECOR
 
     DNS_RRSET_INIT( rrset );
 
-    len = res_query( name, ns_c_in, type, answer, sizeof(answer) );
+    TRACE("Perfoming res_nquery(%p, %s, %u, %u, %p)\n",dns_res_state, name, type, options, result);
+
+    len = res_nquery( dns_res_state, name, ns_c_in, type, answer, sizeof(answer) );
     if (len < 0)
     {
         ret = dns_map_h_errno( h_errno );
@@ -652,6 +663,8 @@ static const char *debugstr_query_request(const DNS_QUERY_REQUEST *req)
             req->InterfaceIndex, req->pQueryCompletionCallback, req->pQueryContext);
 }
 
+
+
 /******************************************************************************
  * DnsQueryEx           [DNSAPI.@]
  *
@@ -706,6 +719,7 @@ DNS_STATUS WINAPI DnsQuery_UTF8( PCSTR name, WORD type, DWORD options, PVOID ser
 {
     DNS_STATUS ret = DNS_ERROR_RCODE_NOT_IMPLEMENTED;
 #ifdef HAVE_RESOLV
+    res_state dns_res_state;
 
     TRACE( "(%s,%s,0x%08x,%p,%p,%p)\n", debugstr_a(name), dns_type_to_str( type ),
            options, servers, result, reserved );
@@ -713,13 +727,15 @@ DNS_STATUS WINAPI DnsQuery_UTF8( PCSTR name, WORD type, DWORD options, PVOID ser
     if (!name || !result)
         return ERROR_INVALID_PARAMETER;
 
-    initialise_resolver();
-    _res.options |= dns_map_options( options );
+    dns_res_state = initialise_resolver();
+    if ( !dns_res_state ) return ERROR_NOT_ENOUGH_MEMORY;
 
-    if (servers && (ret = dns_set_serverlist( servers )))
+    dns_res_state->options |= dns_map_options( options );
+
+    if (servers && (ret = dns_set_serverlist( dns_res_state, servers )))
         return ret;
 
-    ret = dns_do_query( name, type, options, result );
+    ret = dns_do_query( dns_res_state, name, type, options, result );
 
     if (ret == DNS_ERROR_RCODE_NAME_ERROR && type == DNS_TYPE_A &&
         !(options & DNS_QUERY_NO_NETBT))
@@ -728,6 +744,8 @@ DNS_STATUS WINAPI DnsQuery_UTF8( PCSTR name, WORD type, DWORD options, PVOID ser
         ret = dns_do_query_netbios( name, result );
     }
 
+    heap_free(dns_res_state);
+
 #endif
     return ret;
 }
@@ -824,8 +842,9 @@ DNS_STATUS WINAPI DnsQueryConfig( DNS_CONFIG_TYPE config, DWORD flag, PCWSTR ada
     case DnsConfigDnsServerList:
     {
 #ifdef HAVE_RESOLV
-        initialise_resolver();
-        ret = dns_get_serverlist( buffer, len );
+        res_state dns_res_state = initialise_resolver();
+        ret = dns_get_serverlist( dns_res_state, buffer, len );
+        heap_free(dns_res_state);
         break;
 #else
         WARN( "compiled without resolver support\n" );
-- 
2.5.0




More information about the wine-patches mailing list