Paul Gofman : hnetcfg: Get gateway description location in init_gateway_connection().

Alexandre Julliard julliard at winehq.org
Tue Feb 1 15:21:34 CST 2022


Module: wine
Branch: master
Commit: 583605be049af1ad8a7551b7073c15832b2644a0
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=583605be049af1ad8a7551b7073c15832b2644a0

Author: Paul Gofman <pgofman at codeweavers.com>
Date:   Tue Feb  1 13:49:22 2022 +0300

hnetcfg: Get gateway description location in init_gateway_connection().

Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/hnetcfg/port.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)

diff --git a/dlls/hnetcfg/port.c b/dlls/hnetcfg/port.c
index 89a3f571d45..fa866d874c9 100644
--- a/dlls/hnetcfg/port.c
+++ b/dlls/hnetcfg/port.c
@@ -27,6 +27,7 @@
 #include "string.h"
 #include "assert.h"
 #include "winsock2.h"
+#include "winhttp.h"
 #include "ole2.h"
 #include "netfw.h"
 #include "natupnp.h"
@@ -40,11 +41,49 @@ static struct
 {
     LONG refs;
     BOOL winsock_initialized;
+    WCHAR locationW[256];
 }
 upnp_gateway_connection;
 
 static SRWLOCK upnp_gateway_connection_lock = SRWLOCK_INIT;
 
+static BOOL parse_search_response( char *response, WCHAR *locationW, unsigned int location_size )
+{
+    char *saveptr = NULL, *tok, *tok2;
+    unsigned int status;
+
+    tok = strtok_s( response, "\n", &saveptr );
+    if (!tok) return FALSE;
+
+    /* HTTP/1.1 200 OK */
+    tok2 = strtok( tok, " " );
+    if (!tok2) return FALSE;
+    tok2 = strtok( NULL, " " );
+    if (!tok2) return FALSE;
+    status = atoi( tok2 );
+    if (status != HTTP_STATUS_OK)
+    {
+        WARN( "status %u.\n", status );
+        return FALSE;
+    }
+    while ((tok = strtok_s( NULL, "\n", &saveptr )))
+    {
+        tok2 = strtok( tok, " " );
+        if (!tok2) continue;
+        if (!stricmp( tok2, "LOCATION:" ))
+        {
+            tok2 = strtok( NULL, " \r" );
+            if (!tok2)
+            {
+                WARN( "Error parsing location.\n" );
+                return FALSE;
+            }
+            return !!MultiByteToWideChar( CP_UTF8, 0, tok2, -1, locationW,  location_size / 2 );
+        }
+    }
+    return FALSE;
+}
+
 static void gateway_connection_cleanup(void)
 {
     TRACE( ".\n" );
@@ -118,6 +157,13 @@ static BOOL init_gateway_connection(void)
         return FALSE;
     }
     TRACE( "Received reply from gateway, len %d.\n", len );
+    buffer[len] = 0;
+    if (!parse_search_response( buffer, upnp_gateway_connection.locationW, sizeof(upnp_gateway_connection.locationW) ))
+    {
+        WARN( "Error parsing response.\n" );
+        return FALSE;
+    }
+    TRACE( "Gateway description location %s.\n", debugstr_w(upnp_gateway_connection.locationW) );
     return TRUE;
 }
 




More information about the wine-cvs mailing list