Wine-devel
Threads by month
- ----- 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
March 2021
- 75 participants
- 800 discussions
30 Mar '21
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/riched20/editor.c | 20 +++++------
dlls/riched20/editor.h | 6 ++--
dlls/riched20/paint.c | 47 +++++++++++++-------------
dlls/riched20/richole.c | 2 +-
dlls/riched20/tests/txtsrv.c | 64 ++++++++++++++++++++++++++++++++++--
5 files changed, 99 insertions(+), 40 deletions(-)
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index 28b5cb1512d..dccc431f041 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -3377,7 +3377,7 @@ LRESULT editor_handle_message( ME_TextEditor *editor, UINT msg, WPARAM wParam,
case EM_SETSCROLLPOS:
{
POINT *point = (POINT *)lParam;
- ME_ScrollAbs(editor, point->x, point->y);
+ scroll_abs( editor, point->x, point->y, TRUE );
return 0;
}
case EM_AUTOURLDETECT:
@@ -3986,12 +3986,11 @@ LRESULT editor_handle_message( ME_TextEditor *editor, UINT msg, WPARAM wParam,
switch(LOWORD(wParam))
{
case SB_LEFT:
- ME_ScrollAbs(editor, 0, 0);
+ scroll_abs( editor, 0, 0, TRUE );
break;
case SB_RIGHT:
- ME_ScrollAbs(editor,
- editor->horz_si.nMax - (int)editor->horz_si.nPage,
- editor->vert_si.nMax - (int)editor->vert_si.nPage);
+ scroll_abs( editor, editor->horz_si.nMax - (int)editor->horz_si.nPage,
+ editor->vert_si.nMax - (int)editor->vert_si.nPage, TRUE );
break;
case SB_LINELEFT:
ME_ScrollLeft(editor, scrollUnit);
@@ -4011,7 +4010,7 @@ LRESULT editor_handle_message( ME_TextEditor *editor, UINT msg, WPARAM wParam,
int pos = HIWORD(wParam);
if (editor->horz_si.nMax > 0xffff)
pos = MulDiv(pos, editor->horz_si.nMax, 0xffff);
- ME_HScrollAbs(editor, pos);
+ scroll_h_abs( editor, pos, FALSE );
break;
}
}
@@ -4028,12 +4027,11 @@ LRESULT editor_handle_message( ME_TextEditor *editor, UINT msg, WPARAM wParam,
switch(LOWORD(wParam))
{
case SB_TOP:
- ME_ScrollAbs(editor, 0, 0);
+ scroll_abs( editor, 0, 0, TRUE );
break;
case SB_BOTTOM:
- ME_ScrollAbs(editor,
- editor->horz_si.nMax - (int)editor->horz_si.nPage,
- editor->vert_si.nMax - (int)editor->vert_si.nPage);
+ scroll_abs( editor, editor->horz_si.nMax - (int)editor->horz_si.nPage,
+ editor->vert_si.nMax - (int)editor->vert_si.nPage, TRUE );
break;
case SB_LINEUP:
ME_ScrollUp(editor,lineHeight);
@@ -4053,7 +4051,7 @@ LRESULT editor_handle_message( ME_TextEditor *editor, UINT msg, WPARAM wParam,
int pos = HIWORD(wParam);
if (editor->vert_si.nMax > 0xffff)
pos = MulDiv(pos, editor->vert_si.nMax, 0xffff);
- ME_VScrollAbs(editor, pos);
+ scroll_v_abs( editor, pos, FALSE );
break;
}
}
diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h
index 7a79df83c99..fa1e22f9b48 100644
--- a/dlls/riched20/editor.h
+++ b/dlls/riched20/editor.h
@@ -250,9 +250,9 @@ int ME_twips2pointsY(const ME_Context *c, int y) DECLSPEC_HIDDEN;
/* scroll functions in paint.c */
-void ME_ScrollAbs(ME_TextEditor *editor, int x, int y) DECLSPEC_HIDDEN;
-void ME_HScrollAbs(ME_TextEditor *editor, int x) DECLSPEC_HIDDEN;
-void ME_VScrollAbs(ME_TextEditor *editor, int y) DECLSPEC_HIDDEN;
+void scroll_abs( ME_TextEditor *editor, int x, int y, BOOL notify ) DECLSPEC_HIDDEN;
+void scroll_h_abs( ME_TextEditor *editor, int x, BOOL notify ) DECLSPEC_HIDDEN;
+void scroll_v_abs( ME_TextEditor *editor, int y, BOOL notify ) DECLSPEC_HIDDEN;
void ME_ScrollUp(ME_TextEditor *editor, int cy) DECLSPEC_HIDDEN;
void ME_ScrollDown(ME_TextEditor *editor, int cy) DECLSPEC_HIDDEN;
void ME_ScrollLeft(ME_TextEditor *editor, int cx) DECLSPEC_HIDDEN;
diff --git a/dlls/riched20/paint.c b/dlls/riched20/paint.c
index ad9f504db8e..550c3c97045 100644
--- a/dlls/riched20/paint.c
+++ b/dlls/riched20/paint.c
@@ -1070,7 +1070,7 @@ static void enable_show_scrollbar( ME_TextEditor *editor, INT bar, BOOL enable )
ITextHost_TxShowScrollBar( editor->texthost, bar, enable );
}
-static void set_scroll_range_pos( ITextHost2 *host, INT bar, SCROLLINFO *info, BOOL set_range )
+static void set_scroll_range_pos( ME_TextEditor *editor, INT bar, SCROLLINFO *info, BOOL set_range, BOOL notify )
{
LONG max_pos = info->nMax, pos = info->nPos;
@@ -1080,11 +1080,14 @@ static void set_scroll_range_pos( ITextHost2 *host, INT bar, SCROLLINFO *info, B
pos = MulDiv( pos, 0xffff, max_pos );
max_pos = 0xffff;
}
- if (set_range) ITextHost_TxSetScrollRange( host, bar, 0, max_pos, FALSE );
- ITextHost_TxSetScrollPos( host, bar, pos, TRUE );
+ if (set_range) ITextHost_TxSetScrollRange( editor->texthost, bar, 0, max_pos, FALSE );
+ ITextHost_TxSetScrollPos( editor->texthost, bar, pos, TRUE );
+
+ if (notify && editor->nEventMask & ENM_SCROLL)
+ ITextHost_TxNotify( editor->texthost, bar == SB_VERT ? EN_VSCROLL : EN_HSCROLL, NULL );
}
-void ME_ScrollAbs(ME_TextEditor *editor, int x, int y)
+void scroll_abs( ME_TextEditor *editor, int x, int y, BOOL notify )
{
int scrollX = 0, scrollY = 0;
@@ -1093,7 +1096,7 @@ void ME_ScrollAbs(ME_TextEditor *editor, int x, int y)
x = max(x, editor->horz_si.nMin);
scrollX = editor->horz_si.nPos - x;
editor->horz_si.nPos = x;
- set_scroll_range_pos( editor->texthost, SB_HORZ, &editor->horz_si, FALSE );
+ set_scroll_range_pos( editor, SB_HORZ, &editor->horz_si, FALSE, notify );
}
if (editor->vert_si.nPos != y) {
@@ -1101,7 +1104,7 @@ void ME_ScrollAbs(ME_TextEditor *editor, int x, int y)
y = max(y, editor->vert_si.nMin);
scrollY = editor->vert_si.nPos - y;
editor->vert_si.nPos = y;
- set_scroll_range_pos( editor->texthost, SB_VERT, &editor->vert_si, FALSE );
+ set_scroll_range_pos( editor, SB_VERT, &editor->vert_si, FALSE, notify );
}
if (abs(scrollX) > editor->sizeWindow.cx || abs(scrollY) > editor->sizeWindow.cy)
@@ -1114,34 +1117,34 @@ void ME_ScrollAbs(ME_TextEditor *editor, int x, int y)
ME_Repaint(editor);
}
-void ME_HScrollAbs(ME_TextEditor *editor, int x)
+void scroll_h_abs( ME_TextEditor *editor, int x, BOOL notify )
{
- ME_ScrollAbs(editor, x, editor->vert_si.nPos);
+ scroll_abs( editor, x, editor->vert_si.nPos, notify );
}
-void ME_VScrollAbs(ME_TextEditor *editor, int y)
+void scroll_v_abs( ME_TextEditor *editor, int y, BOOL notify )
{
- ME_ScrollAbs(editor, editor->horz_si.nPos, y);
+ scroll_abs( editor, editor->horz_si.nPos, y, notify );
}
void ME_ScrollUp(ME_TextEditor *editor, int cy)
{
- ME_VScrollAbs(editor, editor->vert_si.nPos - cy);
+ scroll_v_abs( editor, editor->vert_si.nPos - cy, TRUE );
}
void ME_ScrollDown(ME_TextEditor *editor, int cy)
{
- ME_VScrollAbs(editor, editor->vert_si.nPos + cy);
+ scroll_v_abs( editor, editor->vert_si.nPos + cy, TRUE );
}
void ME_ScrollLeft(ME_TextEditor *editor, int cx)
{
- ME_HScrollAbs(editor, editor->horz_si.nPos - cx);
+ scroll_h_abs( editor, editor->horz_si.nPos - cx, TRUE );
}
void ME_ScrollRight(ME_TextEditor *editor, int cx)
{
- ME_HScrollAbs(editor, editor->horz_si.nPos + cx);
+ scroll_h_abs( editor, editor->horz_si.nPos + cx, TRUE );
}
void ME_UpdateScrollBar(ME_TextEditor *editor)
@@ -1157,7 +1160,7 @@ void ME_UpdateScrollBar(ME_TextEditor *editor)
enable = editor->nTotalWidth > editor->sizeWindow.cx;
if (editor->horz_si.nPos && !enable)
{
- ME_HScrollAbs(editor, 0);
+ scroll_h_abs( editor, 0, TRUE );
/* ME_HScrollAbs will call this function, so nothing else needs to be done here. */
return;
}
@@ -1174,7 +1177,7 @@ void ME_UpdateScrollBar(ME_TextEditor *editor)
editor->horz_si.nPage = editor->sizeWindow.cx;
TRACE( "min = %d max = %d page = %d\n", editor->horz_si.nMin, editor->horz_si.nMax, editor->horz_si.nPage );
if ((enable || editor->horz_sb_enabled) && editor->scrollbars & WS_HSCROLL)
- set_scroll_range_pos( editor->texthost, SB_HORZ, &editor->horz_si, TRUE );
+ set_scroll_range_pos( editor, SB_HORZ, &editor->horz_si, TRUE, TRUE );
}
/* Update vertical scrollbar */
@@ -1182,7 +1185,7 @@ void ME_UpdateScrollBar(ME_TextEditor *editor)
if (editor->vert_si.nPos && !enable)
{
- ME_VScrollAbs(editor, 0);
+ scroll_v_abs( editor, 0, TRUE );
/* ME_VScrollAbs will call this function, so nothing else needs to be done here. */
return;
}
@@ -1199,7 +1202,7 @@ void ME_UpdateScrollBar(ME_TextEditor *editor)
editor->vert_si.nPage = editor->sizeWindow.cy;
TRACE( "min = %d max = %d page = %d\n", editor->vert_si.nMin, editor->vert_si.nMax, editor->vert_si.nPage );
if ((enable || editor->vert_sb_enabled) && editor->scrollbars & WS_VSCROLL)
- set_scroll_range_pos( editor->texthost, SB_VERT, &editor->vert_si, TRUE );
+ set_scroll_range_pos( editor, SB_VERT, &editor->vert_si, TRUE, TRUE );
}
}
@@ -1221,7 +1224,7 @@ void editor_ensure_visible( ME_TextEditor *editor, ME_Cursor *cursor )
if (~editor->scrollbars & ES_AUTOVSCROLL)
{
- ME_HScrollAbs(editor, x);
+ scroll_h_abs( editor, x, TRUE );
return;
}
}
@@ -1235,11 +1238,11 @@ void editor_ensure_visible( ME_TextEditor *editor, ME_Cursor *cursor )
yheight = row->nHeight;
if (y < editor->vert_si.nPos)
- ME_ScrollAbs(editor, x, y);
+ scroll_abs( editor, x, y, TRUE );
else if (y + yheight > editor->vert_si.nPos + editor->sizeWindow.cy)
- ME_ScrollAbs(editor, x, y + yheight - editor->sizeWindow.cy);
+ scroll_abs( editor, x, y + yheight - editor->sizeWindow.cy, TRUE );
else if (x != editor->horz_si.nPos)
- ME_ScrollAbs(editor, x, editor->vert_si.nPos);
+ scroll_abs( editor, x, editor->vert_si.nPos, TRUE );
}
diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c
index b652d5a753a..2bb15bb4504 100644
--- a/dlls/riched20/richole.c
+++ b/dlls/riched20/richole.c
@@ -2743,7 +2743,7 @@ static HRESULT WINAPI ITextRange_fnScrollIntoView(ITextRange *me, LONG value)
FIXME("bStart value %d not handled\n", value);
return E_NOTIMPL;
}
- ME_ScrollAbs(editor, x, y);
+ scroll_abs( editor, x, y, TRUE );
return S_OK;
}
diff --git a/dlls/riched20/tests/txtsrv.c b/dlls/riched20/tests/txtsrv.c
index 3cfd5e63753..45e48a734fa 100644
--- a/dlls/riched20/tests/txtsrv.c
+++ b/dlls/riched20/tests/txtsrv.c
@@ -398,11 +398,19 @@ static HRESULT __thiscall ITextHostImpl_TxGetPropertyBits(ITextHost *iface, DWOR
return S_OK;
}
-static HRESULT __thiscall ITextHostImpl_TxNotify(ITextHost *iface, DWORD iNotify, void *pv)
+static int en_vscroll_sent;
+static HRESULT __thiscall ITextHostImpl_TxNotify( ITextHost *iface, DWORD code, void *data )
{
ITextHostTestImpl *This = impl_from_ITextHost(iface);
- TRACECALL("Call to TxNotify(%p, iNotify=%d, pv=%p)\n", This, iNotify, pv);
- return E_NOTIMPL;
+ TRACECALL( "Call to TxNotify(%p, code = %#x, data = %p)\n", This, code, data );
+ switch (code)
+ {
+ case EN_VSCROLL:
+ en_vscroll_sent++;
+ ok( !data, "got %p\n", data );
+ break;
+ }
+ return S_OK;
}
static HIMC __thiscall ITextHostImpl_TxImmGetContext(ITextHost *iface)
@@ -1100,6 +1108,55 @@ todo_wine
ITextHost_Release(host);
}
+static void test_notifications( void )
+{
+ ITextServices *txtserv;
+ ITextHost *host;
+ LRESULT res;
+ HRESULT hr;
+ RECT client = { 0, 0, 100, 100 };
+ ITextHostTestImpl *host_impl;
+
+ init_texthost( &txtserv, &host );
+ host_impl = impl_from_ITextHost( host );
+
+ host_impl->scrollbars = WS_VSCROLL;
+ host_impl->props = TXTBIT_MULTILINE | TXTBIT_RICHTEXT | TXTBIT_WORDWRAP;
+ ITextServices_OnTxPropertyBitsChange( txtserv, TXTBIT_SCROLLBARCHANGE | TXTBIT_MULTILINE | TXTBIT_RICHTEXT | TXTBIT_WORDWRAP, host_impl->props );
+
+ ITextServices_TxSetText( txtserv, lorem );
+
+ host_impl->window = CreateWindowExA( 0, "static", NULL, WS_POPUP | WS_VISIBLE,
+ 0, 0, 400, 400, 0, 0, 0, NULL );
+ host_impl->client_rect = client;
+ hr = ITextServices_OnTxInPlaceActivate( txtserv, &client );
+ ok( hr == S_OK, "got 0x%08x.\n", hr );
+
+ hr = ITextServices_TxSendMessage( txtserv, EM_SETEVENTMASK, 0, ENM_SCROLL, &res );
+ ok( hr == S_OK, "got %08x\n", hr );
+
+ /* check EN_VSCROLL notification is sent */
+ en_vscroll_sent = 0;
+ hr = ITextServices_TxSendMessage( txtserv, WM_VSCROLL, SB_LINEDOWN, 0, &res );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( en_vscroll_sent == 1, "got %d\n", en_vscroll_sent );
+
+ hr = ITextServices_TxSendMessage( txtserv, WM_VSCROLL, SB_BOTTOM, 0, &res );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( en_vscroll_sent == 2, "got %d\n", en_vscroll_sent );
+
+ /* but not when the thumb is moved */
+ hr = ITextServices_TxSendMessage( txtserv, WM_VSCROLL, MAKEWPARAM( SB_THUMBTRACK, 0 ), 0, &res );
+ ok( hr == S_OK, "got %08x\n", hr );
+ hr = ITextServices_TxSendMessage( txtserv, WM_VSCROLL, MAKEWPARAM( SB_THUMBPOSITION, 0 ), 0, &res );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( en_vscroll_sent == 2, "got %d\n", en_vscroll_sent );
+
+ DestroyWindow( host_impl->window );
+ ITextServices_Release( txtserv );
+ ITextHost_Release( host );
+}
+
START_TEST( txtsrv )
{
ITextServices *txtserv;
@@ -1132,6 +1189,7 @@ START_TEST( txtsrv )
test_QueryInterface();
test_default_format();
test_TxGetScroll();
+ test_notifications();
}
if (wrapperCodeMem) VirtualFree(wrapperCodeMem, 0, MEM_RELEASE);
}
--
2.23.0
1
0
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/msvcrt/tests/string.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c
index dbc93dc93f5..7bed261d49d 100644
--- a/dlls/msvcrt/tests/string.c
+++ b/dlls/msvcrt/tests/string.c
@@ -4457,6 +4457,16 @@ static void test__mbbtype(void)
}
}
+static void test_wcsncpy(void)
+{
+ wchar_t dst[6], *p;
+
+ memset(dst, 0xff, sizeof(dst));
+ p = wcsncpy(dst, L"1234567", 6);
+ ok(p == dst, "Unexpected return value.\n");
+ ok(dst[5] == '6', "Unexpected buffer %#x.\n", dst[5]);
+}
+
START_TEST(string)
{
char mem[100];
@@ -4612,4 +4622,5 @@ START_TEST(string)
test___STRINGTOLD();
test_SpecialCasing();
test__mbbtype();
+ test_wcsncpy();
}
--
2.30.2
1
0
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/dwrite/dwrite_private.h | 10 +++++-----
dlls/dwrite/font.c | 27 ---------------------------
dlls/dwrite/freetype.c | 27 +++++++++++++++++++++++++++
3 files changed, 32 insertions(+), 32 deletions(-)
diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index 8536e3c6a36..2408251717b 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -97,7 +97,11 @@ static inline BOOL dwrite_array_reserve(void **elements, size_t *capacity, size_
if (new_capacity < count)
new_capacity = max_capacity;
- if (!(new_elements = heap_realloc(*elements, new_capacity * size)))
+ if (!*elements)
+ new_elements = RtlAllocateHeap(GetProcessHeap(), 0, new_capacity * size);
+ else
+ new_elements = RtlReAllocateHeap(GetProcessHeap(), 0, *elements, new_capacity * size);
+ if (!new_elements)
return FALSE;
*elements = new_elements;
@@ -481,10 +485,6 @@ struct dwrite_outline
} points;
};
-extern int dwrite_outline_push_tag(struct dwrite_outline *outline, unsigned char tag) DECLSPEC_HIDDEN;
-extern int dwrite_outline_push_points(struct dwrite_outline *outline, const D2D1_POINT_2F *points,
- unsigned int count) DECLSPEC_HIDDEN;
-
/* Glyph shaping */
enum SCRIPT_JUSTIFY
{
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 57c64e4622d..2fd6ad90f1f 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -832,33 +832,6 @@ static void WINAPI dwritefontface_ReleaseFontTable(IDWriteFontFace5 *iface, void
IDWriteFontFileStream_ReleaseFileFragment(fontface->stream, table_context);
}
-int dwrite_outline_push_tag(struct dwrite_outline *outline, unsigned char tag)
-{
- if (!dwrite_array_reserve((void **)&outline->tags.values, &outline->tags.size, outline->tags.count + 1,
- sizeof(*outline->tags.values)))
- {
- return 1;
- }
-
- outline->tags.values[outline->tags.count++] = tag;
-
- return 0;
-}
-
-int dwrite_outline_push_points(struct dwrite_outline *outline, const D2D1_POINT_2F *points, unsigned int count)
-{
- if (!dwrite_array_reserve((void **)&outline->points.values, &outline->points.size, outline->points.count + count,
- sizeof(*outline->points.values)))
- {
- return 1;
- }
-
- memcpy(&outline->points.values[outline->points.count], points, sizeof(*points) * count);
- outline->points.count += count;
-
- return 0;
-}
-
static void apply_outline_point_offset(const D2D1_POINT_2F *src, const D2D1_POINT_2F *offset,
D2D1_POINT_2F *dst)
{
diff --git a/dlls/dwrite/freetype.c b/dlls/dwrite/freetype.c
index efa0f24d96c..128388c9c86 100644
--- a/dlls/dwrite/freetype.c
+++ b/dlls/dwrite/freetype.c
@@ -267,6 +267,33 @@ static inline void ft_vector_to_d2d_point(const FT_Vector *v, D2D1_POINT_2F *p)
p->y = v->y / 64.0f;
}
+static int dwrite_outline_push_tag(struct dwrite_outline *outline, unsigned char tag)
+{
+ if (!dwrite_array_reserve((void **)&outline->tags.values, &outline->tags.size, outline->tags.count + 1,
+ sizeof(*outline->tags.values)))
+ {
+ return 1;
+ }
+
+ outline->tags.values[outline->tags.count++] = tag;
+
+ return 0;
+}
+
+static int dwrite_outline_push_points(struct dwrite_outline *outline, const D2D1_POINT_2F *points, unsigned int count)
+{
+ if (!dwrite_array_reserve((void **)&outline->points.values, &outline->points.size, outline->points.count + count,
+ sizeof(*outline->points.values)))
+ {
+ return 1;
+ }
+
+ memcpy(&outline->points.values[outline->points.count], points, sizeof(*points) * count);
+ outline->points.count += count;
+
+ return 0;
+}
+
static int decompose_beginfigure(struct decompose_context *ctxt)
{
D2D1_POINT_2F point;
--
2.30.2
1
3
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/dnsapi/tests/query.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/dlls/dnsapi/tests/query.c b/dlls/dnsapi/tests/query.c
index 237dfd6ae7c..74669005a33 100644
--- a/dlls/dnsapi/tests/query.c
+++ b/dlls/dnsapi/tests/query.c
@@ -38,6 +38,11 @@ static void test_DnsQuery(void)
DNS_RECORDW *rec;
DNS_STATUS status;
+ rec = NULL;
+ status = DnsQuery_W(L"winehq.org", DNS_TYPE_A, DNS_QUERY_STANDARD, NULL, &rec, NULL);
+ ok(status == ERROR_SUCCESS, "DnsQuery_W(%s) => %d\n", wine_dbgstr_w(name), status);
+ DnsRecordListFree(rec, DnsFreeRecordList);
+
status = DnsQuery_W(L"", DNS_TYPE_SRV, DNS_QUERY_STANDARD, NULL, &rec, NULL);
ok(status == DNS_ERROR_RCODE_NAME_ERROR || status == DNS_INFO_NO_RECORDS || status == ERROR_INVALID_NAME /* XP */, "got %u\n", status);
--
2.30.2
3
2
[PATCH v2 1/2] ntdll: Implement NtQuerySystemInformationEx(SystemCpuSetInformation).
by Paul Gofman 30 Mar '21
by Paul Gofman 30 Mar '21
30 Mar '21
Signed-off-by: Paul Gofman <pgofman(a)codeweavers.com>
---
v2:
- don't introduce different behaviour based on is_win64.
dlls/ntdll/tests/info.c | 90 ++++++++++++++++++++++++++++-
dlls/ntdll/unix/system.c | 120 +++++++++++++++++++++++++++++++++++++++
include/winnt.h | 41 +++++++++++++
include/winternl.h | 1 +
4 files changed, 251 insertions(+), 1 deletion(-)
diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c
index 85c523881ef..f3e4ebdf8bb 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,92 @@ 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);
+ todo_wine_if(!is_win64 && status == STATUS_INVALID_PARAMETER)
+ 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);
+ todo_wine_if(is_win64 && status == STATUS_BUFFER_TOO_SMALL)
+ ok(status == (is_win64 ? STATUS_INVALID_PARAMETER : STATUS_BUFFER_TOO_SMALL),
+ "Got unexpected status %#x.\n", status);
+ todo_wine_if(is_win64 && len == expected_len)
+ 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 +3146,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..a9cd686ed62 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,9 @@ NTSTATUS WINAPI NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS class,
break;
}
+ case SystemCpuSetInformation:
+ return NtQuerySystemInformationEx(class, NULL, 0, info, size, ret_size);
+
case SystemRecommendedSharedDataAlignment:
{
len = sizeof(DWORD);
@@ -2773,6 +2868,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))
+ 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
4
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
30 Mar '21
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
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
30 Mar '21
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
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