Wine-Devel
Threads by month
- ----- 2026 -----
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- 24 participants
- 84529 discussions
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/dnsapi/Makefile.in | 2 ++
dlls/dnsapi/name.c | 9 +++------
dlls/dnsapi/record.c | 19 +++++++++----------
3 files changed, 14 insertions(+), 16 deletions(-)
diff --git a/dlls/dnsapi/Makefile.in b/dlls/dnsapi/Makefile.in
index a4f80e83fd4..ae00cf73a9f 100644
--- a/dlls/dnsapi/Makefile.in
+++ b/dlls/dnsapi/Makefile.in
@@ -3,6 +3,8 @@ IMPORTLIB = dnsapi
IMPORTS = netapi32
EXTRALIBS = $(RESOLV_LIBS)
+EXTRADLLFLAGS = -mno-cygwin
+
C_SRCS = \
libresolv.c \
main.c \
diff --git a/dlls/dnsapi/name.c b/dlls/dnsapi/name.c
index 4f4ba507cac..a12e58b8684 100644
--- a/dlls/dnsapi/name.c
+++ b/dlls/dnsapi/name.c
@@ -27,7 +27,6 @@
#include "windns.h"
#include "wine/debug.h"
-#include "wine/unicode.h"
#include "dnsapi.h"
WINE_DEFAULT_DEBUG_CHANNEL(dnsapi);
@@ -77,7 +76,7 @@ BOOL WINAPI DnsNameCompare_W( PCWSTR name1, PCWSTR name2 )
while (name1 <= p)
{
- if (toupperW( *name1 ) != toupperW( *name2 ))
+ if (towupper( *name1 ) != towupper( *name2 ))
return FALSE;
name1++;
@@ -141,9 +140,7 @@ DNS_STATUS WINAPI DnsValidateName_W( PCWSTR name, DNS_NAME_FORMAT format )
{
PCWSTR p;
unsigned int i, j, state = 0;
- static const WCHAR invalid[] = {
- '{','|','}','~','[','\\',']','^','\'',':',';','<','=','>',
- '?','@','!','\"','#','$','%','^','`','(',')','+','/',',',0 };
+ static const WCHAR invalid[] = L"{|}~[\\]^':;<=>?@!\"#$%&`()+/,";
TRACE( "(%s, %d)\n", debugstr_w(name), format );
@@ -162,7 +159,7 @@ DNS_STATUS WINAPI DnsValidateName_W( PCWSTR name, DNS_NAME_FORMAT format )
if (j > 62) state |= HAS_LONG_LABEL;
- if (strchrW( invalid, *p )) state |= HAS_INVALID;
+ if (wcschr( invalid, *p )) state |= HAS_INVALID;
else if ((unsigned)*p > 127) state |= HAS_EXTENDED;
else if (*p == ' ') state |= HAS_SPACE;
else if (*p == '_') state |= HAS_UNDERSCORE;
diff --git a/dlls/dnsapi/record.c b/dlls/dnsapi/record.c
index 4697438df57..5a75503d892 100644
--- a/dlls/dnsapi/record.c
+++ b/dlls/dnsapi/record.c
@@ -25,7 +25,6 @@
#include "windns.h"
#include "wine/debug.h"
-#include "wine/unicode.h"
#include "dnsapi.h"
WINE_DEFAULT_DEBUG_CHANNEL(dnsapi);
@@ -450,8 +449,8 @@ PDNS_RECORD WINAPI DnsRecordCopyEx( PDNS_RECORD src, DNS_CHARSET in, DNS_CHARSET
dst->wDataLength = sizeof(dst->Data.MINFO);
if (out == DnsCharSetUnicode) dst->wDataLength +=
- (strlenW( dst->Data.MINFO.pNameMailbox ) + 1) * sizeof(WCHAR) +
- (strlenW( dst->Data.MINFO.pNameErrorsMailbox ) + 1) * sizeof(WCHAR);
+ (wcslen( dst->Data.MINFO.pNameMailbox ) + 1) * sizeof(WCHAR) +
+ (wcslen( dst->Data.MINFO.pNameErrorsMailbox ) + 1) * sizeof(WCHAR);
break;
}
case DNS_TYPE_AFSDB:
@@ -463,7 +462,7 @@ PDNS_RECORD WINAPI DnsRecordCopyEx( PDNS_RECORD src, DNS_CHARSET in, DNS_CHARSET
dst->wDataLength = sizeof(dst->Data.MX);
if (out == DnsCharSetUnicode) dst->wDataLength +=
- (strlenW( dst->Data.MX.pNameExchange ) + 1) * sizeof(WCHAR);
+ (wcslen( dst->Data.MX.pNameExchange ) + 1) * sizeof(WCHAR);
break;
}
case DNS_TYPE_NXT:
@@ -473,7 +472,7 @@ PDNS_RECORD WINAPI DnsRecordCopyEx( PDNS_RECORD src, DNS_CHARSET in, DNS_CHARSET
dst->wDataLength = sizeof(dst->Data.NXT);
if (out == DnsCharSetUnicode) dst->wDataLength +=
- (strlenW( dst->Data.NXT.pNameNext ) + 1) * sizeof(WCHAR);
+ (wcslen( dst->Data.NXT.pNameNext ) + 1) * sizeof(WCHAR);
break;
}
case DNS_TYPE_CNAME:
@@ -490,7 +489,7 @@ PDNS_RECORD WINAPI DnsRecordCopyEx( PDNS_RECORD src, DNS_CHARSET in, DNS_CHARSET
dst->wDataLength = sizeof(dst->Data.PTR);
if (out == DnsCharSetUnicode) dst->wDataLength +=
- (strlenW( dst->Data.PTR.pNameHost ) + 1) * sizeof(WCHAR);
+ (wcslen( dst->Data.PTR.pNameHost ) + 1) * sizeof(WCHAR);
break;
}
case DNS_TYPE_SIG:
@@ -500,7 +499,7 @@ PDNS_RECORD WINAPI DnsRecordCopyEx( PDNS_RECORD src, DNS_CHARSET in, DNS_CHARSET
dst->wDataLength = sizeof(dst->Data.SIG);
if (out == DnsCharSetUnicode) dst->wDataLength +=
- (strlenW( dst->Data.SIG.pNameSigner ) + 1) * sizeof(WCHAR);
+ (wcslen( dst->Data.SIG.pNameSigner ) + 1) * sizeof(WCHAR);
break;
}
case DNS_TYPE_SOA:
@@ -517,8 +516,8 @@ PDNS_RECORD WINAPI DnsRecordCopyEx( PDNS_RECORD src, DNS_CHARSET in, DNS_CHARSET
dst->wDataLength = sizeof(dst->Data.SOA);
if (out == DnsCharSetUnicode) dst->wDataLength +=
- (strlenW( dst->Data.SOA.pNamePrimaryServer ) + 1) * sizeof(WCHAR) +
- (strlenW( dst->Data.SOA.pNameAdministrator ) + 1) * sizeof(WCHAR);
+ (wcslen( dst->Data.SOA.pNamePrimaryServer ) + 1) * sizeof(WCHAR) +
+ (wcslen( dst->Data.SOA.pNameAdministrator ) + 1) * sizeof(WCHAR);
break;
}
case DNS_TYPE_SRV:
@@ -528,7 +527,7 @@ PDNS_RECORD WINAPI DnsRecordCopyEx( PDNS_RECORD src, DNS_CHARSET in, DNS_CHARSET
dst->wDataLength = sizeof(dst->Data.SRV);
if (out == DnsCharSetUnicode) dst->wDataLength +=
- (strlenW( dst->Data.SRV.pNameTarget ) + 1) * sizeof(WCHAR);
+ (wcslen( dst->Data.SRV.pNameTarget ) + 1) * sizeof(WCHAR);
break;
}
default:
--
2.30.2
1
0
March 30, 2021
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/dnsapi/Makefile.in | 1 +
dlls/dnsapi/dnsapi.h | 19 +-
dlls/dnsapi/libresolv.c | 742 ++++++++++++++++++++++++++++++++++++++++
dlls/dnsapi/main.c | 20 ++
dlls/dnsapi/name.c | 23 +-
dlls/dnsapi/query.c | 582 +------------------------------
dlls/dnsapi/record.c | 66 +---
7 files changed, 809 insertions(+), 644 deletions(-)
create mode 100644 dlls/dnsapi/libresolv.c
diff --git a/dlls/dnsapi/Makefile.in b/dlls/dnsapi/Makefile.in
index d1f66723fc6..a4f80e83fd4 100644
--- a/dlls/dnsapi/Makefile.in
+++ b/dlls/dnsapi/Makefile.in
@@ -4,6 +4,7 @@ IMPORTS = netapi32
EXTRALIBS = $(RESOLV_LIBS)
C_SRCS = \
+ libresolv.c \
main.c \
name.c \
query.c \
diff --git a/dlls/dnsapi/dnsapi.h b/dlls/dnsapi/dnsapi.h
index d0a31ea0981..bcd6a6d5bc3 100644
--- a/dlls/dnsapi/dnsapi.h
+++ b/dlls/dnsapi/dnsapi.h
@@ -18,10 +18,6 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#ifndef __WINE_CONFIG_H
-# error You must include config.h to use this header
-#endif
-
#include "wine/heap.h"
static inline char *strdup_a( const char *src )
@@ -123,4 +119,17 @@ static inline char *strdup_ua( const char *src )
return dst;
}
-const char *type_to_str( unsigned short ) DECLSPEC_HIDDEN;
+extern const char *type_to_str( unsigned short ) DECLSPEC_HIDDEN;
+
+extern DNS_STATUS CDECL resolv_get_serverlist( IP4_ARRAY *, DWORD * ) DECLSPEC_HIDDEN;
+extern DNS_STATUS CDECL resolv_query( const char *, WORD, DWORD, DNS_RECORDA ** ) DECLSPEC_HIDDEN;
+extern DNS_STATUS CDECL resolv_set_serverlist( const IP4_ARRAY * ) DECLSPEC_HIDDEN;
+
+struct resolv_funcs
+{
+ DNS_STATUS (CDECL *get_serverlist)( IP4_ARRAY *addrs, DWORD *len );
+ DNS_STATUS (CDECL *query)( const char *name, WORD type, DWORD options, DNS_RECORDA **result );
+ DNS_STATUS (CDECL *set_serverlist)( const IP4_ARRAY *addrs );
+};
+
+extern const struct resolv_funcs *resolv_funcs;
diff --git a/dlls/dnsapi/libresolv.c b/dlls/dnsapi/libresolv.c
new file mode 100644
index 00000000000..ac52147af01
--- /dev/null
+++ b/dlls/dnsapi/libresolv.c
@@ -0,0 +1,742 @@
+/*
+ * Unix interface for libresolv
+ *
+ * Copyright 2021 Hans Leidekker for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#if 0
+#pragma makedep unix
+#endif
+
+#include "config.h"
+
+#ifdef HAVE_RESOLV
+#include <stdarg.h>
+#include <string.h>
+#include <stdio.h>
+#include <sys/types.h>
+
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#endif
+#ifdef HAVE_RESOLV_H
+# include <resolv.h>
+#endif
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
+#include "windef.h"
+#include "winternl.h"
+#include "winbase.h"
+#include "winnls.h"
+#include "windns.h"
+
+#include "wine/debug.h"
+#include "wine/heap.h"
+#include "dnsapi.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(dnsapi);
+
+static const char *debugstr_type( unsigned short type )
+{
+ const char *str;
+
+ switch (type)
+ {
+#define X(x) case (x): str = #x; break;
+ X(DNS_TYPE_ZERO)
+ X(DNS_TYPE_A)
+ X(DNS_TYPE_NS)
+ X(DNS_TYPE_MD)
+ X(DNS_TYPE_MF)
+ X(DNS_TYPE_CNAME)
+ X(DNS_TYPE_SOA)
+ X(DNS_TYPE_MB)
+ X(DNS_TYPE_MG)
+ X(DNS_TYPE_MR)
+ X(DNS_TYPE_NULL)
+ X(DNS_TYPE_WKS)
+ X(DNS_TYPE_PTR)
+ X(DNS_TYPE_HINFO)
+ X(DNS_TYPE_MINFO)
+ X(DNS_TYPE_MX)
+ X(DNS_TYPE_TEXT)
+ X(DNS_TYPE_RP)
+ X(DNS_TYPE_AFSDB)
+ X(DNS_TYPE_X25)
+ X(DNS_TYPE_ISDN)
+ X(DNS_TYPE_RT)
+ X(DNS_TYPE_NSAP)
+ X(DNS_TYPE_NSAPPTR)
+ X(DNS_TYPE_SIG)
+ X(DNS_TYPE_KEY)
+ X(DNS_TYPE_PX)
+ X(DNS_TYPE_GPOS)
+ X(DNS_TYPE_AAAA)
+ X(DNS_TYPE_LOC)
+ X(DNS_TYPE_NXT)
+ X(DNS_TYPE_EID)
+ X(DNS_TYPE_NIMLOC)
+ X(DNS_TYPE_SRV)
+ X(DNS_TYPE_ATMA)
+ X(DNS_TYPE_NAPTR)
+ X(DNS_TYPE_KX)
+ X(DNS_TYPE_CERT)
+ X(DNS_TYPE_A6)
+ X(DNS_TYPE_DNAME)
+ X(DNS_TYPE_SINK)
+ X(DNS_TYPE_OPT)
+ X(DNS_TYPE_UINFO)
+ X(DNS_TYPE_UID)
+ X(DNS_TYPE_GID)
+ X(DNS_TYPE_UNSPEC)
+ X(DNS_TYPE_ADDRS)
+ X(DNS_TYPE_TKEY)
+ X(DNS_TYPE_TSIG)
+ X(DNS_TYPE_IXFR)
+ X(DNS_TYPE_AXFR)
+ X(DNS_TYPE_MAILB)
+ X(DNS_TYPE_MAILA)
+ X(DNS_TYPE_ANY)
+ X(DNS_TYPE_WINS)
+ X(DNS_TYPE_WINSR)
+#undef X
+ default:
+ return wine_dbg_sprintf( "0x%04x", type );
+ }
+
+ return wine_dbg_sprintf( "%s", str );
+}
+
+static const char *debugstr_section( ns_sect section )
+{
+ switch (section)
+ {
+ case ns_s_qd: return "Question";
+ case ns_s_an: return "Answer";
+ case ns_s_ns: return "Authority";
+ case ns_s_ar: return "Additional";
+ default:
+ return wine_dbg_sprintf( "0x%02x", section );
+ }
+}
+
+/* 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 init_resolver( void )
+{
+ if (!(_res.options & RES_INIT)) res_init();
+}
+
+static unsigned long map_options( DWORD options )
+{
+ unsigned long ret = 0;
+
+ if (options == DNS_QUERY_STANDARD)
+ return RES_DEFAULT;
+
+ if (options & DNS_QUERY_ACCEPT_TRUNCATED_RESPONSE)
+ ret |= RES_IGNTC;
+ if (options & DNS_QUERY_USE_TCP_ONLY)
+ ret |= RES_USEVC;
+ if (options & DNS_QUERY_NO_RECURSION)
+ ret &= ~RES_RECURSE;
+ if (options & DNS_QUERY_NO_LOCAL_NAME)
+ ret &= ~RES_DNSRCH;
+ if (options & DNS_QUERY_NO_HOSTS_FILE)
+ ret |= RES_NOALIASES;
+ if (options & DNS_QUERY_TREAT_AS_FQDN)
+ ret &= ~RES_DEFNAMES;
+
+ if (options & DNS_QUERY_DONT_RESET_TTL_VALUES)
+ FIXME( "option DNS_QUERY_DONT_RESET_TTL_VALUES not implemented\n" );
+ if (options & DNS_QUERY_RESERVED)
+ FIXME( "option DNS_QUERY_RESERVED not implemented\n" );
+ if (options & DNS_QUERY_WIRE_ONLY)
+ FIXME( "option DNS_QUERY_WIRE_ONLY not implemented\n" );
+ if (options & DNS_QUERY_NO_WIRE_QUERY)
+ FIXME( "option DNS_QUERY_NO_WIRE_QUERY not implemented\n" );
+ if (options & DNS_QUERY_BYPASS_CACHE)
+ FIXME( "option DNS_QUERY_BYPASS_CACHE not implemented\n" );
+ if (options & DNS_QUERY_RETURN_MESSAGE)
+ FIXME( "option DNS_QUERY_RETURN_MESSAGE not implemented\n" );
+
+ if (options & DNS_QUERY_NO_NETBT)
+ TRACE( "netbios query disabled\n" );
+
+ return ret;
+}
+
+static DNS_STATUS map_error( int error )
+{
+ switch (error)
+ {
+ case ns_r_noerror: return ERROR_SUCCESS;
+ case ns_r_formerr: return DNS_ERROR_RCODE_FORMAT_ERROR;
+ case ns_r_servfail: return DNS_ERROR_RCODE_SERVER_FAILURE;
+ case ns_r_nxdomain: return DNS_ERROR_RCODE_NAME_ERROR;
+ case ns_r_notimpl: return DNS_ERROR_RCODE_NOT_IMPLEMENTED;
+ case ns_r_refused: return DNS_ERROR_RCODE_REFUSED;
+ case ns_r_yxdomain: return DNS_ERROR_RCODE_YXDOMAIN;
+ case ns_r_yxrrset: return DNS_ERROR_RCODE_YXRRSET;
+ case ns_r_nxrrset: return DNS_ERROR_RCODE_NXRRSET;
+ case ns_r_notauth: return DNS_ERROR_RCODE_NOTAUTH;
+ case ns_r_notzone: return DNS_ERROR_RCODE_NOTZONE;
+ default:
+ FIXME( "unmapped error code: %d\n", error );
+ return DNS_ERROR_RCODE_NOT_IMPLEMENTED;
+ }
+}
+
+static DNS_STATUS map_h_errno( int error )
+{
+ switch (error)
+ {
+ case NO_DATA:
+ case HOST_NOT_FOUND: return DNS_ERROR_RCODE_NAME_ERROR;
+ case TRY_AGAIN: return DNS_ERROR_RCODE_SERVER_FAILURE;
+ case NO_RECOVERY: return DNS_ERROR_RCODE_REFUSED;
+#ifdef NETDB_INTERNAL
+ case NETDB_INTERNAL: return DNS_ERROR_RCODE;
+#endif
+ default:
+ FIXME( "unmapped error code: %d\n", error );
+ return DNS_ERROR_RCODE_NOT_IMPLEMENTED;
+ }
+}
+
+DNS_STATUS CDECL resolv_get_serverlist( IP4_ARRAY *addrs, DWORD *len )
+{
+ unsigned int size;
+ int i;
+
+ init_resolver();
+
+ size = FIELD_OFFSET(IP4_ARRAY, AddrArray[_res.nscount]);
+ if (!addrs || *len < size)
+ {
+ *len = size;
+ return ERROR_INSUFFICIENT_BUFFER;
+ }
+
+ addrs->AddrCount = _res.nscount;
+
+ for (i = 0; i < _res.nscount; i++)
+ addrs->AddrArray[i] = _res.nsaddr_list[i].sin_addr.s_addr;
+
+ return ERROR_SUCCESS;
+}
+
+DNS_STATUS CDECL resolv_set_serverlist( const IP4_ARRAY *addrs )
+{
+ int i;
+
+ init_resolver();
+
+ if (!addrs || !addrs->AddrCount) return ERROR_SUCCESS;
+ if (addrs->AddrCount > MAXNS)
+ {
+ WARN( "too many servers: %d only using the first: %d\n",
+ addrs->AddrCount, MAXNS );
+ _res.nscount = MAXNS;
+ }
+ else _res.nscount = addrs->AddrCount;
+
+ for (i = 0; i < _res.nscount; i++)
+ _res.nsaddr_list[i].sin_addr.s_addr = addrs->AddrArray[i];
+
+ return ERROR_SUCCESS;
+}
+
+static char *dname_from_msg( ns_msg msg, const unsigned char *pos )
+{
+ char *str, dname[NS_MAXDNAME] = ".";
+
+ /* returns *compressed* length, ignore it */
+ ns_name_uncompress( ns_msg_base(msg), ns_msg_end(msg), pos, dname, sizeof(dname) );
+
+ if ((str = RtlAllocateHeap( GetProcessHeap(), 0, strlen(dname) + 1 ))) strcpy( str, dname );
+ return str;
+}
+
+static char *str_from_rdata( const unsigned char *rdata )
+{
+ char *str;
+ unsigned int len = rdata[0];
+
+ if ((str = RtlAllocateHeap( GetProcessHeap(), 0, len + 1 )))
+ {
+ memcpy( str, ++rdata, len );
+ str[len] = 0;
+ }
+ return str;
+}
+
+static unsigned int get_record_size( const ns_rr *rr )
+{
+ const unsigned char *pos = rr->rdata;
+ unsigned int num = 0, size = sizeof(DNS_RECORDA);
+
+ switch (rr->type)
+ {
+ case ns_t_key:
+ {
+ pos += sizeof(WORD) + sizeof(BYTE) + sizeof(BYTE);
+ size += rr->rdata + rr->rdlength - pos - 1;
+ break;
+ }
+ case ns_t_sig:
+ {
+ pos += sizeof(PCHAR) + sizeof(WORD) + 2 * sizeof(BYTE);
+ pos += 3 * sizeof(DWORD) + 2 * sizeof(WORD);
+ size += rr->rdata + rr->rdlength - pos - 1;
+ break;
+ }
+ case ns_t_hinfo:
+ case ns_t_isdn:
+ case ns_t_txt:
+ case ns_t_x25:
+ {
+ while (pos[0] && pos < rr->rdata + rr->rdlength)
+ {
+ num++;
+ pos += pos[0] + 1;
+ }
+ size += (num - 1) * sizeof(PCHAR);
+ break;
+ }
+ case ns_t_null:
+ case ns_t_opt:
+ {
+ size += rr->rdlength - 1;
+ break;
+ }
+ case ns_t_nxt:
+ case ns_t_wks:
+ case 0xff01: /* WINS */
+ {
+ FIXME( "unhandled type: %s\n", debugstr_type( rr->type ) );
+ break;
+ }
+ default:
+ break;
+ }
+ return size;
+}
+
+static DNS_STATUS copy_rdata( ns_msg msg, const ns_rr *rr, DNS_RECORDA *r, WORD *dlen )
+{
+ DNS_STATUS ret = ERROR_SUCCESS;
+ const unsigned char *pos = rr->rdata;
+ unsigned int i, size;
+
+ switch (rr->type)
+ {
+ case ns_t_a:
+ {
+ r->Data.A.IpAddress = *(const DWORD *)pos;
+ *dlen = sizeof(DNS_A_DATA);
+ break;
+ }
+ case ns_t_aaaa:
+ {
+ for (i = 0; i < sizeof(IP6_ADDRESS)/sizeof(DWORD); i++)
+ {
+ r->Data.AAAA.Ip6Address.IP6Dword[i] = *(const DWORD *)pos;
+ pos += sizeof(DWORD);
+ }
+
+ *dlen = sizeof(DNS_AAAA_DATA);
+ break;
+ }
+ case ns_t_key:
+ {
+ /* FIXME: byte order? */
+ r->Data.KEY.wFlags = *(const WORD *)pos; pos += sizeof(WORD);
+ r->Data.KEY.chProtocol = *pos++;
+ r->Data.KEY.chAlgorithm = *pos++;
+
+ size = rr->rdata + rr->rdlength - pos;
+
+ for (i = 0; i < size; i++)
+ r->Data.KEY.Key[i] = *pos++;
+
+ *dlen = sizeof(DNS_KEY_DATA) + (size - 1) * sizeof(BYTE);
+ break;
+ }
+ case ns_t_rp:
+ case ns_t_minfo:
+ {
+ r->Data.MINFO.pNameMailbox = dname_from_msg( msg, pos );
+ if (!r->Data.MINFO.pNameMailbox) return ERROR_NOT_ENOUGH_MEMORY;
+
+ if (ns_name_skip( &pos, ns_msg_end( msg ) ) < 0)
+ return DNS_ERROR_BAD_PACKET;
+
+ r->Data.MINFO.pNameErrorsMailbox = dname_from_msg( msg, pos );
+ if (!r->Data.MINFO.pNameErrorsMailbox)
+ {
+ RtlFreeHeap( GetProcessHeap(), 0, r->Data.MINFO.pNameMailbox );
+ return ERROR_NOT_ENOUGH_MEMORY;
+ }
+
+ *dlen = sizeof(DNS_MINFO_DATAA);
+ break;
+ }
+ case ns_t_afsdb:
+ case ns_t_rt:
+ case ns_t_mx:
+ {
+ r->Data.MX.wPreference = ntohs( *(const WORD *)pos );
+ r->Data.MX.pNameExchange = dname_from_msg( msg, pos + sizeof(WORD) );
+ if (!r->Data.MX.pNameExchange) return ERROR_NOT_ENOUGH_MEMORY;
+
+ *dlen = sizeof(DNS_MX_DATAA);
+ break;
+ }
+ case ns_t_null:
+ {
+ r->Data.Null.dwByteCount = rr->rdlength;
+ memcpy( r->Data.Null.Data, rr->rdata, rr->rdlength );
+
+ *dlen = sizeof(DNS_NULL_DATA) + rr->rdlength - 1;
+ break;
+ }
+ case ns_t_opt:
+ {
+ r->Data.OPT.wDataLength = rr->rdlength;
+ r->Data.OPT.wPad = 0;
+ memcpy( r->Data.OPT.Data, rr->rdata, rr->rdlength );
+
+ *dlen = sizeof(DNS_OPT_DATA) + rr->rdlength - 1;
+ break;
+ }
+ case ns_t_cname:
+ case ns_t_ns:
+ case ns_t_mb:
+ case ns_t_md:
+ case ns_t_mf:
+ case ns_t_mg:
+ case ns_t_mr:
+ case ns_t_ptr:
+ {
+ r->Data.PTR.pNameHost = dname_from_msg( msg, pos );
+ if (!r->Data.PTR.pNameHost) return ERROR_NOT_ENOUGH_MEMORY;
+
+ *dlen = sizeof(DNS_PTR_DATAA);
+ break;
+ }
+ case ns_t_sig:
+ {
+ r->Data.SIG.pNameSigner = dname_from_msg( msg, pos );
+ if (!r->Data.SIG.pNameSigner) return ERROR_NOT_ENOUGH_MEMORY;
+
+ if (ns_name_skip( &pos, ns_msg_end( msg ) ) < 0)
+ return DNS_ERROR_BAD_PACKET;
+
+ /* FIXME: byte order? */
+ r->Data.SIG.wTypeCovered = *(const WORD *)pos; pos += sizeof(WORD);
+ r->Data.SIG.chAlgorithm = *pos++;
+ r->Data.SIG.chLabelCount = *pos++;
+ r->Data.SIG.dwOriginalTtl = *(const DWORD *)pos; pos += sizeof(DWORD);
+ r->Data.SIG.dwExpiration = *(const DWORD *)pos; pos += sizeof(DWORD);
+ r->Data.SIG.dwTimeSigned = *(const DWORD *)pos; pos += sizeof(DWORD);
+ r->Data.SIG.wKeyTag = *(const WORD *)pos;
+
+ size = rr->rdata + rr->rdlength - pos;
+
+ for (i = 0; i < size; i++)
+ r->Data.SIG.Signature[i] = *pos++;
+
+ *dlen = sizeof(DNS_SIG_DATAA) + (size - 1) * sizeof(BYTE);
+ break;
+ }
+ case ns_t_soa:
+ {
+ r->Data.SOA.pNamePrimaryServer = dname_from_msg( msg, pos );
+ if (!r->Data.SOA.pNamePrimaryServer) return ERROR_NOT_ENOUGH_MEMORY;
+
+ if (ns_name_skip( &pos, ns_msg_end( msg ) ) < 0)
+ return DNS_ERROR_BAD_PACKET;
+
+ r->Data.SOA.pNameAdministrator = dname_from_msg( msg, pos );
+ if (!r->Data.SOA.pNameAdministrator)
+ {
+ RtlFreeHeap( GetProcessHeap(), 0, r->Data.SOA.pNamePrimaryServer );
+ return ERROR_NOT_ENOUGH_MEMORY;
+ }
+
+ if (ns_name_skip( &pos, ns_msg_end( msg ) ) < 0)
+ return DNS_ERROR_BAD_PACKET;
+
+ r->Data.SOA.dwSerialNo = ntohl( *(const DWORD *)pos ); pos += sizeof(DWORD);
+ r->Data.SOA.dwRefresh = ntohl( *(const DWORD *)pos ); pos += sizeof(DWORD);
+ r->Data.SOA.dwRetry = ntohl( *(const DWORD *)pos ); pos += sizeof(DWORD);
+ r->Data.SOA.dwExpire = ntohl( *(const DWORD *)pos ); pos += sizeof(DWORD);
+ r->Data.SOA.dwDefaultTtl = ntohl( *(const DWORD *)pos ); pos += sizeof(DWORD);
+
+ *dlen = sizeof(DNS_SOA_DATAA);
+ break;
+ }
+ case ns_t_srv:
+ {
+ r->Data.SRV.wPriority = ntohs( *(const WORD *)pos ); pos += sizeof(WORD);
+ r->Data.SRV.wWeight = ntohs( *(const WORD *)pos ); pos += sizeof(WORD);
+ r->Data.SRV.wPort = ntohs( *(const WORD *)pos ); pos += sizeof(WORD);
+
+ r->Data.SRV.pNameTarget = dname_from_msg( msg, pos );
+ if (!r->Data.SRV.pNameTarget) return ERROR_NOT_ENOUGH_MEMORY;
+
+ *dlen = sizeof(DNS_SRV_DATAA);
+ break;
+ }
+ case ns_t_hinfo:
+ case ns_t_isdn:
+ case ns_t_x25:
+ case ns_t_txt:
+ {
+ i = 0;
+ while (pos[0] && pos < rr->rdata + rr->rdlength)
+ {
+ r->Data.TXT.pStringArray[i] = str_from_rdata( pos );
+ if (!r->Data.TXT.pStringArray[i])
+ {
+ while (i > 0) RtlFreeHeap( GetProcessHeap(), 0, r->Data.TXT.pStringArray[--i] );
+ return ERROR_NOT_ENOUGH_MEMORY;
+ }
+ i++;
+ pos += pos[0] + 1;
+ }
+ r->Data.TXT.dwStringCount = i;
+ *dlen = sizeof(DNS_TXT_DATAA) + (i - 1) * sizeof(PCHAR);
+ break;
+ }
+ case ns_t_atma:
+ case ns_t_loc:
+ case ns_t_nxt:
+ case ns_t_tsig:
+ case ns_t_wks:
+ case 0x00f9: /* TKEY */
+ case 0xff01: /* WINS */
+ case 0xff02: /* WINSR */
+ default:
+ FIXME( "unhandled type: %s\n", debugstr_type( rr->type ) );
+ return DNS_ERROR_RCODE_NOT_IMPLEMENTED;
+ }
+
+ return ret;
+}
+
+static inline char *heap_strdup( const char *src )
+{
+ char *dst;
+ if (!src) return NULL;
+ if ((dst = RtlAllocateHeap( GetProcessHeap(), 0, (strlen( src ) + 1) * sizeof(char) ))) strcpy( dst, src );
+ return dst;
+}
+
+static DNS_STATUS copy_record( ns_msg msg, ns_sect section, unsigned short num, DNS_RECORDA **recp )
+{
+ DNS_STATUS ret;
+ DNS_RECORDA *record;
+ WORD dlen;
+ ns_rr rr;
+
+ if (ns_parserr( &msg, section, num, &rr ) < 0)
+ return DNS_ERROR_BAD_PACKET;
+
+ if (!(record = RtlAllocateHeap( GetProcessHeap(), HEAP_ZERO_MEMORY, get_record_size( &rr ) )))
+ return ERROR_NOT_ENOUGH_MEMORY;
+
+ if (!(record->pName = heap_strdup( rr.name )))
+ {
+ RtlFreeHeap( GetProcessHeap(), 0, record );
+ return ERROR_NOT_ENOUGH_MEMORY;
+ }
+
+ record->wType = rr.type;
+ record->Flags.S.Section = section;
+ record->Flags.S.CharSet = DnsCharSetUtf8;
+ record->dwTtl = rr.ttl;
+
+ if ((ret = copy_rdata( msg, &rr, record, &dlen )))
+ {
+ RtlFreeHeap( GetProcessHeap(), 0, record->pName );
+ RtlFreeHeap( GetProcessHeap(), 0, record );
+ return ret;
+ }
+ record->wDataLength = dlen;
+ *recp = record;
+
+ TRACE( "found %s record in %s section\n", debugstr_type( rr.type ), debugstr_section( section ) );
+ return ERROR_SUCCESS;
+}
+
+static void free_record_list( DNS_RECORD *list )
+{
+ DNS_RECORD *r, *next;
+ unsigned int i;
+
+ for (r = list; (list = r); r = next)
+ {
+ RtlFreeHeap( GetProcessHeap(), 0, r->pName );
+
+ switch (r->wType)
+ {
+ case DNS_TYPE_HINFO:
+ case DNS_TYPE_ISDN:
+ case DNS_TYPE_TEXT:
+ case DNS_TYPE_X25:
+ {
+ for (i = 0; i < r->Data.TXT.dwStringCount; i++)
+ RtlFreeHeap( GetProcessHeap(), 0, r->Data.TXT.pStringArray[i] );
+ break;
+ }
+ case DNS_TYPE_MINFO:
+ case DNS_TYPE_RP:
+ {
+ RtlFreeHeap( GetProcessHeap(), 0, r->Data.MINFO.pNameMailbox );
+ RtlFreeHeap( GetProcessHeap(), 0, r->Data.MINFO.pNameErrorsMailbox );
+ break;
+ }
+ case DNS_TYPE_AFSDB:
+ case DNS_TYPE_RT:
+ case DNS_TYPE_MX:
+ {
+ RtlFreeHeap( GetProcessHeap(), 0, r->Data.MX.pNameExchange );
+ break;
+ }
+ case DNS_TYPE_NXT:
+ {
+ RtlFreeHeap( GetProcessHeap(), 0, r->Data.NXT.pNameNext );
+ break;
+ }
+ case DNS_TYPE_CNAME:
+ case DNS_TYPE_MB:
+ case DNS_TYPE_MD:
+ case DNS_TYPE_MF:
+ case DNS_TYPE_MG:
+ case DNS_TYPE_MR:
+ case DNS_TYPE_NS:
+ case DNS_TYPE_PTR:
+ {
+ RtlFreeHeap( GetProcessHeap(), 0, r->Data.PTR.pNameHost );
+ break;
+ }
+ case DNS_TYPE_SIG:
+ {
+ RtlFreeHeap( GetProcessHeap(), 0, r->Data.SIG.pNameSigner );
+ break;
+ }
+ case DNS_TYPE_SOA:
+ {
+ RtlFreeHeap( GetProcessHeap(), 0, r->Data.SOA.pNamePrimaryServer );
+ RtlFreeHeap( GetProcessHeap(), 0, r->Data.SOA.pNameAdministrator );
+ break;
+ }
+ case DNS_TYPE_SRV:
+ {
+ RtlFreeHeap( GetProcessHeap(), 0, r->Data.SRV.pNameTarget );
+ break;
+ }
+ default: break;
+ }
+
+ next = r->pNext;
+ RtlFreeHeap( GetProcessHeap(), 0, r );
+ }
+}
+
+#define DNS_MAX_PACKET_SIZE 4096
+DNS_STATUS CDECL resolv_query( const char *name, WORD type, DWORD options, DNS_RECORDA **result )
+{
+ DNS_STATUS ret = DNS_ERROR_RCODE_NOT_IMPLEMENTED;
+ unsigned int i, num;
+ unsigned char answer[DNS_MAX_PACKET_SIZE];
+ ns_sect sections[] = { ns_s_an, ns_s_ar };
+ ns_msg msg;
+ DNS_RECORDA *record = NULL;
+ DNS_RRSET rrset;
+ int len;
+
+ DNS_RRSET_INIT( rrset );
+
+ init_resolver();
+ _res.options |= map_options( options );
+
+ if ((len = res_query( name, ns_c_in, type, answer, sizeof(answer) )) < 0)
+ {
+ ret = map_h_errno( h_errno );
+ goto exit;
+ }
+
+ if (ns_initparse( answer, len, &msg ) < 0)
+ {
+ ret = DNS_ERROR_BAD_PACKET;
+ goto exit;
+ }
+
+#define RCODE_MASK 0x0f
+ if ((msg._flags & RCODE_MASK) != ns_r_noerror)
+ {
+ ret = map_error( msg._flags & RCODE_MASK );
+ goto exit;
+ }
+
+ for (i = 0; i < ARRAY_SIZE(sections); i++)
+ {
+ for (num = 0; num < ns_msg_count( msg, sections[i] ); num++)
+ {
+ ret = copy_record( msg, sections[i], num, &record );
+ if (ret != ERROR_SUCCESS) goto exit;
+
+ DNS_RRSET_ADD( rrset, (DNS_RECORD *)record );
+ }
+ }
+
+exit:
+ DNS_RRSET_TERMINATE( rrset );
+
+ if (ret != ERROR_SUCCESS)
+ free_record_list( rrset.pFirstRR );
+ else
+ *result = (DNS_RECORDA *)rrset.pFirstRR;
+
+ return ret;
+}
+
+static const struct resolv_funcs funcs =
+{
+ resolv_get_serverlist,
+ resolv_query,
+ resolv_set_serverlist
+};
+
+NTSTATUS CDECL __wine_init_unix_lib( HMODULE module, DWORD reason, const void *ptr_in, void *ptr_out )
+{
+ if (reason != DLL_PROCESS_ATTACH) return STATUS_SUCCESS;
+ *(const struct resolv_funcs **)ptr_out = &funcs;
+ return STATUS_SUCCESS;
+}
+
+#endif /* HAVE_RESOLV */
diff --git a/dlls/dnsapi/main.c b/dlls/dnsapi/main.c
index 4ab294c7c07..f83a54d1469 100644
--- a/dlls/dnsapi/main.c
+++ b/dlls/dnsapi/main.c
@@ -22,6 +22,7 @@
#include <stdarg.h>
#include "windef.h"
+#include "winternl.h"
#include "winbase.h"
#include "winerror.h"
#include "windns.h"
@@ -30,6 +31,25 @@
WINE_DEFAULT_DEBUG_CHANNEL(dnsapi);
+const struct resolv_funcs *resolv_funcs = NULL;
+
+BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved )
+{
+ TRACE( "(%p,%u,%p)\n", hinst, reason, reserved );
+
+ switch (reason)
+ {
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls( hinst );
+ if (__wine_init_unix_lib( hinst, reason, NULL, &resolv_funcs ))
+ ERR( "No libresolv support, expect problems\n" );
+ break;
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+ return TRUE;
+}
+
/******************************************************************************
* DnsAcquireContextHandle_A [DNSAPI.@]
*
diff --git a/dlls/dnsapi/name.c b/dlls/dnsapi/name.c
index 9404200e443..4f4ba507cac 100644
--- a/dlls/dnsapi/name.c
+++ b/dlls/dnsapi/name.c
@@ -3,7 +3,7 @@
*
* Copyright (C) 2006 Matthew Kehrer
* Copyright (C) 2006 Hans Leidekker
- *
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
@@ -19,30 +19,15 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include "config.h"
-#include "wine/debug.h"
-#include "wine/unicode.h"
-
#include <stdarg.h>
-#include <sys/types.h>
-
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#ifdef HAVE_ARPA_NAMESER_H
-# include <arpa/nameser.h>
-# undef NOERROR
-#endif
-#ifdef HAVE_RESOLV_H
-# include <resolv.h>
-#endif
-
#include "windef.h"
#include "winbase.h"
#include "winerror.h"
#include "winnls.h"
#include "windns.h"
+#include "wine/debug.h"
+#include "wine/unicode.h"
#include "dnsapi.h"
WINE_DEFAULT_DEBUG_CHANNEL(dnsapi);
@@ -81,7 +66,7 @@ BOOL WINAPI DnsNameCompare_W( PCWSTR name1, PCWSTR name2 )
if (!name1 && !name2) return TRUE;
if (!name1 || !name2) return FALSE;
-
+
p = name1 + lstrlenW( name1 ) - 1;
q = name2 + lstrlenW( name2 ) - 1;
diff --git a/dlls/dnsapi/query.c b/dlls/dnsapi/query.c
index 3bef65e9731..a7ae77148be 100644
--- a/dlls/dnsapi/query.c
+++ b/dlls/dnsapi/query.c
@@ -2,7 +2,7 @@
* DNS support
*
* Copyright (C) 2006 Hans Leidekker
- *
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
@@ -18,28 +18,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include "config.h"
-#include "wine/port.h"
-#include "wine/debug.h"
-
#include <stdarg.h>
-#include <string.h>
-#include <stdio.h>
-#include <sys/types.h>
-
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#ifdef HAVE_ARPA_NAMESER_H
-# include <arpa/nameser.h>
-#endif
-#ifdef HAVE_RESOLV_H
-# include <resolv.h>
-#endif
-#ifdef HAVE_NETDB_H
-# include <netdb.h>
-#endif
-
#include "windef.h"
#include "winbase.h"
#include "winerror.h"
@@ -47,438 +26,11 @@
#include "windns.h"
#include "nb30.h"
+#include "wine/debug.h"
#include "dnsapi.h"
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 )
-{
- if ((_res.options & RES_INIT) == 0)
- res_init();
-}
-
-static const char *section_to_str( ns_sect section )
-{
- switch (section)
- {
- case ns_s_qd: return "Question";
- case ns_s_an: return "Answer";
- case ns_s_ns: return "Authority";
- case ns_s_ar: return "Additional";
- default:
- {
- static char tmp[11];
- FIXME( "unknown section: 0x%02x\n", section );
- sprintf( tmp, "0x%02x", section );
- return tmp;
- }
- }
-}
-
-static unsigned long map_options( DWORD options )
-{
- unsigned long ret = 0;
-
- if (options == DNS_QUERY_STANDARD)
- return RES_DEFAULT;
-
- if (options & DNS_QUERY_ACCEPT_TRUNCATED_RESPONSE)
- ret |= RES_IGNTC;
- if (options & DNS_QUERY_USE_TCP_ONLY)
- ret |= RES_USEVC;
- if (options & DNS_QUERY_NO_RECURSION)
- ret &= ~RES_RECURSE;
- if (options & DNS_QUERY_NO_LOCAL_NAME)
- ret &= ~RES_DNSRCH;
- if (options & DNS_QUERY_NO_HOSTS_FILE)
- ret |= RES_NOALIASES;
- if (options & DNS_QUERY_TREAT_AS_FQDN)
- ret &= ~RES_DEFNAMES;
-
- if (options & DNS_QUERY_DONT_RESET_TTL_VALUES)
- FIXME( "option DNS_QUERY_DONT_RESET_TTL_VALUES not implemented\n" );
- if (options & DNS_QUERY_RESERVED)
- FIXME( "option DNS_QUERY_RESERVED not implemented\n" );
- if (options & DNS_QUERY_WIRE_ONLY)
- FIXME( "option DNS_QUERY_WIRE_ONLY not implemented\n" );
- if (options & DNS_QUERY_NO_WIRE_QUERY)
- FIXME( "option DNS_QUERY_NO_WIRE_QUERY not implemented\n" );
- if (options & DNS_QUERY_BYPASS_CACHE)
- FIXME( "option DNS_QUERY_BYPASS_CACHE not implemented\n" );
- if (options & DNS_QUERY_RETURN_MESSAGE)
- FIXME( "option DNS_QUERY_RETURN_MESSAGE not implemented\n" );
-
- if (options & DNS_QUERY_NO_NETBT)
- TRACE( "netbios query disabled\n" );
-
- return ret;
-}
-
-static DNS_STATUS map_error( int error )
-{
- switch (error)
- {
- case ns_r_noerror: return ERROR_SUCCESS;
- case ns_r_formerr: return DNS_ERROR_RCODE_FORMAT_ERROR;
- case ns_r_servfail: return DNS_ERROR_RCODE_SERVER_FAILURE;
- case ns_r_nxdomain: return DNS_ERROR_RCODE_NAME_ERROR;
- case ns_r_notimpl: return DNS_ERROR_RCODE_NOT_IMPLEMENTED;
- case ns_r_refused: return DNS_ERROR_RCODE_REFUSED;
- case ns_r_yxdomain: return DNS_ERROR_RCODE_YXDOMAIN;
- case ns_r_yxrrset: return DNS_ERROR_RCODE_YXRRSET;
- case ns_r_nxrrset: return DNS_ERROR_RCODE_NXRRSET;
- case ns_r_notauth: return DNS_ERROR_RCODE_NOTAUTH;
- case ns_r_notzone: return DNS_ERROR_RCODE_NOTZONE;
- default:
- FIXME( "unmapped error code: %d\n", error );
- return DNS_ERROR_RCODE_NOT_IMPLEMENTED;
- }
-}
-
-static DNS_STATUS map_h_errno( int error )
-{
- switch (error)
- {
- case NO_DATA:
- case HOST_NOT_FOUND: return DNS_ERROR_RCODE_NAME_ERROR;
- case TRY_AGAIN: return DNS_ERROR_RCODE_SERVER_FAILURE;
- case NO_RECOVERY: return DNS_ERROR_RCODE_REFUSED;
-#ifdef NETDB_INTERNAL
- case NETDB_INTERNAL: return DNS_ERROR_RCODE;
-#endif
- default:
- FIXME( "unmapped error code: %d\n", error );
- return DNS_ERROR_RCODE_NOT_IMPLEMENTED;
- }
-}
-
-static char *dname_from_msg( ns_msg msg, const unsigned char *pos )
-{
- int len;
- char *str, dname[NS_MAXDNAME] = ".";
-
- /* returns *compressed* length, ignore it */
- ns_name_uncompress( ns_msg_base(msg), ns_msg_end(msg), pos, dname, sizeof(dname) );
-
- len = strlen( dname );
- str = heap_alloc( len + 1 );
- if (str) strcpy( str, dname );
- return str;
-}
-
-static char *str_from_rdata( const unsigned char *rdata )
-{
- char *str;
- unsigned int len = rdata[0];
-
- str = heap_alloc( len + 1 );
- if (str)
- {
- memcpy( str, ++rdata, len );
- str[len] = '\0';
- }
- return str;
-}
-
-static unsigned int get_record_size( const ns_rr *rr )
-{
- const unsigned char *pos = rr->rdata;
- unsigned int num = 0, size = sizeof(DNS_RECORDA);
-
- switch (rr->type)
- {
- case ns_t_key:
- {
- pos += sizeof(WORD) + sizeof(BYTE) + sizeof(BYTE);
- size += rr->rdata + rr->rdlength - pos - 1;
- break;
- }
- case ns_t_sig:
- {
- pos += sizeof(PCHAR) + sizeof(WORD) + 2 * sizeof(BYTE);
- pos += 3 * sizeof(DWORD) + 2 * sizeof(WORD);
- size += rr->rdata + rr->rdlength - pos - 1;
- break;
- }
- case ns_t_hinfo:
- case ns_t_isdn:
- case ns_t_txt:
- case ns_t_x25:
- {
- while (pos[0] && pos < rr->rdata + rr->rdlength)
- {
- num++;
- pos += pos[0] + 1;
- }
- size += (num - 1) * sizeof(PCHAR);
- break;
- }
- case ns_t_null:
- case ns_t_opt:
- {
- size += rr->rdlength - 1;
- break;
- }
- case ns_t_nxt:
- case ns_t_wks:
- case 0xff01: /* WINS */
- {
- FIXME( "unhandled type: %s\n", type_to_str( rr->type ) );
- break;
- }
- default:
- break;
- }
- return size;
-}
-
-static DNS_STATUS copy_rdata( ns_msg msg, const ns_rr *rr, DNS_RECORDA *r, WORD *dlen )
-{
- DNS_STATUS ret = ERROR_SUCCESS;
- const unsigned char *pos = rr->rdata;
- unsigned int i, size;
-
- switch (rr->type)
- {
- case ns_t_a:
- {
- r->Data.A.IpAddress = *(const DWORD *)pos;
- *dlen = sizeof(DNS_A_DATA);
- break;
- }
- case ns_t_aaaa:
- {
- for (i = 0; i < sizeof(IP6_ADDRESS)/sizeof(DWORD); i++)
- {
- r->Data.AAAA.Ip6Address.IP6Dword[i] = *(const DWORD *)pos;
- pos += sizeof(DWORD);
- }
-
- *dlen = sizeof(DNS_AAAA_DATA);
- break;
- }
- case ns_t_key:
- {
- /* FIXME: byte order? */
- r->Data.KEY.wFlags = *(const WORD *)pos; pos += sizeof(WORD);
- r->Data.KEY.chProtocol = *pos++;
- r->Data.KEY.chAlgorithm = *pos++;
-
- size = rr->rdata + rr->rdlength - pos;
-
- for (i = 0; i < size; i++)
- r->Data.KEY.Key[i] = *pos++;
-
- *dlen = sizeof(DNS_KEY_DATA) + (size - 1) * sizeof(BYTE);
- break;
- }
- case ns_t_rp:
- case ns_t_minfo:
- {
- r->Data.MINFO.pNameMailbox = dname_from_msg( msg, pos );
- if (!r->Data.MINFO.pNameMailbox) return ERROR_NOT_ENOUGH_MEMORY;
-
- if (ns_name_skip( &pos, ns_msg_end( msg ) ) < 0)
- return DNS_ERROR_BAD_PACKET;
-
- r->Data.MINFO.pNameErrorsMailbox = dname_from_msg( msg, pos );
- if (!r->Data.MINFO.pNameErrorsMailbox)
- {
- heap_free( r->Data.MINFO.pNameMailbox );
- return ERROR_NOT_ENOUGH_MEMORY;
- }
-
- *dlen = sizeof(DNS_MINFO_DATAA);
- break;
- }
- case ns_t_afsdb:
- case ns_t_rt:
- case ns_t_mx:
- {
- r->Data.MX.wPreference = ntohs( *(const WORD *)pos );
- r->Data.MX.pNameExchange = dname_from_msg( msg, pos + sizeof(WORD) );
- if (!r->Data.MX.pNameExchange) return ERROR_NOT_ENOUGH_MEMORY;
-
- *dlen = sizeof(DNS_MX_DATAA);
- break;
- }
- case ns_t_null:
- {
- r->Data.Null.dwByteCount = rr->rdlength;
- memcpy( r->Data.Null.Data, rr->rdata, rr->rdlength );
-
- *dlen = sizeof(DNS_NULL_DATA) + rr->rdlength - 1;
- break;
- }
- case ns_t_opt:
- {
- r->Data.OPT.wDataLength = rr->rdlength;
- r->Data.OPT.wPad = 0;
- memcpy( r->Data.OPT.Data, rr->rdata, rr->rdlength );
-
- *dlen = sizeof(DNS_OPT_DATA) + rr->rdlength - 1;
- break;
- }
- case ns_t_cname:
- case ns_t_ns:
- case ns_t_mb:
- case ns_t_md:
- case ns_t_mf:
- case ns_t_mg:
- case ns_t_mr:
- case ns_t_ptr:
- {
- r->Data.PTR.pNameHost = dname_from_msg( msg, pos );
- if (!r->Data.PTR.pNameHost) return ERROR_NOT_ENOUGH_MEMORY;
-
- *dlen = sizeof(DNS_PTR_DATAA);
- break;
- }
- case ns_t_sig:
- {
- r->Data.SIG.pNameSigner = dname_from_msg( msg, pos );
- if (!r->Data.SIG.pNameSigner) return ERROR_NOT_ENOUGH_MEMORY;
-
- if (ns_name_skip( &pos, ns_msg_end( msg ) ) < 0)
- return DNS_ERROR_BAD_PACKET;
-
- /* FIXME: byte order? */
- r->Data.SIG.wTypeCovered = *(const WORD *)pos; pos += sizeof(WORD);
- r->Data.SIG.chAlgorithm = *pos++;
- r->Data.SIG.chLabelCount = *pos++;
- r->Data.SIG.dwOriginalTtl = *(const DWORD *)pos; pos += sizeof(DWORD);
- r->Data.SIG.dwExpiration = *(const DWORD *)pos; pos += sizeof(DWORD);
- r->Data.SIG.dwTimeSigned = *(const DWORD *)pos; pos += sizeof(DWORD);
- r->Data.SIG.wKeyTag = *(const WORD *)pos;
-
- size = rr->rdata + rr->rdlength - pos;
-
- for (i = 0; i < size; i++)
- r->Data.SIG.Signature[i] = *pos++;
-
- *dlen = sizeof(DNS_SIG_DATAA) + (size - 1) * sizeof(BYTE);
- break;
- }
- case ns_t_soa:
- {
- r->Data.SOA.pNamePrimaryServer = dname_from_msg( msg, pos );
- if (!r->Data.SOA.pNamePrimaryServer) return ERROR_NOT_ENOUGH_MEMORY;
-
- if (ns_name_skip( &pos, ns_msg_end( msg ) ) < 0)
- return DNS_ERROR_BAD_PACKET;
-
- r->Data.SOA.pNameAdministrator = dname_from_msg( msg, pos );
- if (!r->Data.SOA.pNameAdministrator)
- {
- heap_free( r->Data.SOA.pNamePrimaryServer );
- return ERROR_NOT_ENOUGH_MEMORY;
- }
-
- if (ns_name_skip( &pos, ns_msg_end( msg ) ) < 0)
- return DNS_ERROR_BAD_PACKET;
-
- r->Data.SOA.dwSerialNo = ntohl( *(const DWORD *)pos ); pos += sizeof(DWORD);
- r->Data.SOA.dwRefresh = ntohl( *(const DWORD *)pos ); pos += sizeof(DWORD);
- r->Data.SOA.dwRetry = ntohl( *(const DWORD *)pos ); pos += sizeof(DWORD);
- r->Data.SOA.dwExpire = ntohl( *(const DWORD *)pos ); pos += sizeof(DWORD);
- r->Data.SOA.dwDefaultTtl = ntohl( *(const DWORD *)pos ); pos += sizeof(DWORD);
-
- *dlen = sizeof(DNS_SOA_DATAA);
- break;
- }
- case ns_t_srv:
- {
- r->Data.SRV.wPriority = ntohs( *(const WORD *)pos ); pos += sizeof(WORD);
- r->Data.SRV.wWeight = ntohs( *(const WORD *)pos ); pos += sizeof(WORD);
- r->Data.SRV.wPort = ntohs( *(const WORD *)pos ); pos += sizeof(WORD);
-
- r->Data.SRV.pNameTarget = dname_from_msg( msg, pos );
- if (!r->Data.SRV.pNameTarget) return ERROR_NOT_ENOUGH_MEMORY;
-
- *dlen = sizeof(DNS_SRV_DATAA);
- break;
- }
- case ns_t_hinfo:
- case ns_t_isdn:
- case ns_t_x25:
- case ns_t_txt:
- {
- i = 0;
- while (pos[0] && pos < rr->rdata + rr->rdlength)
- {
- r->Data.TXT.pStringArray[i] = str_from_rdata( pos );
- if (!r->Data.TXT.pStringArray[i])
- {
- while (i > 0) heap_free( r->Data.TXT.pStringArray[--i] );
- return ERROR_NOT_ENOUGH_MEMORY;
- }
- i++;
- pos += pos[0] + 1;
- }
- r->Data.TXT.dwStringCount = i;
- *dlen = sizeof(DNS_TXT_DATAA) + (i - 1) * sizeof(PCHAR);
- break;
- }
- case ns_t_atma:
- case ns_t_loc:
- case ns_t_nxt:
- case ns_t_tsig:
- case ns_t_wks:
- case 0x00f9: /* TKEY */
- case 0xff01: /* WINS */
- case 0xff02: /* WINSR */
- default:
- FIXME( "unhandled type: %s\n", type_to_str( rr->type ) );
- return DNS_ERROR_RCODE_NOT_IMPLEMENTED;
- }
-
- return ret;
-}
-
-static DNS_STATUS copy_record( ns_msg msg, ns_sect section,
- unsigned short num, DNS_RECORDA **recp )
-{
- DNS_STATUS ret;
- DNS_RECORDA *record;
- WORD dlen;
- ns_rr rr;
-
- if (ns_parserr( &msg, section, num, &rr ) < 0)
- return DNS_ERROR_BAD_PACKET;
-
- if (!(record = heap_alloc_zero( get_record_size( &rr ) )))
- return ERROR_NOT_ENOUGH_MEMORY;
-
- record->pName = strdup_u( rr.name );
- if (!record->pName)
- {
- heap_free( record );
- return ERROR_NOT_ENOUGH_MEMORY;
- }
-
- record->wType = rr.type;
- record->Flags.S.Section = section;
- record->Flags.S.CharSet = DnsCharSetUtf8;
- record->dwTtl = rr.ttl;
-
- if ((ret = copy_rdata( msg, &rr, record, &dlen )))
- {
- heap_free( record->pName );
- heap_free( record );
- return ret;
- }
- record->wDataLength = dlen;
- *recp = record;
-
- TRACE( "found %s record in %s section\n",
- type_to_str( rr.type ), section_to_str( section ) );
- return ERROR_SUCCESS;
-}
-
#define DEFAULT_TTL 1200
static DNS_STATUS do_query_netbios( PCSTR name, DNS_RECORDA **recp )
@@ -510,7 +62,7 @@ static DNS_STATUS do_query_netbios( PCSTR name, DNS_RECORDA **recp )
header = (FIND_NAME_HEADER *)ncb.ncb_buffer;
buffer = (FIND_NAME_BUFFER *)((char *)header + sizeof(FIND_NAME_HEADER));
- for (i = 0; i < header->node_count; i++)
+ for (i = 0; i < header->node_count; i++)
{
record = heap_alloc_zero( sizeof(DNS_RECORDA) );
if (!record)
@@ -551,107 +103,6 @@ exit:
return status;
}
-/* res_init() must have been called before calling these three functions.
- */
-static DNS_STATUS set_serverlist( const IP4_ARRAY *addrs )
-{
- int i;
-
- if (!addrs || !addrs->AddrCount) return ERROR_SUCCESS;
- if (addrs->AddrCount > MAXNS)
- {
- WARN( "too many servers: %d only using the first: %d\n",
- addrs->AddrCount, MAXNS );
- _res.nscount = MAXNS;
- }
- else _res.nscount = addrs->AddrCount;
-
- for (i = 0; i < _res.nscount; i++)
- _res.nsaddr_list[i].sin_addr.s_addr = addrs->AddrArray[i];
-
- return ERROR_SUCCESS;
-}
-
-static DNS_STATUS get_serverlist( PIP4_ARRAY addrs, PDWORD len )
-{
- unsigned int size;
- int i;
-
- size = FIELD_OFFSET(IP4_ARRAY, AddrArray[_res.nscount]);
- if (!addrs || *len < size)
- {
- *len = size;
- return ERROR_INSUFFICIENT_BUFFER;
- }
-
- addrs->AddrCount = _res.nscount;
-
- for (i = 0; i < _res.nscount; i++)
- addrs->AddrArray[i] = _res.nsaddr_list[i].sin_addr.s_addr;
-
- return ERROR_SUCCESS;
-}
-
-#define DNS_MAX_PACKET_SIZE 4096
-static DNS_STATUS do_query( PCSTR name, WORD type, DWORD options, PDNS_RECORDA *result )
-{
- DNS_STATUS ret = DNS_ERROR_RCODE_NOT_IMPLEMENTED;
-
- unsigned int i, num;
- unsigned char answer[DNS_MAX_PACKET_SIZE];
- ns_sect sections[] = { ns_s_an, ns_s_ar };
- ns_msg msg;
-
- DNS_RECORDA *record = NULL;
- DNS_RRSET rrset;
- int len;
-
- DNS_RRSET_INIT( rrset );
-
- len = res_query( name, ns_c_in, type, answer, sizeof(answer) );
- if (len < 0)
- {
- ret = map_h_errno( h_errno );
- goto exit;
- }
-
- if (ns_initparse( answer, len, &msg ) < 0)
- {
- ret = DNS_ERROR_BAD_PACKET;
- goto exit;
- }
-
-#define RCODE_MASK 0x0f
- if ((msg._flags & RCODE_MASK) != ns_r_noerror)
- {
- ret = map_error( msg._flags & RCODE_MASK );
- goto exit;
- }
-
- for (i = 0; i < ARRAY_SIZE(sections); i++)
- {
- for (num = 0; num < ns_msg_count( msg, sections[i] ); num++)
- {
- ret = copy_record( msg, sections[i], num, &record );
- if (ret != ERROR_SUCCESS) goto exit;
-
- DNS_RRSET_ADD( rrset, (DNS_RECORD *)record );
- }
- }
-
-exit:
- DNS_RRSET_TERMINATE( rrset );
-
- if (ret != ERROR_SUCCESS)
- DnsRecordListFree( rrset.pFirstRR, DnsFreeRecordList );
- else
- *result = (DNS_RECORDA *)rrset.pFirstRR;
-
- return ret;
-}
-
-#endif /* HAVE_RESOLV */
-
static const char *debugstr_query_request(const DNS_QUERY_REQUEST *req)
{
if (!req)
@@ -693,7 +144,7 @@ DNS_STATUS WINAPI DnsQuery_A( PCSTR name, WORD type, DWORD options, PVOID server
nameW = strdup_aw( name );
if (!nameW) return ERROR_NOT_ENOUGH_MEMORY;
- status = DnsQuery_W( nameW, type, options, servers, &resultW, reserved );
+ status = DnsQuery_W( nameW, type, options, servers, &resultW, reserved );
if (status == ERROR_SUCCESS)
{
@@ -716,7 +167,6 @@ DNS_STATUS WINAPI DnsQuery_UTF8( PCSTR name, WORD type, DWORD options, PVOID ser
PDNS_RECORDA *result, PVOID *reserved )
{
DNS_STATUS ret = DNS_ERROR_RCODE_NOT_IMPLEMENTED;
-#ifdef HAVE_RESOLV
TRACE( "(%s,%s,0x%08x,%p,%p,%p)\n", debugstr_a(name), type_to_str( type ),
options, servers, result, reserved );
@@ -724,12 +174,9 @@ DNS_STATUS WINAPI DnsQuery_UTF8( PCSTR name, WORD type, DWORD options, PVOID ser
if (!name || !result)
return ERROR_INVALID_PARAMETER;
- initialise_resolver();
- _res.options |= map_options( options );
-
- if ((ret = set_serverlist( servers ))) return ret;
+ if ((ret = resolv_funcs->set_serverlist( servers ))) return ret;
- ret = do_query( name, type, options, result );
+ ret = resolv_funcs->query( name, type, options, result );
if (ret == DNS_ERROR_RCODE_NAME_ERROR && type == DNS_TYPE_A &&
!(options & DNS_QUERY_NO_NETBT))
@@ -738,7 +185,6 @@ DNS_STATUS WINAPI DnsQuery_UTF8( PCSTR name, WORD type, DWORD options, PVOID ser
ret = do_query_netbios( name, result );
}
-#endif
return ret;
}
@@ -762,7 +208,7 @@ DNS_STATUS WINAPI DnsQuery_W( PCWSTR name, WORD type, DWORD options, PVOID serve
nameU = strdup_wu( name );
if (!nameU) return ERROR_NOT_ENOUGH_MEMORY;
- status = DnsQuery_UTF8( nameU, type, options, servers, &resultA, reserved );
+ status = DnsQuery_UTF8( nameU, type, options, servers, &resultA, reserved );
if (status == ERROR_SUCCESS)
{
@@ -777,8 +223,7 @@ DNS_STATUS WINAPI DnsQuery_W( PCWSTR name, WORD type, DWORD options, PVOID serve
return status;
}
-static DNS_STATUS get_hostname_a( COMPUTER_NAME_FORMAT format,
- PSTR buffer, PDWORD len )
+static DNS_STATUS get_hostname_a( COMPUTER_NAME_FORMAT format, PSTR buffer, PDWORD len )
{
char name[256];
DWORD size = ARRAY_SIZE(name);
@@ -796,8 +241,7 @@ static DNS_STATUS get_hostname_a( COMPUTER_NAME_FORMAT format,
return ERROR_SUCCESS;
}
-static DNS_STATUS get_hostname_w( COMPUTER_NAME_FORMAT format,
- PWSTR buffer, PDWORD len )
+static DNS_STATUS get_hostname_w( COMPUTER_NAME_FORMAT format, PWSTR buffer, PDWORD len )
{
WCHAR name[256];
DWORD size = ARRAY_SIZE(name);
@@ -833,14 +277,8 @@ DNS_STATUS WINAPI DnsQueryConfig( DNS_CONFIG_TYPE config, DWORD flag, PCWSTR ada
{
case DnsConfigDnsServerList:
{
-#ifdef HAVE_RESOLV
- initialise_resolver();
- ret = get_serverlist( buffer, len );
- break;
-#else
- WARN( "compiled without resolver support\n" );
+ ret = resolv_funcs->get_serverlist( buffer, len );
break;
-#endif
}
case DnsConfigHostName_A:
case DnsConfigHostName_UTF8:
diff --git a/dlls/dnsapi/record.c b/dlls/dnsapi/record.c
index 51d9e8fd2d7..4697438df57 100644
--- a/dlls/dnsapi/record.c
+++ b/dlls/dnsapi/record.c
@@ -2,7 +2,7 @@
* DNS support
*
* Copyright (C) 2006 Hans Leidekker
- *
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
@@ -18,31 +18,14 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include "config.h"
-#include "wine/port.h"
-#include "wine/debug.h"
-#include "wine/unicode.h"
-
#include <stdarg.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#ifdef HAVE_ARPA_NAMESER_H
-# include <arpa/nameser.h>
-#endif
-#ifdef HAVE_RESOLV_H
-# include <resolv.h>
-#endif
-
#include "windef.h"
#include "winbase.h"
#include "winnls.h"
#include "windns.h"
+#include "wine/debug.h"
+#include "wine/unicode.h"
#include "dnsapi.h"
WINE_DEFAULT_DEBUG_CHANNEL(dnsapi);
@@ -158,10 +141,8 @@ BOOL WINAPI DnsRecordCompare( PDNS_RECORD r1, PDNS_RECORD r2 )
r1->Data.SOA.dwExpire != r2->Data.SOA.dwExpire ||
r1->Data.SOA.dwDefaultTtl != r2->Data.SOA.dwDefaultTtl)
return FALSE;
- if (strcmpX( r1->Data.SOA.pNamePrimaryServer,
- r2->Data.SOA.pNamePrimaryServer, wide ) ||
- strcmpX( r1->Data.SOA.pNameAdministrator,
- r2->Data.SOA.pNameAdministrator, wide ))
+ if (strcmpX( r1->Data.SOA.pNamePrimaryServer, r2->Data.SOA.pNamePrimaryServer, wide ) ||
+ strcmpX( r1->Data.SOA.pNameAdministrator, r2->Data.SOA.pNameAdministrator, wide ))
return FALSE;
break;
}
@@ -174,17 +155,14 @@ BOOL WINAPI DnsRecordCompare( PDNS_RECORD r1, PDNS_RECORD r2 )
case DNS_TYPE_MG:
case DNS_TYPE_MR:
{
- if (strcmpX( r1->Data.PTR.pNameHost,
- r2->Data.PTR.pNameHost, wide )) return FALSE;
+ if (strcmpX( r1->Data.PTR.pNameHost, r2->Data.PTR.pNameHost, wide )) return FALSE;
break;
}
case DNS_TYPE_MINFO:
case DNS_TYPE_RP:
{
- if (strcmpX( r1->Data.MINFO.pNameMailbox,
- r2->Data.MINFO.pNameMailbox, wide ) ||
- strcmpX( r1->Data.MINFO.pNameErrorsMailbox,
- r2->Data.MINFO.pNameErrorsMailbox, wide ))
+ if (strcmpX( r1->Data.MINFO.pNameMailbox, r2->Data.MINFO.pNameMailbox, wide ) ||
+ strcmpX( r1->Data.MINFO.pNameErrorsMailbox, r2->Data.MINFO.pNameErrorsMailbox, wide ))
return FALSE;
break;
}
@@ -194,8 +172,7 @@ BOOL WINAPI DnsRecordCompare( PDNS_RECORD r1, PDNS_RECORD r2 )
{
if (r1->Data.MX.wPreference != r2->Data.MX.wPreference)
return FALSE;
- if (strcmpX( r1->Data.MX.pNameExchange,
- r2->Data.MX.pNameExchange, wide ))
+ if (strcmpX( r1->Data.MX.pNameExchange, r2->Data.MX.pNameExchange, wide ))
return FALSE;
break;
}
@@ -208,8 +185,7 @@ BOOL WINAPI DnsRecordCompare( PDNS_RECORD r1, PDNS_RECORD r2 )
return FALSE;
for (i = 0; i < r1->Data.TXT.dwStringCount; i++)
{
- if (strcmpX( r1->Data.TXT.pStringArray[i],
- r2->Data.TXT.pStringArray[i], wide ))
+ if (strcmpX( r1->Data.TXT.pStringArray[i], r2->Data.TXT.pStringArray[i], wide ))
return FALSE;
}
break;
@@ -255,8 +231,7 @@ BOOL WINAPI DnsRecordCompare( PDNS_RECORD r1, PDNS_RECORD r2 )
}
case DNS_TYPE_SIG:
{
- if (strcmpX( r1->Data.SIG.pNameSigner,
- r2->Data.SIG.pNameSigner, wide ))
+ if (strcmpX( r1->Data.SIG.pNameSigner, r2->Data.SIG.pNameSigner, wide ))
return FALSE;
if (r1->Data.SIG.wTypeCovered != r2->Data.SIG.wTypeCovered ||
r1->Data.SIG.chAlgorithm != r2->Data.SIG.chAlgorithm ||
@@ -284,8 +259,7 @@ BOOL WINAPI DnsRecordCompare( PDNS_RECORD r1, PDNS_RECORD r2 )
}
case DNS_TYPE_NXT:
{
- if (strcmpX( r1->Data.NXT.pNameNext,
- r2->Data.NXT.pNameNext, wide )) return FALSE;
+ if (strcmpX( r1->Data.NXT.pNameNext, r2->Data.NXT.pNameNext, wide )) return FALSE;
if (r1->Data.NXT.wNumTypes != r2->Data.NXT.wNumTypes) return FALSE;
if (memcmp( r1->Data.NXT.wTypes, r2->Data.NXT.wTypes,
r1->wDataLength - sizeof(DNS_NXT_DATAA) + sizeof(WORD) ))
@@ -294,8 +268,7 @@ BOOL WINAPI DnsRecordCompare( PDNS_RECORD r1, PDNS_RECORD r2 )
}
case DNS_TYPE_SRV:
{
- if (strcmpX( r1->Data.SRV.pNameTarget,
- r2->Data.SRV.pNameTarget, wide )) return FALSE;
+ if (strcmpX( r1->Data.SRV.pNameTarget, r2->Data.SRV.pNameTarget, wide )) return FALSE;
if (r1->Data.SRV.wPriority != r2->Data.SRV.wPriority ||
r1->Data.SRV.wWeight != r2->Data.SRV.wWeight ||
r1->Data.SRV.wPort != r2->Data.SRV.wPort)
@@ -304,8 +277,7 @@ BOOL WINAPI DnsRecordCompare( PDNS_RECORD r1, PDNS_RECORD r2 )
}
case DNS_TYPE_TKEY:
{
- if (strcmpX( r1->Data.TKEY.pNameAlgorithm,
- r2->Data.TKEY.pNameAlgorithm, wide ))
+ if (strcmpX( r1->Data.TKEY.pNameAlgorithm, r2->Data.TKEY.pNameAlgorithm, wide ))
return FALSE;
if (r1->Data.TKEY.dwCreateTime != r2->Data.TKEY.dwCreateTime ||
r1->Data.TKEY.dwExpireTime != r2->Data.TKEY.dwExpireTime ||
@@ -326,8 +298,7 @@ BOOL WINAPI DnsRecordCompare( PDNS_RECORD r1, PDNS_RECORD r2 )
}
case DNS_TYPE_TSIG:
{
- if (strcmpX( r1->Data.TSIG.pNameAlgorithm,
- r2->Data.TSIG.pNameAlgorithm, wide ))
+ if (strcmpX( r1->Data.TSIG.pNameAlgorithm, r2->Data.TSIG.pNameAlgorithm, wide ))
return FALSE;
if (r1->Data.TSIG.i64CreateTime != r2->Data.TSIG.i64CreateTime ||
r1->Data.TSIG.wFudgeTime != r2->Data.TSIG.wFudgeTime ||
@@ -364,8 +335,7 @@ BOOL WINAPI DnsRecordCompare( PDNS_RECORD r1, PDNS_RECORD r2 )
r1->Data.WINSR.dwLookupTimeout != r2->Data.WINSR.dwLookupTimeout ||
r1->Data.WINSR.dwCacheTimeout != r2->Data.WINSR.dwCacheTimeout)
return FALSE;
- if (strcmpX( r1->Data.WINSR.pNameResultDomain,
- r2->Data.WINSR.pNameResultDomain, wide ))
+ if (strcmpX( r1->Data.WINSR.pNameResultDomain, r2->Data.WINSR.pNameResultDomain, wide ))
return FALSE;
break;
}
@@ -748,7 +718,7 @@ BOOL WINAPI DnsRecordSetCompare( PDNS_RECORD set1, PDNS_RECORD set2,
DNS_RRSET_TERMINATE( rr1 );
DNS_RRSET_TERMINATE( rr2 );
-
+
if (diff1) *diff1 = rr1.pFirstRR;
else DnsRecordListFree( rr1.pFirstRR, DnsFreeRecordList );
@@ -763,7 +733,7 @@ error:
DnsRecordListFree( rr1.pFirstRR, DnsFreeRecordList );
DnsRecordListFree( rr2.pFirstRR, DnsFreeRecordList );
-
+
return FALSE;
}
--
2.30.2
1
0
March 30, 2021
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/dnsapi/dnsapi.h | 47 +++++++++-----------
dlls/dnsapi/name.c | 8 ++--
dlls/dnsapi/query.c | 102 +++++++++++++++++++++----------------------
dlls/dnsapi/record.c | 87 ++++++++++++++++--------------------
4 files changed, 114 insertions(+), 130 deletions(-)
diff --git a/dlls/dnsapi/dnsapi.h b/dlls/dnsapi/dnsapi.h
index 510555698c7..d0a31ea0981 100644
--- a/dlls/dnsapi/dnsapi.h
+++ b/dlls/dnsapi/dnsapi.h
@@ -24,39 +24,36 @@
#include "wine/heap.h"
-static inline LPSTR dns_strdup_a( LPCSTR src )
+static inline char *strdup_a( const char *src )
{
- LPSTR dst;
-
+ char *dst;
if (!src) return NULL;
dst = heap_alloc( (lstrlenA( src ) + 1) * sizeof(char) );
if (dst) lstrcpyA( dst, src );
return dst;
}
-static inline char *dns_strdup_u( const char *src )
+static inline char *strdup_u( const char *src )
{
char *dst;
-
if (!src) return NULL;
dst = heap_alloc( (strlen( src ) + 1) * sizeof(char) );
if (dst) strcpy( dst, src );
return dst;
}
-static inline LPWSTR dns_strdup_w( LPCWSTR src )
+static inline WCHAR *strdup_w( const WCHAR *src )
{
- LPWSTR dst;
-
+ WCHAR *dst;
if (!src) return NULL;
dst = heap_alloc( (lstrlenW( src ) + 1) * sizeof(WCHAR) );
if (dst) lstrcpyW( dst, src );
return dst;
}
-static inline LPWSTR dns_strdup_aw( LPCSTR str )
+static inline WCHAR *strdup_aw( const char *str )
{
- LPWSTR ret = NULL;
+ WCHAR *ret = NULL;
if (str)
{
DWORD len = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0 );
@@ -66,9 +63,9 @@ static inline LPWSTR dns_strdup_aw( LPCSTR str )
return ret;
}
-static inline LPWSTR dns_strdup_uw( const char *str )
+static inline WCHAR *strdup_uw( const char *str )
{
- LPWSTR ret = NULL;
+ WCHAR *ret = NULL;
if (str)
{
DWORD len = MultiByteToWideChar( CP_UTF8, 0, str, -1, NULL, 0 );
@@ -78,9 +75,9 @@ static inline LPWSTR dns_strdup_uw( const char *str )
return ret;
}
-static inline LPSTR dns_strdup_wa( LPCWSTR str )
+static inline char *strdup_wa( const WCHAR *str )
{
- LPSTR ret = NULL;
+ char *ret = NULL;
if (str)
{
DWORD len = WideCharToMultiByte( CP_ACP, 0, str, -1, NULL, 0, NULL, NULL );
@@ -90,9 +87,9 @@ static inline LPSTR dns_strdup_wa( LPCWSTR str )
return ret;
}
-static inline char *dns_strdup_wu( LPCWSTR str )
+static inline char *strdup_wu( const WCHAR *str )
{
- LPSTR ret = NULL;
+ char *ret = NULL;
if (str)
{
DWORD len = WideCharToMultiByte( CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL );
@@ -102,30 +99,28 @@ static inline char *dns_strdup_wu( LPCWSTR str )
return ret;
}
-static inline char *dns_strdup_au( LPCSTR src )
+static inline char *strdup_au( const char *src )
{
char *dst = NULL;
- LPWSTR ret = dns_strdup_aw( src );
-
+ WCHAR *ret = strdup_aw( src );
if (ret)
{
- dst = dns_strdup_wu( ret );
+ dst = strdup_wu( ret );
heap_free( ret );
}
return dst;
}
-static inline LPSTR dns_strdup_ua( const char *src )
+static inline char *strdup_ua( const char *src )
{
- LPSTR dst = NULL;
- LPWSTR ret = dns_strdup_uw( src );
-
+ char *dst = NULL;
+ WCHAR *ret = strdup_uw( src );
if (ret)
{
- dst = dns_strdup_wa( ret );
+ dst = strdup_wa( ret );
heap_free( ret );
}
return dst;
}
-const char *dns_type_to_str( unsigned short ) DECLSPEC_HIDDEN;
+const char *type_to_str( unsigned short ) DECLSPEC_HIDDEN;
diff --git a/dlls/dnsapi/name.c b/dlls/dnsapi/name.c
index c14c8a0e495..9404200e443 100644
--- a/dlls/dnsapi/name.c
+++ b/dlls/dnsapi/name.c
@@ -58,8 +58,8 @@ BOOL WINAPI DnsNameCompare_A( PCSTR name1, PCSTR name2 )
TRACE( "(%s,%s)\n", debugstr_a(name1), debugstr_a(name2) );
- name1W = dns_strdup_aw( name1 );
- name2W = dns_strdup_aw( name2 );
+ name1W = strdup_aw( name1 );
+ name2W = strdup_aw( name2 );
ret = DnsNameCompare_W( name1W, name2W );
@@ -112,7 +112,7 @@ DNS_STATUS WINAPI DnsValidateName_A( PCSTR name, DNS_NAME_FORMAT format )
TRACE( "(%s, %d)\n", debugstr_a(name), format );
- nameW = dns_strdup_aw( name );
+ nameW = strdup_aw( name );
ret = DnsValidateName_W( nameW, format );
heap_free( nameW );
@@ -130,7 +130,7 @@ DNS_STATUS WINAPI DnsValidateName_UTF8( PCSTR name, DNS_NAME_FORMAT format )
TRACE( "(%s, %d)\n", debugstr_a(name), format );
- nameW = dns_strdup_uw( name );
+ nameW = strdup_uw( name );
ret = DnsValidateName_W( nameW, format );
heap_free( nameW );
diff --git a/dlls/dnsapi/query.c b/dlls/dnsapi/query.c
index 4c7a65eb264..3bef65e9731 100644
--- a/dlls/dnsapi/query.c
+++ b/dlls/dnsapi/query.c
@@ -61,7 +61,7 @@ static void initialise_resolver( void )
res_init();
}
-static const char *dns_section_to_str( ns_sect section )
+static const char *section_to_str( ns_sect section )
{
switch (section)
{
@@ -79,7 +79,7 @@ static const char *dns_section_to_str( ns_sect section )
}
}
-static unsigned long dns_map_options( DWORD options )
+static unsigned long map_options( DWORD options )
{
unsigned long ret = 0;
@@ -118,7 +118,7 @@ static unsigned long dns_map_options( DWORD options )
return ret;
}
-static DNS_STATUS dns_map_error( int error )
+static DNS_STATUS map_error( int error )
{
switch (error)
{
@@ -139,7 +139,7 @@ static DNS_STATUS dns_map_error( int error )
}
}
-static DNS_STATUS dns_map_h_errno( int error )
+static DNS_STATUS map_h_errno( int error )
{
switch (error)
{
@@ -156,7 +156,7 @@ static DNS_STATUS dns_map_h_errno( int error )
}
}
-static char *dns_dname_from_msg( ns_msg msg, const unsigned char *pos )
+static char *dname_from_msg( ns_msg msg, const unsigned char *pos )
{
int len;
char *str, dname[NS_MAXDNAME] = ".";
@@ -170,7 +170,7 @@ static char *dns_dname_from_msg( ns_msg msg, const unsigned char *pos )
return str;
}
-static char *dns_str_from_rdata( const unsigned char *rdata )
+static char *str_from_rdata( const unsigned char *rdata )
{
char *str;
unsigned int len = rdata[0];
@@ -184,7 +184,7 @@ static char *dns_str_from_rdata( const unsigned char *rdata )
return str;
}
-static unsigned int dns_get_record_size( const ns_rr *rr )
+static unsigned int get_record_size( const ns_rr *rr )
{
const unsigned char *pos = rr->rdata;
unsigned int num = 0, size = sizeof(DNS_RECORDA);
@@ -227,7 +227,7 @@ static unsigned int dns_get_record_size( const ns_rr *rr )
case ns_t_wks:
case 0xff01: /* WINS */
{
- FIXME( "unhandled type: %s\n", dns_type_to_str( rr->type ) );
+ FIXME( "unhandled type: %s\n", type_to_str( rr->type ) );
break;
}
default:
@@ -236,7 +236,7 @@ static unsigned int dns_get_record_size( const ns_rr *rr )
return size;
}
-static DNS_STATUS dns_copy_rdata( ns_msg msg, const ns_rr *rr, DNS_RECORDA *r, WORD *dlen )
+static DNS_STATUS copy_rdata( ns_msg msg, const ns_rr *rr, DNS_RECORDA *r, WORD *dlen )
{
DNS_STATUS ret = ERROR_SUCCESS;
const unsigned char *pos = rr->rdata;
@@ -279,13 +279,13 @@ static DNS_STATUS dns_copy_rdata( ns_msg msg, const ns_rr *rr, DNS_RECORDA *r, W
case ns_t_rp:
case ns_t_minfo:
{
- r->Data.MINFO.pNameMailbox = dns_dname_from_msg( msg, pos );
+ r->Data.MINFO.pNameMailbox = dname_from_msg( msg, pos );
if (!r->Data.MINFO.pNameMailbox) return ERROR_NOT_ENOUGH_MEMORY;
if (ns_name_skip( &pos, ns_msg_end( msg ) ) < 0)
return DNS_ERROR_BAD_PACKET;
- r->Data.MINFO.pNameErrorsMailbox = dns_dname_from_msg( msg, pos );
+ r->Data.MINFO.pNameErrorsMailbox = dname_from_msg( msg, pos );
if (!r->Data.MINFO.pNameErrorsMailbox)
{
heap_free( r->Data.MINFO.pNameMailbox );
@@ -300,7 +300,7 @@ static DNS_STATUS dns_copy_rdata( ns_msg msg, const ns_rr *rr, DNS_RECORDA *r, W
case ns_t_mx:
{
r->Data.MX.wPreference = ntohs( *(const WORD *)pos );
- r->Data.MX.pNameExchange = dns_dname_from_msg( msg, pos + sizeof(WORD) );
+ r->Data.MX.pNameExchange = dname_from_msg( msg, pos + sizeof(WORD) );
if (!r->Data.MX.pNameExchange) return ERROR_NOT_ENOUGH_MEMORY;
*dlen = sizeof(DNS_MX_DATAA);
@@ -332,7 +332,7 @@ static DNS_STATUS dns_copy_rdata( ns_msg msg, const ns_rr *rr, DNS_RECORDA *r, W
case ns_t_mr:
case ns_t_ptr:
{
- r->Data.PTR.pNameHost = dns_dname_from_msg( msg, pos );
+ r->Data.PTR.pNameHost = dname_from_msg( msg, pos );
if (!r->Data.PTR.pNameHost) return ERROR_NOT_ENOUGH_MEMORY;
*dlen = sizeof(DNS_PTR_DATAA);
@@ -340,7 +340,7 @@ static DNS_STATUS dns_copy_rdata( ns_msg msg, const ns_rr *rr, DNS_RECORDA *r, W
}
case ns_t_sig:
{
- r->Data.SIG.pNameSigner = dns_dname_from_msg( msg, pos );
+ r->Data.SIG.pNameSigner = dname_from_msg( msg, pos );
if (!r->Data.SIG.pNameSigner) return ERROR_NOT_ENOUGH_MEMORY;
if (ns_name_skip( &pos, ns_msg_end( msg ) ) < 0)
@@ -365,13 +365,13 @@ static DNS_STATUS dns_copy_rdata( ns_msg msg, const ns_rr *rr, DNS_RECORDA *r, W
}
case ns_t_soa:
{
- r->Data.SOA.pNamePrimaryServer = dns_dname_from_msg( msg, pos );
+ r->Data.SOA.pNamePrimaryServer = dname_from_msg( msg, pos );
if (!r->Data.SOA.pNamePrimaryServer) return ERROR_NOT_ENOUGH_MEMORY;
if (ns_name_skip( &pos, ns_msg_end( msg ) ) < 0)
return DNS_ERROR_BAD_PACKET;
- r->Data.SOA.pNameAdministrator = dns_dname_from_msg( msg, pos );
+ r->Data.SOA.pNameAdministrator = dname_from_msg( msg, pos );
if (!r->Data.SOA.pNameAdministrator)
{
heap_free( r->Data.SOA.pNamePrimaryServer );
@@ -396,7 +396,7 @@ static DNS_STATUS dns_copy_rdata( ns_msg msg, const ns_rr *rr, DNS_RECORDA *r, W
r->Data.SRV.wWeight = ntohs( *(const WORD *)pos ); pos += sizeof(WORD);
r->Data.SRV.wPort = ntohs( *(const WORD *)pos ); pos += sizeof(WORD);
- r->Data.SRV.pNameTarget = dns_dname_from_msg( msg, pos );
+ r->Data.SRV.pNameTarget = dname_from_msg( msg, pos );
if (!r->Data.SRV.pNameTarget) return ERROR_NOT_ENOUGH_MEMORY;
*dlen = sizeof(DNS_SRV_DATAA);
@@ -410,7 +410,7 @@ static DNS_STATUS dns_copy_rdata( ns_msg msg, const ns_rr *rr, DNS_RECORDA *r, W
i = 0;
while (pos[0] && pos < rr->rdata + rr->rdlength)
{
- r->Data.TXT.pStringArray[i] = dns_str_from_rdata( pos );
+ r->Data.TXT.pStringArray[i] = str_from_rdata( pos );
if (!r->Data.TXT.pStringArray[i])
{
while (i > 0) heap_free( r->Data.TXT.pStringArray[--i] );
@@ -432,14 +432,14 @@ static DNS_STATUS dns_copy_rdata( ns_msg msg, const ns_rr *rr, DNS_RECORDA *r, W
case 0xff01: /* WINS */
case 0xff02: /* WINSR */
default:
- FIXME( "unhandled type: %s\n", dns_type_to_str( rr->type ) );
+ FIXME( "unhandled type: %s\n", type_to_str( rr->type ) );
return DNS_ERROR_RCODE_NOT_IMPLEMENTED;
}
return ret;
}
-static DNS_STATUS dns_copy_record( ns_msg msg, ns_sect section,
+static DNS_STATUS copy_record( ns_msg msg, ns_sect section,
unsigned short num, DNS_RECORDA **recp )
{
DNS_STATUS ret;
@@ -450,10 +450,10 @@ static DNS_STATUS dns_copy_record( ns_msg msg, ns_sect section,
if (ns_parserr( &msg, section, num, &rr ) < 0)
return DNS_ERROR_BAD_PACKET;
- if (!(record = heap_alloc_zero( dns_get_record_size( &rr ) )))
+ if (!(record = heap_alloc_zero( get_record_size( &rr ) )))
return ERROR_NOT_ENOUGH_MEMORY;
- record->pName = dns_strdup_u( rr.name );
+ record->pName = strdup_u( rr.name );
if (!record->pName)
{
heap_free( record );
@@ -465,7 +465,7 @@ static DNS_STATUS dns_copy_record( ns_msg msg, ns_sect section,
record->Flags.S.CharSet = DnsCharSetUtf8;
record->dwTtl = rr.ttl;
- if ((ret = dns_copy_rdata( msg, &rr, record, &dlen )))
+ if ((ret = copy_rdata( msg, &rr, record, &dlen )))
{
heap_free( record->pName );
heap_free( record );
@@ -475,13 +475,13 @@ static DNS_STATUS dns_copy_record( ns_msg msg, ns_sect section,
*recp = record;
TRACE( "found %s record in %s section\n",
- dns_type_to_str( rr.type ), dns_section_to_str( section ) );
+ type_to_str( rr.type ), section_to_str( section ) );
return ERROR_SUCCESS;
}
#define DEFAULT_TTL 1200
-static DNS_STATUS dns_do_query_netbios( PCSTR name, DNS_RECORDA **recp )
+static DNS_STATUS do_query_netbios( PCSTR name, DNS_RECORDA **recp )
{
NCB ncb;
UCHAR ret;
@@ -520,7 +520,7 @@ static DNS_STATUS dns_do_query_netbios( PCSTR name, DNS_RECORDA **recp )
}
else
{
- record->pName = dns_strdup_u( name );
+ record->pName = strdup_u( name );
if (!record->pName)
{
status = ERROR_NOT_ENOUGH_MEMORY;
@@ -553,7 +553,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 set_serverlist( const IP4_ARRAY *addrs )
{
int i;
@@ -572,7 +572,7 @@ static DNS_STATUS dns_set_serverlist( const IP4_ARRAY *addrs )
return ERROR_SUCCESS;
}
-static DNS_STATUS dns_get_serverlist( PIP4_ARRAY addrs, PDWORD len )
+static DNS_STATUS get_serverlist( PIP4_ARRAY addrs, PDWORD len )
{
unsigned int size;
int i;
@@ -593,7 +593,7 @@ static DNS_STATUS dns_get_serverlist( PIP4_ARRAY addrs, PDWORD len )
}
#define DNS_MAX_PACKET_SIZE 4096
-static DNS_STATUS dns_do_query( PCSTR name, WORD type, DWORD options, PDNS_RECORDA *result )
+static DNS_STATUS do_query( PCSTR name, WORD type, DWORD options, PDNS_RECORDA *result )
{
DNS_STATUS ret = DNS_ERROR_RCODE_NOT_IMPLEMENTED;
@@ -611,7 +611,7 @@ static DNS_STATUS dns_do_query( PCSTR name, WORD type, DWORD options, PDNS_RECOR
len = res_query( name, ns_c_in, type, answer, sizeof(answer) );
if (len < 0)
{
- ret = dns_map_h_errno( h_errno );
+ ret = map_h_errno( h_errno );
goto exit;
}
@@ -624,7 +624,7 @@ static DNS_STATUS dns_do_query( PCSTR name, WORD type, DWORD options, PDNS_RECOR
#define RCODE_MASK 0x0f
if ((msg._flags & RCODE_MASK) != ns_r_noerror)
{
- ret = dns_map_error( msg._flags & RCODE_MASK );
+ ret = map_error( msg._flags & RCODE_MASK );
goto exit;
}
@@ -632,7 +632,7 @@ static DNS_STATUS dns_do_query( PCSTR name, WORD type, DWORD options, PDNS_RECOR
{
for (num = 0; num < ns_msg_count( msg, sections[i] ); num++)
{
- ret = dns_copy_record( msg, sections[i], num, &record );
+ ret = copy_record( msg, sections[i], num, &record );
if (ret != ERROR_SUCCESS) goto exit;
DNS_RRSET_ADD( rrset, (DNS_RECORD *)record );
@@ -658,7 +658,7 @@ static const char *debugstr_query_request(const DNS_QUERY_REQUEST *req)
return "(null)";
return wine_dbg_sprintf("{%d %s %s %x%08x %p %d %p %p}", req->Version,
- debugstr_w(req->QueryName), dns_type_to_str(req->QueryType),
+ debugstr_w(req->QueryName), type_to_str(req->QueryType),
(UINT32)(req->QueryOptions>>32u), (UINT32)req->QueryOptions, req->pDnsServerList,
req->InterfaceIndex, req->pQueryCompletionCallback, req->pQueryContext);
}
@@ -684,13 +684,13 @@ DNS_STATUS WINAPI DnsQuery_A( PCSTR name, WORD type, DWORD options, PVOID server
DNS_RECORDW *resultW;
DNS_STATUS status;
- TRACE( "(%s,%s,0x%08x,%p,%p,%p)\n", debugstr_a(name), dns_type_to_str( type ),
+ TRACE( "(%s,%s,0x%08x,%p,%p,%p)\n", debugstr_a(name), type_to_str( type ),
options, servers, result, reserved );
if (!name || !result)
return ERROR_INVALID_PARAMETER;
- nameW = dns_strdup_aw( name );
+ nameW = strdup_aw( name );
if (!nameW) return ERROR_NOT_ENOUGH_MEMORY;
status = DnsQuery_W( nameW, type, options, servers, &resultW, reserved );
@@ -718,24 +718,24 @@ DNS_STATUS WINAPI DnsQuery_UTF8( PCSTR name, WORD type, DWORD options, PVOID ser
DNS_STATUS ret = DNS_ERROR_RCODE_NOT_IMPLEMENTED;
#ifdef HAVE_RESOLV
- TRACE( "(%s,%s,0x%08x,%p,%p,%p)\n", debugstr_a(name), dns_type_to_str( type ),
+ TRACE( "(%s,%s,0x%08x,%p,%p,%p)\n", debugstr_a(name), type_to_str( type ),
options, servers, result, reserved );
if (!name || !result)
return ERROR_INVALID_PARAMETER;
initialise_resolver();
- _res.options |= dns_map_options( options );
+ _res.options |= map_options( options );
- if ((ret = dns_set_serverlist( servers ))) return ret;
+ if ((ret = set_serverlist( servers ))) return ret;
- ret = dns_do_query( name, type, options, result );
+ ret = do_query( name, type, options, result );
if (ret == DNS_ERROR_RCODE_NAME_ERROR && type == DNS_TYPE_A &&
!(options & DNS_QUERY_NO_NETBT))
{
TRACE( "dns lookup failed, trying netbios query\n" );
- ret = dns_do_query_netbios( name, result );
+ ret = do_query_netbios( name, result );
}
#endif
@@ -753,13 +753,13 @@ DNS_STATUS WINAPI DnsQuery_W( PCWSTR name, WORD type, DWORD options, PVOID serve
DNS_RECORDA *resultA;
DNS_STATUS status;
- TRACE( "(%s,%s,0x%08x,%p,%p,%p)\n", debugstr_w(name), dns_type_to_str( type ),
+ TRACE( "(%s,%s,0x%08x,%p,%p,%p)\n", debugstr_w(name), type_to_str( type ),
options, servers, result, reserved );
if (!name || !result)
return ERROR_INVALID_PARAMETER;
- nameU = dns_strdup_wu( name );
+ nameU = strdup_wu( name );
if (!nameU) return ERROR_NOT_ENOUGH_MEMORY;
status = DnsQuery_UTF8( nameU, type, options, servers, &resultA, reserved );
@@ -777,7 +777,7 @@ DNS_STATUS WINAPI DnsQuery_W( PCWSTR name, WORD type, DWORD options, PVOID serve
return status;
}
-static DNS_STATUS dns_get_hostname_a( COMPUTER_NAME_FORMAT format,
+static DNS_STATUS get_hostname_a( COMPUTER_NAME_FORMAT format,
PSTR buffer, PDWORD len )
{
char name[256];
@@ -796,7 +796,7 @@ static DNS_STATUS dns_get_hostname_a( COMPUTER_NAME_FORMAT format,
return ERROR_SUCCESS;
}
-static DNS_STATUS dns_get_hostname_w( COMPUTER_NAME_FORMAT format,
+static DNS_STATUS get_hostname_w( COMPUTER_NAME_FORMAT format,
PWSTR buffer, PDWORD len )
{
WCHAR name[256];
@@ -835,7 +835,7 @@ DNS_STATUS WINAPI DnsQueryConfig( DNS_CONFIG_TYPE config, DWORD flag, PCWSTR ada
{
#ifdef HAVE_RESOLV
initialise_resolver();
- ret = dns_get_serverlist( buffer, len );
+ ret = get_serverlist( buffer, len );
break;
#else
WARN( "compiled without resolver support\n" );
@@ -844,24 +844,24 @@ DNS_STATUS WINAPI DnsQueryConfig( DNS_CONFIG_TYPE config, DWORD flag, PCWSTR ada
}
case DnsConfigHostName_A:
case DnsConfigHostName_UTF8:
- return dns_get_hostname_a( ComputerNameDnsHostname, buffer, len );
+ return get_hostname_a( ComputerNameDnsHostname, buffer, len );
case DnsConfigFullHostName_A:
case DnsConfigFullHostName_UTF8:
- return dns_get_hostname_a( ComputerNameDnsFullyQualified, buffer, len );
+ return get_hostname_a( ComputerNameDnsFullyQualified, buffer, len );
case DnsConfigPrimaryDomainName_A:
case DnsConfigPrimaryDomainName_UTF8:
- return dns_get_hostname_a( ComputerNameDnsDomain, buffer, len );
+ return get_hostname_a( ComputerNameDnsDomain, buffer, len );
case DnsConfigHostName_W:
- return dns_get_hostname_w( ComputerNameDnsHostname, buffer, len );
+ return get_hostname_w( ComputerNameDnsHostname, buffer, len );
case DnsConfigFullHostName_W:
- return dns_get_hostname_w( ComputerNameDnsFullyQualified, buffer, len );
+ return get_hostname_w( ComputerNameDnsFullyQualified, buffer, len );
case DnsConfigPrimaryDomainName_W:
- return dns_get_hostname_w( ComputerNameDnsDomain, buffer, len );
+ return get_hostname_w( ComputerNameDnsDomain, buffer, len );
case DnsConfigAdapterDomainName_A:
case DnsConfigAdapterDomainName_W:
diff --git a/dlls/dnsapi/record.c b/dlls/dnsapi/record.c
index dc6a1137d95..51d9e8fd2d7 100644
--- a/dlls/dnsapi/record.c
+++ b/dlls/dnsapi/record.c
@@ -47,7 +47,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(dnsapi);
-const char *dns_type_to_str( unsigned short type )
+const char *type_to_str( unsigned short type )
{
switch (type)
{
@@ -113,7 +113,7 @@ const char *dns_type_to_str( unsigned short type )
}
}
-static int dns_strcmpX( LPCVOID str1, LPCVOID str2, BOOL wide )
+static int strcmpX( LPCVOID str1, LPCVOID str2, BOOL wide )
{
if (wide)
return lstrcmpiW( str1, str2 );
@@ -141,7 +141,7 @@ BOOL WINAPI DnsRecordCompare( PDNS_RECORD r1, PDNS_RECORD r2 )
r1->dwReserved != r2->dwReserved) return FALSE;
wide = (r1->Flags.S.CharSet == DnsCharSetUnicode || r1->Flags.S.CharSet == DnsCharSetUnknown);
- if (dns_strcmpX( r1->pName, r2->pName, wide )) return FALSE;
+ if (strcmpX( r1->pName, r2->pName, wide )) return FALSE;
switch (r1->wType)
{
@@ -158,9 +158,9 @@ BOOL WINAPI DnsRecordCompare( PDNS_RECORD r1, PDNS_RECORD r2 )
r1->Data.SOA.dwExpire != r2->Data.SOA.dwExpire ||
r1->Data.SOA.dwDefaultTtl != r2->Data.SOA.dwDefaultTtl)
return FALSE;
- if (dns_strcmpX( r1->Data.SOA.pNamePrimaryServer,
+ if (strcmpX( r1->Data.SOA.pNamePrimaryServer,
r2->Data.SOA.pNamePrimaryServer, wide ) ||
- dns_strcmpX( r1->Data.SOA.pNameAdministrator,
+ strcmpX( r1->Data.SOA.pNameAdministrator,
r2->Data.SOA.pNameAdministrator, wide ))
return FALSE;
break;
@@ -174,16 +174,16 @@ BOOL WINAPI DnsRecordCompare( PDNS_RECORD r1, PDNS_RECORD r2 )
case DNS_TYPE_MG:
case DNS_TYPE_MR:
{
- if (dns_strcmpX( r1->Data.PTR.pNameHost,
+ if (strcmpX( r1->Data.PTR.pNameHost,
r2->Data.PTR.pNameHost, wide )) return FALSE;
break;
}
case DNS_TYPE_MINFO:
case DNS_TYPE_RP:
{
- if (dns_strcmpX( r1->Data.MINFO.pNameMailbox,
+ if (strcmpX( r1->Data.MINFO.pNameMailbox,
r2->Data.MINFO.pNameMailbox, wide ) ||
- dns_strcmpX( r1->Data.MINFO.pNameErrorsMailbox,
+ strcmpX( r1->Data.MINFO.pNameErrorsMailbox,
r2->Data.MINFO.pNameErrorsMailbox, wide ))
return FALSE;
break;
@@ -194,7 +194,7 @@ BOOL WINAPI DnsRecordCompare( PDNS_RECORD r1, PDNS_RECORD r2 )
{
if (r1->Data.MX.wPreference != r2->Data.MX.wPreference)
return FALSE;
- if (dns_strcmpX( r1->Data.MX.pNameExchange,
+ if (strcmpX( r1->Data.MX.pNameExchange,
r2->Data.MX.pNameExchange, wide ))
return FALSE;
break;
@@ -208,7 +208,7 @@ BOOL WINAPI DnsRecordCompare( PDNS_RECORD r1, PDNS_RECORD r2 )
return FALSE;
for (i = 0; i < r1->Data.TXT.dwStringCount; i++)
{
- if (dns_strcmpX( r1->Data.TXT.pStringArray[i],
+ if (strcmpX( r1->Data.TXT.pStringArray[i],
r2->Data.TXT.pStringArray[i], wide ))
return FALSE;
}
@@ -255,7 +255,7 @@ BOOL WINAPI DnsRecordCompare( PDNS_RECORD r1, PDNS_RECORD r2 )
}
case DNS_TYPE_SIG:
{
- if (dns_strcmpX( r1->Data.SIG.pNameSigner,
+ if (strcmpX( r1->Data.SIG.pNameSigner,
r2->Data.SIG.pNameSigner, wide ))
return FALSE;
if (r1->Data.SIG.wTypeCovered != r2->Data.SIG.wTypeCovered ||
@@ -284,7 +284,7 @@ BOOL WINAPI DnsRecordCompare( PDNS_RECORD r1, PDNS_RECORD r2 )
}
case DNS_TYPE_NXT:
{
- if (dns_strcmpX( r1->Data.NXT.pNameNext,
+ if (strcmpX( r1->Data.NXT.pNameNext,
r2->Data.NXT.pNameNext, wide )) return FALSE;
if (r1->Data.NXT.wNumTypes != r2->Data.NXT.wNumTypes) return FALSE;
if (memcmp( r1->Data.NXT.wTypes, r2->Data.NXT.wTypes,
@@ -294,7 +294,7 @@ BOOL WINAPI DnsRecordCompare( PDNS_RECORD r1, PDNS_RECORD r2 )
}
case DNS_TYPE_SRV:
{
- if (dns_strcmpX( r1->Data.SRV.pNameTarget,
+ if (strcmpX( r1->Data.SRV.pNameTarget,
r2->Data.SRV.pNameTarget, wide )) return FALSE;
if (r1->Data.SRV.wPriority != r2->Data.SRV.wPriority ||
r1->Data.SRV.wWeight != r2->Data.SRV.wWeight ||
@@ -304,7 +304,7 @@ BOOL WINAPI DnsRecordCompare( PDNS_RECORD r1, PDNS_RECORD r2 )
}
case DNS_TYPE_TKEY:
{
- if (dns_strcmpX( r1->Data.TKEY.pNameAlgorithm,
+ if (strcmpX( r1->Data.TKEY.pNameAlgorithm,
r2->Data.TKEY.pNameAlgorithm, wide ))
return FALSE;
if (r1->Data.TKEY.dwCreateTime != r2->Data.TKEY.dwCreateTime ||
@@ -326,7 +326,7 @@ BOOL WINAPI DnsRecordCompare( PDNS_RECORD r1, PDNS_RECORD r2 )
}
case DNS_TYPE_TSIG:
{
- if (dns_strcmpX( r1->Data.TSIG.pNameAlgorithm,
+ if (strcmpX( r1->Data.TSIG.pNameAlgorithm,
r2->Data.TSIG.pNameAlgorithm, wide ))
return FALSE;
if (r1->Data.TSIG.i64CreateTime != r2->Data.TSIG.i64CreateTime ||
@@ -364,19 +364,19 @@ BOOL WINAPI DnsRecordCompare( PDNS_RECORD r1, PDNS_RECORD r2 )
r1->Data.WINSR.dwLookupTimeout != r2->Data.WINSR.dwLookupTimeout ||
r1->Data.WINSR.dwCacheTimeout != r2->Data.WINSR.dwCacheTimeout)
return FALSE;
- if (dns_strcmpX( r1->Data.WINSR.pNameResultDomain,
+ if (strcmpX( r1->Data.WINSR.pNameResultDomain,
r2->Data.WINSR.pNameResultDomain, wide ))
return FALSE;
break;
}
default:
- FIXME( "unknown type: %s\n", dns_type_to_str( r1->wType ) );
+ FIXME( "unknown type: %s\n", type_to_str( r1->wType ) );
return FALSE;
}
return TRUE;
}
-static LPVOID dns_strcpyX( LPCVOID src, DNS_CHARSET in, DNS_CHARSET out )
+static LPVOID strcpyX( LPCVOID src, DNS_CHARSET in, DNS_CHARSET out )
{
switch (in)
{
@@ -384,9 +384,9 @@ static LPVOID dns_strcpyX( LPCVOID src, DNS_CHARSET in, DNS_CHARSET out )
{
switch (out)
{
- case DnsCharSetUnicode: return dns_strdup_w( src );
- case DnsCharSetUtf8: return dns_strdup_wu( src );
- case DnsCharSetAnsi: return dns_strdup_wa( src );
+ case DnsCharSetUnicode: return strdup_w( src );
+ case DnsCharSetUtf8: return strdup_wu( src );
+ case DnsCharSetAnsi: return strdup_wa( src );
default:
WARN( "unhandled target charset: %d\n", out );
break;
@@ -396,9 +396,9 @@ static LPVOID dns_strcpyX( LPCVOID src, DNS_CHARSET in, DNS_CHARSET out )
case DnsCharSetUtf8:
switch (out)
{
- case DnsCharSetUnicode: return dns_strdup_uw( src );
- case DnsCharSetUtf8: return dns_strdup_u( src );
- case DnsCharSetAnsi: return dns_strdup_ua( src );
+ case DnsCharSetUnicode: return strdup_uw( src );
+ case DnsCharSetUtf8: return strdup_u( src );
+ case DnsCharSetAnsi: return strdup_ua( src );
default:
WARN( "unhandled target charset: %d\n", out );
break;
@@ -407,9 +407,9 @@ static LPVOID dns_strcpyX( LPCVOID src, DNS_CHARSET in, DNS_CHARSET out )
case DnsCharSetAnsi:
switch (out)
{
- case DnsCharSetUnicode: return dns_strdup_aw( src );
- case DnsCharSetUtf8: return dns_strdup_au( src );
- case DnsCharSetAnsi: return dns_strdup_a( src );
+ case DnsCharSetUnicode: return strdup_aw( src );
+ case DnsCharSetUtf8: return strdup_au( src );
+ case DnsCharSetAnsi: return strdup_a( src );
default:
WARN( "unhandled target charset: %d\n", out );
break;
@@ -444,7 +444,7 @@ PDNS_RECORD WINAPI DnsRecordCopyEx( PDNS_RECORD src, DNS_CHARSET in, DNS_CHARSET
src->Flags.S.CharSet == DnsCharSetUnicode) in = src->Flags.S.CharSet;
dst->Flags.S.CharSet = out;
- dst->pName = dns_strcpyX( src->pName, in, out );
+ dst->pName = strcpyX( src->pName, in, out );
if (!dst->pName) goto error;
switch (src->wType)
@@ -456,9 +456,7 @@ PDNS_RECORD WINAPI DnsRecordCopyEx( PDNS_RECORD src, DNS_CHARSET in, DNS_CHARSET
{
for (i = 0; i < src->Data.TXT.dwStringCount; i++)
{
- dst->Data.TXT.pStringArray[i] =
- dns_strcpyX( src->Data.TXT.pStringArray[i], in, out );
-
+ dst->Data.TXT.pStringArray[i] = strcpyX( src->Data.TXT.pStringArray[i], in, out );
if (!dst->Data.TXT.pStringArray[i])
{
while (i > 0) heap_free( dst->Data.TXT.pStringArray[--i] );
@@ -470,12 +468,10 @@ PDNS_RECORD WINAPI DnsRecordCopyEx( PDNS_RECORD src, DNS_CHARSET in, DNS_CHARSET
case DNS_TYPE_MINFO:
case DNS_TYPE_RP:
{
- dst->Data.MINFO.pNameMailbox =
- dns_strcpyX( src->Data.MINFO.pNameMailbox, in, out );
+ dst->Data.MINFO.pNameMailbox = strcpyX( src->Data.MINFO.pNameMailbox, in, out );
if (!dst->Data.MINFO.pNameMailbox) goto error;
- dst->Data.MINFO.pNameErrorsMailbox =
- dns_strcpyX( src->Data.MINFO.pNameErrorsMailbox, in, out );
+ dst->Data.MINFO.pNameErrorsMailbox = strcpyX( src->Data.MINFO.pNameErrorsMailbox, in, out );
if (!dst->Data.MINFO.pNameErrorsMailbox)
{
heap_free( dst->Data.MINFO.pNameMailbox );
@@ -492,8 +488,7 @@ PDNS_RECORD WINAPI DnsRecordCopyEx( PDNS_RECORD src, DNS_CHARSET in, DNS_CHARSET
case DNS_TYPE_RT:
case DNS_TYPE_MX:
{
- dst->Data.MX.pNameExchange =
- dns_strcpyX( src->Data.MX.pNameExchange, in, out );
+ dst->Data.MX.pNameExchange = strcpyX( src->Data.MX.pNameExchange, in, out );
if (!dst->Data.MX.pNameExchange) goto error;
dst->wDataLength = sizeof(dst->Data.MX);
@@ -503,8 +498,7 @@ PDNS_RECORD WINAPI DnsRecordCopyEx( PDNS_RECORD src, DNS_CHARSET in, DNS_CHARSET
}
case DNS_TYPE_NXT:
{
- dst->Data.NXT.pNameNext =
- dns_strcpyX( src->Data.NXT.pNameNext, in, out );
+ dst->Data.NXT.pNameNext = strcpyX( src->Data.NXT.pNameNext, in, out );
if (!dst->Data.NXT.pNameNext) goto error;
dst->wDataLength = sizeof(dst->Data.NXT);
@@ -521,8 +515,7 @@ PDNS_RECORD WINAPI DnsRecordCopyEx( PDNS_RECORD src, DNS_CHARSET in, DNS_CHARSET
case DNS_TYPE_NS:
case DNS_TYPE_PTR:
{
- dst->Data.PTR.pNameHost =
- dns_strcpyX( src->Data.PTR.pNameHost, in, out );
+ dst->Data.PTR.pNameHost = strcpyX( src->Data.PTR.pNameHost, in, out );
if (!dst->Data.PTR.pNameHost) goto error;
dst->wDataLength = sizeof(dst->Data.PTR);
@@ -532,8 +525,7 @@ PDNS_RECORD WINAPI DnsRecordCopyEx( PDNS_RECORD src, DNS_CHARSET in, DNS_CHARSET
}
case DNS_TYPE_SIG:
{
- dst->Data.SIG.pNameSigner =
- dns_strcpyX( src->Data.SIG.pNameSigner, in, out );
+ dst->Data.SIG.pNameSigner = strcpyX( src->Data.SIG.pNameSigner, in, out );
if (!dst->Data.SIG.pNameSigner) goto error;
dst->wDataLength = sizeof(dst->Data.SIG);
@@ -543,12 +535,10 @@ PDNS_RECORD WINAPI DnsRecordCopyEx( PDNS_RECORD src, DNS_CHARSET in, DNS_CHARSET
}
case DNS_TYPE_SOA:
{
- dst->Data.SOA.pNamePrimaryServer =
- dns_strcpyX( src->Data.SOA.pNamePrimaryServer, in, out );
+ dst->Data.SOA.pNamePrimaryServer = strcpyX( src->Data.SOA.pNamePrimaryServer, in, out );
if (!dst->Data.SOA.pNamePrimaryServer) goto error;
- dst->Data.SOA.pNameAdministrator =
- dns_strcpyX( src->Data.SOA.pNameAdministrator, in, out );
+ dst->Data.SOA.pNameAdministrator = strcpyX( src->Data.SOA.pNameAdministrator, in, out );
if (!dst->Data.SOA.pNameAdministrator)
{
heap_free( dst->Data.SOA.pNamePrimaryServer );
@@ -563,8 +553,7 @@ PDNS_RECORD WINAPI DnsRecordCopyEx( PDNS_RECORD src, DNS_CHARSET in, DNS_CHARSET
}
case DNS_TYPE_SRV:
{
- dst->Data.SRV.pNameTarget =
- dns_strcpyX( src->Data.SRV.pNameTarget, in, out );
+ dst->Data.SRV.pNameTarget = strcpyX( src->Data.SRV.pNameTarget, in, out );
if (!dst->Data.SRV.pNameTarget) goto error;
dst->wDataLength = sizeof(dst->Data.SRV);
--
2.30.2
1
0
March 30, 2021
These functions have been exported since glibc 2.9.
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/dnsapi/Makefile.in | 2 -
dlls/dnsapi/dnsapi.h | 7 -
dlls/dnsapi/ns_name.c | 313 ----------------------------------------
dlls/dnsapi/ns_parse.c | 210 ---------------------------
dlls/dnsapi/query.c | 14 +-
5 files changed, 7 insertions(+), 539 deletions(-)
delete mode 100644 dlls/dnsapi/ns_name.c
delete mode 100644 dlls/dnsapi/ns_parse.c
diff --git a/dlls/dnsapi/Makefile.in b/dlls/dnsapi/Makefile.in
index 36552967be0..d1f66723fc6 100644
--- a/dlls/dnsapi/Makefile.in
+++ b/dlls/dnsapi/Makefile.in
@@ -6,8 +6,6 @@ EXTRALIBS = $(RESOLV_LIBS)
C_SRCS = \
main.c \
name.c \
- ns_name.c \
- ns_parse.c \
query.c \
record.c
diff --git a/dlls/dnsapi/dnsapi.h b/dlls/dnsapi/dnsapi.h
index 0b679731e91..510555698c7 100644
--- a/dlls/dnsapi/dnsapi.h
+++ b/dlls/dnsapi/dnsapi.h
@@ -129,10 +129,3 @@ static inline LPSTR dns_strdup_ua( const char *src )
}
const char *dns_type_to_str( unsigned short ) DECLSPEC_HIDDEN;
-
-#ifdef HAVE_RESOLV
-int dns_ns_initparse( const u_char *, int, ns_msg * ) DECLSPEC_HIDDEN;
-int dns_ns_parserr( ns_msg *, ns_sect, int, ns_rr * ) DECLSPEC_HIDDEN;
-int dns_ns_name_skip( const u_char **, const u_char * ) DECLSPEC_HIDDEN;
-int dns_ns_name_uncompress( const u_char *, const u_char *, const u_char *, char *, size_t ) DECLSPEC_HIDDEN;
-#endif
diff --git a/dlls/dnsapi/ns_name.c b/dlls/dnsapi/ns_name.c
deleted file mode 100644
index 994aef94459..00000000000
--- a/dlls/dnsapi/ns_name.c
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * Copyright (c) 1996,1999 by Internet Software Consortium.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
- * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
- * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
- * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- */
-
-#include "config.h"
-
-#ifdef HAVE_RESOLV
-
-#include <sys/types.h>
-
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#ifdef HAVE_ARPA_NAMESER_H
-# include <arpa/nameser.h>
-#endif
-
-#include <ctype.h>
-#include <errno.h>
-#ifdef HAVE_RESOLV_H
-# include <resolv.h>
-#endif
-#include <string.h>
-
-/* Data. */
-
-static const char digits[] = "0123456789";
-
-/* Private. */
-
-/*
- * special(ch)
- * Thinking in noninternationalized USASCII (per the DNS spec),
- * is this character special ("in need of quoting") ?
- * return:
- * boolean.
- */
-static int
-special(int ch) {
- switch (ch) {
- case 0x22: /* '"' */
- case 0x2E: /* '.' */
- case 0x3B: /* ';' */
- case 0x5C: /* '\\' */
- /* Special modifiers in zone files. */
- case 0x40: /* '@' */
- case 0x24: /* '$' */
- return (1);
- default:
- return (0);
- }
-}
-
-/*
- * printable(ch)
- * Thinking in noninternationalized USASCII (per the DNS spec),
- * is this character visible and not a space when printed ?
- * return:
- * boolean.
- */
-static int
-printable(int ch) {
- return (ch > 0x20 && ch < 0x7f);
-}
-
-/* Public. */
-
-/*
- * dns_ns_name_ntop(src, dst, dstsiz)
- * Convert an encoded domain name to printable ascii as per RFC1035.
- * return:
- * Number of bytes written to buffer, or -1 (with errno set)
- * notes:
- * The root is returned as "."
- * All other domains are returned in non absolute form
- */
-static int
-dns_ns_name_ntop(const u_char *src, char *dst, size_t dstsiz) {
- const u_char *cp;
- char *dn, *eom;
- u_char c;
- u_int n;
-
- cp = src;
- dn = dst;
- eom = dst + dstsiz;
-
- while ((n = *cp++) != 0) {
- if ((n & NS_CMPRSFLGS) != 0 && n != 0x41) {
- /* Some kind of compression pointer. */
- return (-1);
- }
- if (dn != dst) {
- if (dn >= eom) {
- return (-1);
- }
- *dn++ = '.';
- }
-
- if (n == 0x41) {
- n = *cp++ / 8;
- if (dn + n * 2 + 4 >= eom) {
- return (-1);
- }
- *dn++ = '\\';
- *dn++ = '[';
- *dn++ = 'x';
-
- while (n-- > 0) {
- unsigned u;
- c = *cp++;
- u = c >> 4;
- *dn++ = u > 9 ? 'a' + u - 10 : '0' + u;
- u = c & 0xf;
- *dn++ = u > 9 ? 'a' + u - 10 : '0' + u;
- }
-
- *dn++ = ']';
- continue;
- }
-
- if (dn + n >= eom) {
- return (-1);
- }
- while (n-- > 0) {
- c = *cp++;
- if (special(c)) {
- if (dn + 1 >= eom) {
- return (-1);
- }
- *dn++ = '\\';
- *dn++ = (char)c;
- } else if (!printable(c)) {
- if (dn + 3 >= eom) {
- return (-1);
- }
- *dn++ = '\\';
- *dn++ = digits[c / 100];
- *dn++ = digits[(c % 100) / 10];
- *dn++ = digits[c % 10];
- } else {
- if (dn >= eom) {
- return (-1);
- }
- *dn++ = (char)c;
- }
- }
- }
- if (dn == dst) {
- if (dn >= eom) {
- return (-1);
- }
- *dn++ = '.';
- }
- if (dn >= eom) {
- return (-1);
- }
- *dn++ = '\0';
- return (dn - dst);
-}
-
-
-/*
- * dns_ns_name_unpack(msg, eom, src, dst, dstsiz)
- * Unpack a domain name from a message, source may be compressed.
- * return:
- * -1 if it fails, or consumed octets if it succeeds.
- */
-static int
-dns_ns_name_unpack(const u_char *msg, const u_char *eom, const u_char *src,
- u_char *dst, size_t dstsiz)
-{
- const u_char *srcp, *dstlim;
- u_char *dstp;
- int n, len, checked;
-
- len = -1;
- checked = 0;
- dstp = dst;
- srcp = src;
- dstlim = dst + dstsiz;
- if (srcp < msg || srcp >= eom) {
- return (-1);
- }
- /* Fetch next label in domain name. */
- while ((n = *srcp++) != 0) {
- /* Check for indirection. */
- switch (n & NS_CMPRSFLGS) {
- case 0x40:
- if (n == 0x41) {
- if (dstp + 1 >= dstlim) {
- return (-1);
- }
- *dstp++ = 0x41;
- n = *srcp++ / 8;
- ++checked;
- } else {
- return (-1); /* flag error */
- }
- /* FALLTHROUGH */
- case 0:
- /* Limit checks. */
- if (dstp + n + 1 >= dstlim || srcp + n >= eom) {
- return (-1);
- }
- checked += n + 1;
- dstp = memcpy(dstp, srcp - 1, n + 1);
- dstp += n + 1;
- srcp += n;
- break;
-
- case NS_CMPRSFLGS:
- if (srcp >= eom) {
- return (-1);
- }
- if (len < 0)
- len = srcp - src + 1;
- srcp = msg + (((n & 0x3f) << 8) | (*srcp & 0xff));
- if (srcp < msg || srcp >= eom) { /* Out of range. */
- return (-1);
- }
- checked += 2;
- /*
- * Check for loops in the compressed name;
- * if we've looked at the whole message,
- * there must be a loop.
- */
- if (checked >= eom - msg) {
- return (-1);
- }
- break;
-
- default:
- return (-1); /* flag error */
- }
- }
- *dstp = '\0';
- if (len < 0)
- len = srcp - src;
- return (len);
-}
-
-
-/*
- * dns_ns_name_uncompress(msg, eom, src, dst, dstsiz)
- * Expand compressed domain name to presentation format.
- * return:
- * Number of bytes read out of `src', or -1 (with errno set).
- * note:
- * Root domain returns as "." not "".
- */
-int
-dns_ns_name_uncompress(const u_char *msg, const u_char *eom, const u_char *src,
- char *dst, size_t dstsiz)
-{
- u_char tmp[NS_MAXCDNAME];
- int n;
-
- if ((n = dns_ns_name_unpack(msg, eom, src, tmp, sizeof tmp)) == -1)
- return (-1);
- if (dns_ns_name_ntop(tmp, dst, dstsiz) == -1)
- return (-1);
- return (n);
-}
-
-
-/*
- * dns_ns_name_skip(ptrptr, eom)
- * Advance *ptrptr to skip over the compressed name it points at.
- * return:
- * 0 on success, -1 (with errno set) on failure.
- */
-int
-dns_ns_name_skip(const u_char **ptrptr, const u_char *eom) {
- const u_char *cp;
- u_int n;
-
- cp = *ptrptr;
- while (cp < eom && (n = *cp++) != 0) {
- /* Check for indirection. */
- switch (n & NS_CMPRSFLGS) {
- case 0: /* normal case, n == len */
- cp += n;
- continue;
- case NS_CMPRSFLGS: /* indirection */
- cp++;
- break;
- default: /* illegal type */
- return (-1);
- }
- break;
- }
- if (cp > eom) {
- return (-1);
- }
- *ptrptr = cp;
- return (0);
-}
-
-#endif /* HAVE_RESOLV */
diff --git a/dlls/dnsapi/ns_parse.c b/dlls/dnsapi/ns_parse.c
deleted file mode 100644
index df4933a82ad..00000000000
--- a/dlls/dnsapi/ns_parse.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright (c) 1996,1999 by Internet Software Consortium.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
- * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
- * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
- * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- */
-
-#include "config.h"
-
-#ifdef HAVE_RESOLV
-
-#include <sys/types.h>
-
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#ifdef HAVE_ARPA_NAMESER_H
-# include <arpa/nameser.h>
-#endif
-
-#include <errno.h>
-#ifdef HAVE_RESOLV_H
-# include <resolv.h>
-#endif
-#include <stdarg.h>
-#include <string.h>
-
-#include "windef.h"
-#include "winbase.h"
-#include "winnls.h"
-
-#include "dnsapi.h"
-
-/* Forward. */
-
-static void setsection(ns_msg *msg, ns_sect sect);
-
-/* Macros. */
-
-#define RETERR(err) do { return (-1); } while (0)
-
-#ifdef HAVE_NS_MSG__MSG_PTR
-# define NS_PTR(ns_msg) ((ns_msg)->_msg_ptr)
-#else
-# define NS_PTR(ns_msg) ((ns_msg)->_ptr)
-#endif
-
-#define DNS_NS_GET16(s, cp) do { \
- register const u_char *t_cp = (cp); \
- (s) = ((WORD)t_cp[0] << 8) \
- | ((WORD)t_cp[1]) \
- ; \
- (cp) += NS_INT16SZ; \
-} while (0)
-
-#define DNS_NS_GET32(l, cp) do { \
- register const u_char *t_cp = (cp); \
- (l) = ((DWORD)t_cp[0] << 24) \
- | ((DWORD)t_cp[1] << 16) \
- | ((DWORD)t_cp[2] << 8) \
- | ((DWORD)t_cp[3]) \
- ; \
- (cp) += NS_INT32SZ; \
-} while (0)
-
-/* Public. */
-
-static int
-dns_ns_skiprr(const u_char *ptr, const u_char *eom, ns_sect section, int count) {
- const u_char *optr = ptr;
-
- while (count-- > 0) {
- int rdlength;
-
- if (dns_ns_name_skip(&ptr, eom) < 0)
- RETERR(EMSGSIZE);
- ptr += NS_INT16SZ/*Type*/ + NS_INT16SZ/*Class*/;
- if (section != ns_s_qd) {
- if (ptr + NS_INT32SZ + NS_INT16SZ > eom)
- RETERR(EMSGSIZE);
- ptr += NS_INT32SZ/*TTL*/;
- DNS_NS_GET16(rdlength, ptr);
- ptr += rdlength/*RData*/;
- }
- }
- if (ptr > eom)
- RETERR(EMSGSIZE);
- return (ptr - optr);
-}
-
-int
-dns_ns_initparse(const u_char *msg, int msglen, ns_msg *handle) {
- const u_char *eom = msg + msglen;
- int i;
-
- memset(handle, 0x5e, sizeof *handle);
- handle->_msg = msg;
- handle->_eom = eom;
- if (msg + NS_INT16SZ > eom)
- RETERR(EMSGSIZE);
- DNS_NS_GET16(handle->_id, msg);
- if (msg + NS_INT16SZ > eom)
- RETERR(EMSGSIZE);
- DNS_NS_GET16(handle->_flags, msg);
- for (i = 0; i < ns_s_max; i++) {
- if (msg + NS_INT16SZ > eom)
- RETERR(EMSGSIZE);
- DNS_NS_GET16(handle->_counts[i], msg);
- }
- for (i = 0; i < ns_s_max; i++)
- if (handle->_counts[i] == 0)
- handle->_sections[i] = NULL;
- else {
- int b = dns_ns_skiprr(msg, eom, (ns_sect)i,
- handle->_counts[i]);
-
- if (b < 0)
- return (-1);
- handle->_sections[i] = msg;
- msg += b;
- }
- if (msg != eom)
- RETERR(EMSGSIZE);
- setsection(handle, ns_s_max);
- return (0);
-}
-
-int
-dns_ns_parserr(ns_msg *handle, ns_sect section, int rrnum, ns_rr *rr) {
- int b;
-
- /* Make section right. */
- if (section >= ns_s_max)
- RETERR(ENODEV);
- if (section != handle->_sect)
- setsection(handle, section);
-
- /* Make rrnum right. */
- if (rrnum == -1)
- rrnum = handle->_rrnum;
- if (rrnum < 0 || rrnum >= handle->_counts[(int)section])
- RETERR(ENODEV);
- if (rrnum < handle->_rrnum)
- setsection(handle, section);
- if (rrnum > handle->_rrnum) {
- b = dns_ns_skiprr(NS_PTR(handle), handle->_eom, section,
- rrnum - handle->_rrnum);
-
- if (b < 0)
- return (-1);
- NS_PTR(handle) += b;
- handle->_rrnum = rrnum;
- }
-
- /* Do the parse. */
- b = dn_expand(handle->_msg, handle->_eom,
- NS_PTR(handle), rr->name, NS_MAXDNAME);
- if (b < 0)
- return (-1);
- NS_PTR(handle) += b;
- if (NS_PTR(handle) + NS_INT16SZ + NS_INT16SZ > handle->_eom)
- RETERR(EMSGSIZE);
- DNS_NS_GET16(rr->type, NS_PTR(handle));
- DNS_NS_GET16(rr->rr_class, NS_PTR(handle));
- if (section == ns_s_qd) {
- rr->ttl = 0;
- rr->rdlength = 0;
- rr->rdata = NULL;
- } else {
- if (NS_PTR(handle) + NS_INT32SZ + NS_INT16SZ > handle->_eom)
- RETERR(EMSGSIZE);
- DNS_NS_GET32(rr->ttl, NS_PTR(handle));
- DNS_NS_GET16(rr->rdlength, NS_PTR(handle));
- if (NS_PTR(handle) + rr->rdlength > handle->_eom)
- RETERR(EMSGSIZE);
- rr->rdata = NS_PTR(handle);
- NS_PTR(handle) += rr->rdlength;
- }
- if (++handle->_rrnum > handle->_counts[(int)section])
- setsection(handle, (ns_sect)((int)section + 1));
-
- /* All done. */
- return (0);
-}
-
-/* Private. */
-
-static void
-setsection(ns_msg *msg, ns_sect sect) {
- msg->_sect = sect;
- if (sect == ns_s_max) {
- msg->_rrnum = -1;
- NS_PTR(msg) = NULL;
- } else {
- msg->_rrnum = 0;
- NS_PTR(msg) = msg->_sections[(int)sect];
- }
-}
-
-#endif
diff --git a/dlls/dnsapi/query.c b/dlls/dnsapi/query.c
index f540662dfd2..4c7a65eb264 100644
--- a/dlls/dnsapi/query.c
+++ b/dlls/dnsapi/query.c
@@ -162,7 +162,7 @@ static char *dns_dname_from_msg( ns_msg msg, const unsigned char *pos )
char *str, dname[NS_MAXDNAME] = ".";
/* returns *compressed* length, ignore it */
- dns_ns_name_uncompress( ns_msg_base(msg), ns_msg_end(msg), pos, dname, sizeof(dname) );
+ ns_name_uncompress( ns_msg_base(msg), ns_msg_end(msg), pos, dname, sizeof(dname) );
len = strlen( dname );
str = heap_alloc( len + 1 );
@@ -282,7 +282,7 @@ static DNS_STATUS dns_copy_rdata( ns_msg msg, const ns_rr *rr, DNS_RECORDA *r, W
r->Data.MINFO.pNameMailbox = dns_dname_from_msg( msg, pos );
if (!r->Data.MINFO.pNameMailbox) return ERROR_NOT_ENOUGH_MEMORY;
- if (dns_ns_name_skip( &pos, ns_msg_end( msg ) ) < 0)
+ if (ns_name_skip( &pos, ns_msg_end( msg ) ) < 0)
return DNS_ERROR_BAD_PACKET;
r->Data.MINFO.pNameErrorsMailbox = dns_dname_from_msg( msg, pos );
@@ -343,7 +343,7 @@ static DNS_STATUS dns_copy_rdata( ns_msg msg, const ns_rr *rr, DNS_RECORDA *r, W
r->Data.SIG.pNameSigner = dns_dname_from_msg( msg, pos );
if (!r->Data.SIG.pNameSigner) return ERROR_NOT_ENOUGH_MEMORY;
- if (dns_ns_name_skip( &pos, ns_msg_end( msg ) ) < 0)
+ if (ns_name_skip( &pos, ns_msg_end( msg ) ) < 0)
return DNS_ERROR_BAD_PACKET;
/* FIXME: byte order? */
@@ -368,7 +368,7 @@ static DNS_STATUS dns_copy_rdata( ns_msg msg, const ns_rr *rr, DNS_RECORDA *r, W
r->Data.SOA.pNamePrimaryServer = dns_dname_from_msg( msg, pos );
if (!r->Data.SOA.pNamePrimaryServer) return ERROR_NOT_ENOUGH_MEMORY;
- if (dns_ns_name_skip( &pos, ns_msg_end( msg ) ) < 0)
+ if (ns_name_skip( &pos, ns_msg_end( msg ) ) < 0)
return DNS_ERROR_BAD_PACKET;
r->Data.SOA.pNameAdministrator = dns_dname_from_msg( msg, pos );
@@ -378,7 +378,7 @@ static DNS_STATUS dns_copy_rdata( ns_msg msg, const ns_rr *rr, DNS_RECORDA *r, W
return ERROR_NOT_ENOUGH_MEMORY;
}
- if (dns_ns_name_skip( &pos, ns_msg_end( msg ) ) < 0)
+ if (ns_name_skip( &pos, ns_msg_end( msg ) ) < 0)
return DNS_ERROR_BAD_PACKET;
r->Data.SOA.dwSerialNo = ntohl( *(const DWORD *)pos ); pos += sizeof(DWORD);
@@ -447,7 +447,7 @@ static DNS_STATUS dns_copy_record( ns_msg msg, ns_sect section,
WORD dlen;
ns_rr rr;
- if (dns_ns_parserr( &msg, section, num, &rr ) < 0)
+ if (ns_parserr( &msg, section, num, &rr ) < 0)
return DNS_ERROR_BAD_PACKET;
if (!(record = heap_alloc_zero( dns_get_record_size( &rr ) )))
@@ -615,7 +615,7 @@ static DNS_STATUS dns_do_query( PCSTR name, WORD type, DWORD options, PDNS_RECOR
goto exit;
}
- if (dns_ns_initparse( answer, len, &msg ) < 0)
+ if (ns_initparse( answer, len, &msg ) < 0)
{
ret = DNS_ERROR_BAD_PACKET;
goto exit;
--
2.30.2
1
0
March 30, 2021
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/mfplat/buffer.c | 65 +++++++++++++++++++++++++++++++++++---
dlls/mfplat/tests/mfplat.c | 12 +------
2 files changed, 62 insertions(+), 15 deletions(-)
diff --git a/dlls/mfplat/buffer.c b/dlls/mfplat/buffer.c
index 77767c27d94..f428630ea01 100644
--- a/dlls/mfplat/buffer.c
+++ b/dlls/mfplat/buffer.c
@@ -914,16 +914,73 @@ static void dxgi_surface_buffer_unmap(struct buffer *buffer)
static HRESULT WINAPI dxgi_surface_buffer_Lock(IMFMediaBuffer *iface, BYTE **data, DWORD *max_length,
DWORD *current_length)
{
- FIXME("%p, %p, %p, %p.\n", iface, data, max_length, current_length);
+ struct buffer *buffer = impl_from_IMFMediaBuffer(iface);
+ HRESULT hr = S_OK;
- return E_NOTIMPL;
+ TRACE("%p, %p, %p, %p.\n", iface, data, max_length, current_length);
+
+ if (!data)
+ return E_POINTER;
+
+ EnterCriticalSection(&buffer->cs);
+
+ if (!buffer->_2d.linear_buffer && buffer->_2d.locks)
+ hr = MF_E_INVALIDREQUEST;
+ else if (!buffer->_2d.linear_buffer)
+ {
+ if (!(buffer->_2d.linear_buffer = heap_alloc(ALIGN_SIZE(buffer->_2d.plane_size, MF_64_BYTE_ALIGNMENT))))
+ hr = E_OUTOFMEMORY;
+
+ if (SUCCEEDED(hr))
+ {
+ hr = dxgi_surface_buffer_map(buffer);
+ if (SUCCEEDED(hr))
+ {
+ MFCopyImage(buffer->_2d.linear_buffer, buffer->_2d.width, buffer->dxgi_surface.map_desc.pData,
+ buffer->dxgi_surface.map_desc.RowPitch, buffer->_2d.width, buffer->_2d.height);
+ }
+ }
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ ++buffer->_2d.locks;
+ *data = buffer->_2d.linear_buffer;
+ if (max_length)
+ *max_length = buffer->_2d.plane_size;
+ if (current_length)
+ *current_length = buffer->_2d.plane_size;
+ }
+
+ LeaveCriticalSection(&buffer->cs);
+
+ return hr;
}
static HRESULT WINAPI dxgi_surface_buffer_Unlock(IMFMediaBuffer *iface)
{
- FIXME("%p.\n", iface);
+ struct buffer *buffer = impl_from_IMFMediaBuffer(iface);
+ HRESULT hr = S_OK;
- return E_NOTIMPL;
+ TRACE("%p.\n", iface);
+
+ EnterCriticalSection(&buffer->cs);
+
+ if (!buffer->_2d.linear_buffer)
+ hr = HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED);
+ else if (!--buffer->_2d.locks)
+ {
+ MFCopyImage(buffer->dxgi_surface.map_desc.pData, buffer->dxgi_surface.map_desc.RowPitch,
+ buffer->_2d.linear_buffer, buffer->_2d.width, buffer->_2d.width, buffer->_2d.height);
+ dxgi_surface_buffer_unmap(buffer);
+
+ heap_free(buffer->_2d.linear_buffer);
+ buffer->_2d.linear_buffer = NULL;
+ }
+
+ LeaveCriticalSection(&buffer->cs);
+
+ return hr;
}
static HRESULT WINAPI dxgi_surface_buffer_SetCurrentLength(IMFMediaBuffer *iface, DWORD current_length)
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index 1e84acd08fa..c21a57be27f 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -6479,31 +6479,24 @@ static void test_dxgi_surface_buffer(void)
max_length = cur_length = 0;
data = NULL;
hr = IMFMediaBuffer_Lock(buffer, &data, &max_length, &cur_length);
-todo_wine {
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
ok(max_length && max_length == cur_length, "Unexpected length %u.\n", max_length);
-}
if (data) *(DWORD *)data = ~0u;
color = get_d3d11_texture_color(texture, 0, 0);
ok(!color, "Unexpected texture color %#x.\n", color);
hr = IMFMediaBuffer_Unlock(buffer);
-todo_wine
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
color = get_d3d11_texture_color(texture, 0, 0);
-todo_wine
ok(color == ~0u, "Unexpected texture color %#x.\n", color);
hr = IMFMediaBuffer_Lock(buffer, &data, &max_length, &cur_length);
-todo_wine
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
- if (SUCCEEDED(hr))
- ok(*(DWORD *)data == ~0u, "Unexpected buffer %#x.\n", *(DWORD *)data);
+ ok(*(DWORD *)data == ~0u, "Unexpected buffer %#x.\n", *(DWORD *)data);
hr = IMFMediaBuffer_Unlock(buffer);
-todo_wine
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
/* Lock2D()/Unlock2D() */
@@ -6526,7 +6519,6 @@ todo_wine
ok(data2 == data && pitch2 == pitch, "Unexpected data/pitch.\n");
hr = IMFMediaBuffer_Lock(buffer, &data, &max_length, &cur_length);
-todo_wine
ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr);
hr = IMF2DBuffer_Unlock2D(_2d_buffer);
@@ -6906,11 +6898,9 @@ todo_wine
IMFDXGIBuffer_Release(dxgi_buffer);
hr = IMFMediaBuffer_Lock(buffer, &data, NULL, NULL);
-todo_wine
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
hr = IMFMediaBuffer_Unlock(buffer);
-todo_wine
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
IMFSample_Release(sample);
--
2.30.2
1
0
[PATCH] gdi32: Do not crash when calling ModifyWorldTransform() with a NULL xform parameter.
by Zhiyi Zhang March 30, 2021
by Zhiyi Zhang March 30, 2021
March 30, 2021
EMFDRV_ModifyWorldTransform() does direct struct copy through pointer dereference. And, when the
mode parameter is MWT_IDENTITY, the xform parameter can be NULL because it should be ignored and
use the identity matrix.
Fix Tally crashing when exporting a JPEG image.
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/gdi32/mapping.c | 9 +++------
dlls/gdi32/tests/metafile.c | 15 +++++++++++++++
2 files changed, 18 insertions(+), 6 deletions(-)
diff --git a/dlls/gdi32/mapping.c b/dlls/gdi32/mapping.c
index 83582846486..a0feee0abb1 100644
--- a/dlls/gdi32/mapping.c
+++ b/dlls/gdi32/mapping.c
@@ -276,12 +276,7 @@ BOOL CDECL nulldrv_ModifyWorldTransform( PHYSDEV dev, const XFORM *xform, DWORD
switch (mode)
{
case MWT_IDENTITY:
- dc->xformWorld2Wnd.eM11 = 1.0f;
- dc->xformWorld2Wnd.eM12 = 0.0f;
- dc->xformWorld2Wnd.eM21 = 0.0f;
- dc->xformWorld2Wnd.eM22 = 1.0f;
- dc->xformWorld2Wnd.eDx = 0.0f;
- dc->xformWorld2Wnd.eDy = 0.0f;
+ dc->xformWorld2Wnd = *xform;
break;
case MWT_LEFTMULTIPLY:
CombineTransform( &dc->xformWorld2Wnd, xform, &dc->xformWorld2Wnd );
@@ -554,10 +549,12 @@ BOOL WINAPI ScaleWindowExtEx( HDC hdc, INT xNum, INT xDenom,
*/
BOOL WINAPI ModifyWorldTransform( HDC hdc, const XFORM *xform, DWORD mode )
{
+ static const XFORM identity_xform = { 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f };
BOOL ret = FALSE;
DC *dc;
if (!xform && mode != MWT_IDENTITY) return FALSE;
+ if (mode == MWT_IDENTITY) xform = &identity_xform;
if ((dc = get_dc_ptr( hdc )))
{
PHYSDEV physdev = GET_DC_PHYSDEV( dc, pModifyWorldTransform );
diff --git a/dlls/gdi32/tests/metafile.c b/dlls/gdi32/tests/metafile.c
index e81cff1ae57..648e9369803 100644
--- a/dlls/gdi32/tests/metafile.c
+++ b/dlls/gdi32/tests/metafile.c
@@ -4158,6 +4158,18 @@ static INT CALLBACK enum_emf_WorldTransform(HDC hdc, HANDLETABLE *ht,
CombineTransform(&test_data->expected, &test_data->stored, &test_data->scale);
}
+ else if(lpXfrm->iMode == MWT_IDENTITY)
+ {
+ /* reset to identity matrix also does discard */
+ test_data->stored.eM11 = 1.0f;
+ test_data->stored.eM12 = 0.0f;
+ test_data->stored.eM21 = 0.0f;
+ test_data->stored.eM22 = 1.0f;
+ test_data->stored.eDx = 0.0f;
+ test_data->stored.eDy = 0.0f;
+
+ CombineTransform(&test_data->expected, &test_data->stored, &test_data->scale);
+ }
/* verify it is updated immediately */
ret = GetWorldTransform(hdc, &xform);
@@ -4265,6 +4277,9 @@ static void test_emf_WorldTransform(void)
ret = SetWorldTransform(hdcMetafile, &xform); /* EMR_SETWORLDTRANSFORM */
ok(ret == TRUE, "SetWorldTransform failed\n");
+ ret = ModifyWorldTransform(hdcMetafile, NULL, MWT_IDENTITY); /* EMR_MODIFYWORLDTRANSFORM */
+ ok(ret == TRUE, "ModifyWorldTransform failed\n");
+
set_rotation_xform(&xform, M_PI / 2.f, -2, -3);
ret = ModifyWorldTransform(hdcMetafile, &xform, MWT_LEFTMULTIPLY); /* EMR_MODIFYWORLDTRANSFORM */
ok(ret == TRUE, "ModifyWorldTransform failed\n");
--
2.27.0
2
1
March 30, 2021
Signed-off-by: Vijay Kiran Kamuju <infyquest(a)gmail.com>
---
dlls/dhtmled.ocx/edit.c | 66 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 66 insertions(+)
diff --git a/dlls/dhtmled.ocx/edit.c b/dlls/dhtmled.ocx/edit.c
index 53dcdfc9ac6..e111f0b7979 100644
--- a/dlls/dhtmled.ocx/edit.c
+++ b/dlls/dhtmled.ocx/edit.c
@@ -30,6 +30,7 @@ typedef struct
IDHTMLEdit IDHTMLEdit_iface;
IOleObject IOleObject_iface;
IPersistStreamInit IPersistStreamInit_iface;
+ IOleControl IOleControl_iface;
IOleClientSite *client_site;
SIZEL extent;
LONG ref;
@@ -50,6 +51,11 @@ static inline DHTMLEditImpl *impl_from_IPersistStreamInit(IPersistStreamInit *if
return CONTAINING_RECORD(iface, DHTMLEditImpl, IPersistStreamInit_iface);
}
+static inline DHTMLEditImpl *impl_from_IOleControl(IOleControl *iface)
+{
+ return CONTAINING_RECORD(iface, DHTMLEditImpl, IOleControl_iface);
+}
+
static ULONG dhtml_edit_addref(DHTMLEditImpl *This)
{
LONG ref = InterlockedIncrement(&This->ref);
@@ -83,6 +89,12 @@ static HRESULT dhtml_edit_qi(DHTMLEditImpl *This, REFIID iid, void **out)
*out = &This->IPersistStreamInit_iface;
return S_OK;
}
+ else if(IsEqualGUID(iid, &IID_IOleControl))
+ {
+ dhtml_edit_addref(This);
+ *out = &This->IOleControl_iface;
+ return S_OK;
+ }
*out = NULL;
ERR("no interface for %s\n", debugstr_guid(iid));
@@ -858,6 +870,59 @@ static const IPersistStreamInitVtbl PersistStreamInitVtbl = {
PersistStreamInit_InitNew
};
+static HRESULT WINAPI OleControl_QueryInterface(IOleControl *iface, REFIID iid, void **out)
+{
+ return dhtml_edit_qi(impl_from_IOleControl(iface), iid, out);
+}
+
+static ULONG WINAPI OleControl_AddRef(IOleControl *iface)
+{
+ return dhtml_edit_addref(impl_from_IOleControl(iface));
+}
+
+static ULONG WINAPI OleControl_Release(IOleControl *iface)
+{
+ return dhtml_edit_release(impl_from_IOleControl(iface));
+}
+
+static HRESULT WINAPI OleControl_GetControlInfo(IOleControl *iface, CONTROLINFO *pCI)
+{
+ DHTMLEditImpl *This = impl_from_IOleControl(iface);
+ FIXME("(%p)->(%p)\n", This, pCI);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI OleControl_OnMnemonic(IOleControl *iface, MSG *msg)
+{
+ DHTMLEditImpl *This = impl_from_IOleControl(iface);
+ FIXME("(%p)->(%p)\n", This, msg);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI OleControl_OnAmbientPropertyChange(IOleControl *iface, DISPID dispID)
+{
+ DHTMLEditImpl *This = impl_from_IOleControl(iface);
+ FIXME("(%p)->(%d)\n", This, dispID);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI OleControl_FreezeEvents(IOleControl *iface, BOOL freeze)
+{
+ DHTMLEditImpl *This = impl_from_IOleControl(iface);
+ FIXME("(%p)->(%x)\n", This, freeze);
+ return E_NOTIMPL;
+}
+
+static const IOleControlVtbl OleControlVtbl = {
+ OleControl_QueryInterface,
+ OleControl_AddRef,
+ OleControl_Release,
+ OleControl_GetControlInfo,
+ OleControl_OnMnemonic,
+ OleControl_OnAmbientPropertyChange,
+ OleControl_FreezeEvents
+};
+
HRESULT dhtml_edit_create(REFIID iid, void **out)
{
DHTMLEditImpl *This;
@@ -874,6 +939,7 @@ HRESULT dhtml_edit_create(REFIID iid, void **out)
This->IDHTMLEdit_iface.lpVtbl = &DHTMLEditVtbl;
This->IOleObject_iface.lpVtbl = &OleObjectVtbl;
This->IPersistStreamInit_iface.lpVtbl = &PersistStreamInitVtbl;
+ This->IOleControl_iface.lpVtbl = &OleControlVtbl;
This->client_site = NULL;
This->ref = 1;
--
2.31.1
1
0
March 30, 2021
This is a series of patches to support MUI, Microsoft's resource
direction feature introduced with Vista. I'm not sure whether this
should be staging or not...
With these patches, modern versions of Notepad will work, at least up to
1909 or so (which requires some stuff to do with shcore). You will need
to have en-US\notepad.exe.mui placed relative to the main EXE.
See https://bugs.winehq.org/show_bug.cgi?id=43670 - I couldn't actually
get Paint to work as it fails with some (unrelated?) Ribbon stuff, but
YMMV.
Signed-off-by: Mark Harmstone <mark(a)harmstone.com>
---
dlls/ntdll/Makefile.in | 1 +
dlls/ntdll/mui.c | 38 ++++++++++++++++++++++++++++++++++++++
dlls/ntdll/ntdll.spec | 1 +
3 files changed, 40 insertions(+)
create mode 100644 dlls/ntdll/mui.c
diff --git a/dlls/ntdll/Makefile.in b/dlls/ntdll/Makefile.in
index 179d00b29ef..0e7a8bf3b96 100644
--- a/dlls/ntdll/Makefile.in
+++ b/dlls/ntdll/Makefile.in
@@ -22,6 +22,7 @@ C_SRCS = \
loader.c \
locale.c \
misc.c \
+ mui.c \
nt.c \
path.c \
printf.c \
diff --git a/dlls/ntdll/mui.c b/dlls/ntdll/mui.c
new file mode 100644
index 00000000000..4a9af642f47
--- /dev/null
+++ b/dlls/ntdll/mui.c
@@ -0,0 +1,38 @@
+/*
+ * MUI functions
+ *
+ * Copyright 2021 Mark Harmstone
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdarg.h>
+
+#include "winternl.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(mui);
+
+/***********************************************************************
+ * RtlLCIDToCultureName (NTDLL.@)
+ *
+ * Return the text name of a numeric language ID.
+ */
+BOOLEAN WINAPI RtlLCIDToCultureName( LCID lcid, PUNICODE_STRING string )
+{
+ FIXME("(%04x, %p)\n", lcid, string);
+
+ return FALSE;
+}
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index c8622ba21f4..d27aaf1da58 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -827,6 +827,7 @@
@ stdcall -arch=win32 -ret64 RtlLargeIntegerShiftRight(int64 long)
@ stdcall -arch=win32 -ret64 RtlLargeIntegerSubtract(int64 int64)
@ stdcall RtlLargeIntegerToChar(ptr long long ptr)
+@ stdcall RtlLCIDToCultureName(long ptr)
@ stdcall RtlLeaveCriticalSection(ptr)
@ stdcall RtlLengthRequiredSid(long)
@ stdcall RtlLengthSecurityDescriptor(ptr)
--
2.26.3
4
18
March 29, 2021
--
-Austin
GPG: 267B CC1F 053F 0749 (expires 2021/02/18)
1
0
[resend PATCH 1/2] ntdll: Implement NtQuerySystemInformationEx(SystemCpuSetInformation).
by Paul Gofman March 29, 2021
by Paul Gofman March 29, 2021
March 29, 2021
Signed-off-by: Paul Gofman <pgofman(a)codeweavers.com>
---
resend:
- rebased the patch.
dlls/ntdll/tests/info.c | 87 +++++++++++++++++++++++++++-
dlls/ntdll/unix/system.c | 121 +++++++++++++++++++++++++++++++++++++++
include/winnt.h | 41 +++++++++++++
include/winternl.h | 1 +
4 files changed, 249 insertions(+), 1 deletion(-)
diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c
index 85c523881ef..80ad333031c 100644
--- a/dlls/ntdll/tests/info.c
+++ b/dlls/ntdll/tests/info.c
@@ -21,6 +21,7 @@
#include "ntdll_test.h"
#include <winnls.h>
#include <stdio.h>
+#include "wine/heap.h"
static NTSTATUS (WINAPI * pNtQuerySystemInformation)(SYSTEM_INFORMATION_CLASS, PVOID, ULONG, PULONG);
static NTSTATUS (WINAPI * pNtSetSystemInformation)(SYSTEM_INFORMATION_CLASS, PVOID, ULONG);
@@ -46,8 +47,8 @@ static NTSTATUS (WINAPI * pNtQueryObject)(HANDLE, OBJECT_INFORMATION_CLASS, void
static NTSTATUS (WINAPI * pNtCreateDebugObject)( HANDLE *, ACCESS_MASK, OBJECT_ATTRIBUTES *, ULONG );
static NTSTATUS (WINAPI * pNtSetInformationDebugObject)(HANDLE,DEBUGOBJECTINFOCLASS,PVOID,ULONG,ULONG*);
static NTSTATUS (WINAPI * pDbgUiConvertStateChangeStructure)(DBGUI_WAIT_STATE_CHANGE*,DEBUG_EVENT*);
-
static BOOL is_wow64;
+static const BOOL is_win64 = sizeof(void *) > sizeof(int);
/* one_before_last_pid is used to be able to compare values of a still running process
with the output of the test_query_process_times and test_query_process_handlecount tests.
@@ -1099,6 +1100,89 @@ static void test_query_logicalprocex(void)
HeapFree(GetProcessHeap(), 0, infoex_group);
}
+static void test_query_cpusetinfo(void)
+{
+ SYSTEM_CPU_SET_INFORMATION *info;
+ unsigned int i, cpu_count;
+ ULONG len, expected_len;
+ NTSTATUS status;
+ SYSTEM_INFO si;
+ HANDLE process;
+
+ if (!pNtQuerySystemInformationEx)
+ return;
+
+ GetSystemInfo(&si);
+ cpu_count = si.dwNumberOfProcessors;
+ expected_len = cpu_count * sizeof(*info);
+
+ process = GetCurrentProcess();
+
+ status = pNtQuerySystemInformationEx(SystemCpuSetInformation, &process, sizeof(process), NULL, 0, &len);
+ if (status == STATUS_INVALID_INFO_CLASS)
+ {
+ win_skip("SystemCpuSetInformation is not supported\n");
+ return;
+ }
+
+ ok(status == STATUS_BUFFER_TOO_SMALL, "Got unexpected status %#x.\n", status);
+ ok(len == expected_len, "Got unexpected length %u.\n", len);
+
+ len = 0xdeadbeef;
+ status = pNtQuerySystemInformation(SystemCpuSetInformation, NULL, 0, &len);
+ ok(status == (is_win64 ? STATUS_INVALID_PARAMETER : STATUS_INVALID_INFO_CLASS),
+ "Got unexpected status %#x.\n", status);
+ ok(len == 0xdeadbeef, "Got unexpected len %u.\n", len);
+
+ len = 0xdeadbeef;
+ process = (HANDLE)0xdeadbeef;
+ status = pNtQuerySystemInformationEx(SystemCpuSetInformation, &process, sizeof(process), NULL, 0, &len);
+ ok(status == STATUS_INVALID_HANDLE, "Got unexpected status %#x.\n", status);
+ ok(len == 0xdeadbeef, "Got unexpected length %u.\n", len);
+
+ len = 0xdeadbeef;
+ process = NULL;
+ status = pNtQuerySystemInformationEx(SystemCpuSetInformation, &process, 4 * sizeof(process), NULL, 0, &len);
+ ok(status == (is_win64 ? STATUS_INVALID_PARAMETER : STATUS_BUFFER_TOO_SMALL),
+ "Got unexpected status %#x.\n", status);
+ ok(len == (is_win64 ? 0xdeadbeef : expected_len), "Got unexpected length %u.\n", len);
+
+ len = 0xdeadbeef;
+ status = pNtQuerySystemInformationEx(SystemCpuSetInformation, NULL, sizeof(process), NULL, 0, &len);
+ ok(status == STATUS_INVALID_PARAMETER, "Got unexpected status %#x.\n", status);
+ ok(len == 0xdeadbeef, "Got unexpected length %u.\n", len);
+
+ status = pNtQuerySystemInformationEx(SystemCpuSetInformation, &process, sizeof(process), NULL, 0, &len);
+ ok(status == STATUS_BUFFER_TOO_SMALL, "Got unexpected status %#x.\n", status);
+ ok(len == expected_len, "Got unexpected length %u.\n", len);
+
+ len = 0xdeadbeef;
+ status = pNtQuerySystemInformationEx(SystemCpuSetInformation, &process, sizeof(process), NULL,
+ expected_len, &len);
+ ok(status == STATUS_ACCESS_VIOLATION, "Got unexpected status %#x.\n", status);
+ ok(len == 0xdeadbeef, "Got unexpected length %u.\n", len);
+
+ info = heap_alloc(expected_len);
+ len = 0;
+ status = pNtQuerySystemInformationEx(SystemCpuSetInformation, &process, sizeof(process), info, expected_len, &len);
+ ok(status == STATUS_SUCCESS, "Got unexpected status %#x.\n", status);
+ ok(len == expected_len, "Got unexpected length %u.\n", len);
+
+ for (i = 0; i < cpu_count; ++i)
+ {
+ SYSTEM_CPU_SET_INFORMATION *d = &info[i];
+
+ ok(d->Size == sizeof(*d), "Got unexpected size %u, i %u.\n", d->Size, i);
+ ok(d->Type == CpuSetInformation, "Got unexpected type %u, i %u.\n", d->Type, i);
+ ok(d->CpuSet.Id == 0x100 + i, "Got unexpected Id %#x, i %u.\n", d->CpuSet.Id, i);
+ ok(!d->CpuSet.Group, "Got unexpected Group %u, i %u.\n", d->CpuSet.Group, i);
+ ok(d->CpuSet.LogicalProcessorIndex == i, "Got unexpected LogicalProcessorIndex %u, i %u.\n",
+ d->CpuSet.LogicalProcessorIndex, i);
+ ok(!d->CpuSet.AllFlags, "Got unexpected AllFlags %#x, i %u.\n", d->CpuSet.AllFlags, i);
+ }
+ heap_free(info);
+}
+
static void test_query_firmware(void)
{
static const ULONG min_sfti_len = FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
@@ -3059,6 +3143,7 @@ START_TEST(info)
test_query_regquota();
test_query_logicalproc();
test_query_logicalprocex();
+ test_query_cpusetinfo();
test_query_firmware();
test_query_data_alignment();
diff --git a/dlls/ntdll/unix/system.c b/dlls/ntdll/unix/system.c
index 6fa71ddfb91..859193944aa 100644
--- a/dlls/ntdll/unix/system.c
+++ b/dlls/ntdll/unix/system.c
@@ -1166,6 +1166,98 @@ static NTSTATUS create_logical_proc_info( SYSTEM_LOGICAL_PROCESSOR_INFORMATION *
}
#endif
+static NTSTATUS create_cpuset_info(SYSTEM_CPU_SET_INFORMATION *info)
+{
+ SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *proc_info;
+ BYTE core_index, cache_index, max_cache_level;
+ unsigned int i, j, count;
+ BYTE *proc_info_buffer;
+ DWORD cpu_info_size;
+ ULONG64 cpu_mask;
+ NTSTATUS status;
+
+ count = NtCurrentTeb()->Peb->NumberOfProcessors;
+
+ cpu_info_size = 3 * sizeof(*proc_info);
+ if (!(proc_info_buffer = malloc(cpu_info_size)))
+ return STATUS_NO_MEMORY;
+
+ if ((status = create_logical_proc_info(NULL, (SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX **)&proc_info_buffer,
+ &cpu_info_size, RelationAll)))
+ {
+ free(proc_info_buffer);
+ return status;
+ }
+
+ max_cache_level = 0;
+ proc_info = (SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *)proc_info_buffer;
+ for (i = 0; (BYTE *)proc_info != proc_info_buffer + cpu_info_size; ++i)
+ {
+ if (proc_info->Relationship == RelationCache)
+ {
+ if (max_cache_level < proc_info->u.Cache.Level)
+ max_cache_level = proc_info->u.Cache.Level;
+ }
+ proc_info = (SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *)((BYTE *)proc_info + proc_info->Size);
+ }
+
+ memset(info, 0, count * sizeof(*info));
+
+ core_index = 0;
+ cache_index = 0;
+ proc_info = (SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *)proc_info_buffer;
+ for (i = 0; i < count; ++i)
+ {
+ info[i].Size = sizeof(*info);
+ info[i].Type = CpuSetInformation;
+ info[i].u.CpuSet.Id = 0x100 + i;
+ info[i].u.CpuSet.LogicalProcessorIndex = i;
+ }
+
+ for (i = 0; (BYTE *)proc_info != (BYTE *)proc_info_buffer + cpu_info_size; ++i)
+ {
+ if (proc_info->Relationship == RelationProcessorCore)
+ {
+ if (proc_info->u.Processor.GroupCount != 1)
+ {
+ FIXME("Unsupported group count %u.\n", proc_info->u.Processor.GroupCount);
+ continue;
+ }
+ cpu_mask = proc_info->u.Processor.GroupMask[0].Mask;
+ for (j = 0; j < count; ++j)
+ if (((ULONG64)1 << j) & cpu_mask)
+ {
+ info[j].u.CpuSet.CoreIndex = core_index;
+ info[j].u.CpuSet.EfficiencyClass = proc_info->u.Processor.EfficiencyClass;
+ }
+ ++core_index;
+ }
+ else if (proc_info->Relationship == RelationCache)
+ {
+ if (proc_info->u.Cache.Level == max_cache_level)
+ {
+ cpu_mask = proc_info->u.Cache.GroupMask.Mask;
+ for (j = 0; j < count; ++j)
+ if (((ULONG64)1 << j) & cpu_mask)
+ info[j].u.CpuSet.LastLevelCacheIndex = cache_index;
+ }
+ ++cache_index;
+ }
+ else if (proc_info->Relationship == RelationNumaNode)
+ {
+ cpu_mask = proc_info->u.NumaNode.GroupMask.Mask;
+ for (j = 0; j < count; ++j)
+ if (((ULONG64)1 << j) & cpu_mask)
+ info[j].u.CpuSet.NumaNodeIndex = proc_info->u.NumaNode.NodeNumber;
+ }
+ proc_info = (SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *)((BYTE *)proc_info + proc_info->Size);
+ }
+
+ free(proc_info_buffer);
+
+ return STATUS_SUCCESS;
+}
+
#ifdef linux
static void copy_smbios_string( char **buffer, char *s, size_t len )
@@ -2651,6 +2743,10 @@ NTSTATUS WINAPI NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS class,
break;
}
+ case SystemCpuSetInformation:
+ return is_win64 ? NtQuerySystemInformationEx(class, NULL, 0, info, size, ret_size)
+ : STATUS_INVALID_INFO_CLASS;
+
case SystemRecommendedSharedDataAlignment:
{
len = sizeof(DWORD);
@@ -2773,6 +2869,31 @@ NTSTATUS WINAPI NtQuerySystemInformationEx( SYSTEM_INFORMATION_CLASS class,
break;
}
+ case SystemCpuSetInformation:
+ {
+ unsigned int cpu_count = NtCurrentTeb()->Peb->NumberOfProcessors;
+ PROCESS_BASIC_INFORMATION pbi;
+ HANDLE process;
+
+ if (!query || query_len < sizeof(HANDLE) || (is_win64 && query_len != sizeof(HANDLE)))
+ return STATUS_INVALID_PARAMETER;
+
+ process = *(HANDLE *)query;
+ if (process && (ret = NtQueryInformationProcess(process, ProcessBasicInformation, &pbi, sizeof(pbi), NULL)))
+ return ret;
+
+ if (size < (len = cpu_count * sizeof(SYSTEM_CPU_SET_INFORMATION)))
+ {
+ ret = STATUS_BUFFER_TOO_SMALL;
+ break;
+ }
+ if (!info)
+ return STATUS_ACCESS_VIOLATION;
+
+ if ((ret = create_cpuset_info(info)))
+ return ret;
+ break;
+ }
default:
FIXME( "(0x%08x,%p,%u,%p,%u,%p) stub\n", class, query, query_len, info, size, ret_size );
break;
diff --git a/include/winnt.h b/include/winnt.h
index 0a6027118fe..840966f657b 100644
--- a/include/winnt.h
+++ b/include/winnt.h
@@ -6726,6 +6726,47 @@ typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX
} DUMMYUNIONNAME;
} SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX;
+typedef enum _CPU_SET_INFORMATION_TYPE
+{
+ CpuSetInformation,
+} CPU_SET_INFORMATION_TYPE, *PCPU_SET_INFORMATION_TYPE;
+
+typedef struct _SYSTEM_CPU_SET_INFORMATION
+{
+ DWORD Size;
+ CPU_SET_INFORMATION_TYPE Type;
+ union
+ {
+ struct
+ {
+ DWORD Id;
+ WORD Group;
+ BYTE LogicalProcessorIndex;
+ BYTE CoreIndex;
+ BYTE LastLevelCacheIndex;
+ BYTE NumaNodeIndex;
+ BYTE EfficiencyClass;
+ union
+ {
+ BYTE AllFlags;
+ struct
+ {
+ BYTE Parked : 1;
+ BYTE Allocated : 1;
+ BYTE AllocatedToTargetProcess : 1;
+ BYTE RealTime : 1;
+ BYTE ReservedFlags : 4;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME2;
+ union {
+ DWORD Reserved;
+ BYTE SchedulingClass;
+ };
+ DWORD64 AllocationTag;
+ } CpuSet;
+ } DUMMYUNIONNAME;
+} SYSTEM_CPU_SET_INFORMATION, *PSYSTEM_CPU_SET_INFORMATION;
+
/* Threadpool things */
typedef DWORD TP_VERSION,*PTP_VERSION;
diff --git a/include/winternl.h b/include/winternl.h
index fcdedaec8aa..c8fb7031d91 100644
--- a/include/winternl.h
+++ b/include/winternl.h
@@ -1551,6 +1551,7 @@ typedef enum _SYSTEM_INFORMATION_CLASS {
SystemFileCacheInformationEx = 81,
SystemDynamicTimeZoneInformation = 102,
SystemLogicalProcessorInformationEx = 107,
+ SystemCpuSetInformation = 175,
SystemHypervisorSharedPageInformation = 197,
SystemInformationClassMax
} SYSTEM_INFORMATION_CLASS, *PSYSTEM_INFORMATION_CLASS;
--
2.30.2
3
5