Zebediah Figura : ws2_32: Move protocol lookup functions to protocol.c.

Alexandre Julliard julliard at winehq.org
Mon May 3 16:37:06 CDT 2021


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

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Fri Apr 30 19:10:01 2021 -0500

ws2_32: Move protocol lookup functions to protocol.c.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ws2_32/protocol.c | 144 +++++++++++++++++++++++++++++++++++++++++++++++++
 dlls/ws2_32/socket.c   | 103 -----------------------------------
 2 files changed, 144 insertions(+), 103 deletions(-)

diff --git a/dlls/ws2_32/protocol.c b/dlls/ws2_32/protocol.c
index c2e661c03dc..ad840aaeb6f 100644
--- a/dlls/ws2_32/protocol.c
+++ b/dlls/ws2_32/protocol.c
@@ -1388,3 +1388,147 @@ int WINAPI GetHostNameW( WCHAR *name, int namelen )
     MultiByteToWideChar( CP_ACP, 0, buf, -1, name, namelen );
     return 0;
 }
+
+
+static int list_size( char **list, int item_size )
+{
+    int i, size = 0;
+    if (list)
+    {
+        for (i = 0; list[i]; i++)
+            size += (item_size ? item_size : strlen(list[i]) + 1);
+        size += (i + 1) * sizeof(char *);
+    }
+    return size;
+}
+
+static int list_dup( char **src, char **dst, int item_size )
+{
+    char *p;
+    int i;
+
+    for (i = 0; src[i]; i++)
+        ;
+    p = (char *)(dst + i + 1);
+
+    for (i = 0; src[i]; i++)
+    {
+        int count = item_size ? item_size : strlen(src[i]) + 1;
+        memcpy( p, src[i], count );
+        dst[i] = p;
+        p += count;
+    }
+    dst[i] = NULL;
+    return p - (char *)dst;
+}
+
+static const struct
+{
+    int prot;
+    const char *names[3];
+}
+protocols[] =
+{
+    { 0, {"ip", "IP"}},
+    { 1, {"icmp", "ICMP"}},
+    { 3, {"ggp", "GGP"}},
+    { 6, {"tcp", "TCP"}},
+    { 8, {"egp", "EGP"}},
+    {12, {"pup", "PUP"}},
+    {17, {"udp", "UDP"}},
+    {20, {"hmp", "HMP"}},
+    {22, {"xns-idp", "XNS-IDP"}},
+    {27, {"rdp", "RDP"}},
+    {41, {"ipv6", "IPv6"}},
+    {43, {"ipv6-route", "IPv6-Route"}},
+    {44, {"ipv6-frag", "IPv6-Frag"}},
+    {50, {"esp", "ESP"}},
+    {51, {"ah", "AH"}},
+    {58, {"ipv6-icmp", "IPv6-ICMP"}},
+    {59, {"ipv6-nonxt", "IPv6-NoNxt"}},
+    {60, {"ipv6-opts", "IPv6-Opts"}},
+    {66, {"rvd", "RVD"}},
+};
+
+static struct WS_protoent *get_protoent_buffer( unsigned int size )
+{
+    struct per_thread_data *data = get_per_thread_data();
+
+    if (data->pe_buffer)
+    {
+        if (data->pe_len >= size) return data->pe_buffer;
+        HeapFree( GetProcessHeap(), 0, data->pe_buffer );
+    }
+    data->pe_len = size;
+    data->pe_buffer = HeapAlloc( GetProcessHeap(), 0, size );
+    if (!data->pe_buffer) SetLastError( WSAENOBUFS );
+    return data->pe_buffer;
+}
+
+static struct WS_protoent *create_protoent( const char *name, char **aliases, int prot )
+{
+    struct WS_protoent *ret;
+    unsigned int size = sizeof(*ret) + strlen( name ) + sizeof(char *) + list_size( aliases, 0 );
+
+    if (!(ret = get_protoent_buffer( size ))) return NULL;
+    ret->p_proto = prot;
+    ret->p_name = (char *)(ret + 1);
+    strcpy( ret->p_name, name );
+    ret->p_aliases = (char **)ret->p_name + strlen( name ) / sizeof(char *) + 1;
+    list_dup( aliases, ret->p_aliases, 0 );
+    return ret;
+}
+
+
+/***********************************************************************
+ *      getprotobyname   (ws2_32.53)
+ */
+struct WS_protoent * WINAPI WS_getprotobyname( const char *name )
+{
+    struct WS_protoent *retval = NULL;
+    unsigned int i;
+
+    for (i = 0; i < ARRAY_SIZE(protocols); i++)
+    {
+        if (!_strnicmp( protocols[i].names[0], name, -1 ))
+        {
+            retval = create_protoent( protocols[i].names[0], (char **)protocols[i].names + 1,
+                                      protocols[i].prot );
+            break;
+        }
+    }
+    if (!retval)
+    {
+        WARN( "protocol %s not found\n", debugstr_a(name) );
+        SetLastError( WSANO_DATA );
+    }
+    TRACE( "%s ret %p\n", debugstr_a(name), retval );
+    return retval;
+}
+
+
+/***********************************************************************
+ *      getprotobynumber   (ws2_32.54)
+ */
+struct WS_protoent * WINAPI WS_getprotobynumber( int number )
+{
+    struct WS_protoent *retval = NULL;
+    unsigned int i;
+
+    for (i = 0; i < ARRAY_SIZE(protocols); i++)
+    {
+        if (protocols[i].prot == number)
+        {
+            retval = create_protoent( protocols[i].names[0], (char **)protocols[i].names + 1,
+                                      protocols[i].prot );
+            break;
+        }
+    }
+    if (!retval)
+    {
+        WARN( "protocol %d not found\n", number );
+        SetLastError( WSANO_DATA );
+    }
+    TRACE( "%d ret %p\n", number, retval );
+    return retval;
+}
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 5ced4720558..c3c73568c83 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -609,7 +609,6 @@ int num_startup;
 static FARPROC blocking_hook = (FARPROC)WSA_DefaultBlockingHook;
 
 /* function prototypes */
-static struct WS_protoent *WS_create_pe( const char *name, char **aliases, int prot );
 static struct WS_servent *WS_dup_se(const struct servent* p_se);
 static int ws_protocol_info(SOCKET s, int unicode, WSAPROTOCOL_INFOW *buffer, int *size);
 
@@ -1578,21 +1577,6 @@ static struct WS_servent *check_buffer_se(int size)
     return ptb->se_buffer;
 }
 
-static struct WS_protoent *check_buffer_pe(int size)
-{
-    struct per_thread_data * ptb = get_per_thread_data();
-    if (ptb->pe_buffer)
-    {
-        if (ptb->pe_len >= size ) return ptb->pe_buffer;
-        HeapFree( GetProcessHeap(), 0, ptb->pe_buffer );
-    }
-    ptb->pe_buffer = HeapAlloc( GetProcessHeap(), 0, (ptb->pe_len = size) );
-    if (!ptb->pe_buffer) SetLastError(WSAENOBUFS);
-    return ptb->pe_buffer;
-}
-
-/* ----------------------------------- i/o APIs */
-
 static inline BOOL supported_pf(int pf)
 {
     switch (pf)
@@ -5737,79 +5721,6 @@ SOCKET WINAPI WS_socket(int af, int type, int protocol)
 }
 
 
-static const struct { int prot; const char *names[3]; } protocols[] =
-{
-    {   0, { "ip", "IP" }},
-    {   1, { "icmp", "ICMP" }},
-    {   3, { "ggp", "GGP" }},
-    {   6, { "tcp", "TCP" }},
-    {   8, { "egp", "EGP" }},
-    {  12, { "pup", "PUP" }},
-    {  17, { "udp", "UDP" }},
-    {  20, { "hmp", "HMP" }},
-    {  22, { "xns-idp", "XNS-IDP" }},
-    {  27, { "rdp", "RDP" }},
-    {  41, { "ipv6", "IPv6" }},
-    {  43, { "ipv6-route", "IPv6-Route" }},
-    {  44, { "ipv6-frag", "IPv6-Frag" }},
-    {  50, { "esp", "ESP" }},
-    {  51, { "ah", "AH" }},
-    {  58, { "ipv6-icmp", "IPv6-ICMP" }},
-    {  59, { "ipv6-nonxt", "IPv6-NoNxt" }},
-    {  60, { "ipv6-opts", "IPv6-Opts" }},
-    {  66, { "rvd", "RVD" }},
-};
-
-/***********************************************************************
- *		getprotobyname		(WS2_32.53)
- */
-struct WS_protoent* WINAPI WS_getprotobyname(const char* name)
-{
-    struct WS_protoent* retval = NULL;
-    unsigned int i;
-
-    for (i = 0; i < ARRAY_SIZE(protocols); i++)
-    {
-        if (_strnicmp( protocols[i].names[0], name, -1 )) continue;
-        retval = WS_create_pe( protocols[i].names[0], (char **)protocols[i].names + 1,
-                               protocols[i].prot );
-        break;
-    }
-    if (!retval)
-    {
-        WARN( "protocol %s not found\n", debugstr_a(name) );
-        SetLastError(WSANO_DATA);
-    }
-    TRACE( "%s ret %p\n", debugstr_a(name), retval );
-    return retval;
-}
-
-
-/***********************************************************************
- *		getprotobynumber	(WS2_32.54)
- */
-struct WS_protoent* WINAPI WS_getprotobynumber(int number)
-{
-    struct WS_protoent* retval = NULL;
-    unsigned int i;
-
-    for (i = 0; i < ARRAY_SIZE(protocols); i++)
-    {
-        if (protocols[i].prot != number) continue;
-        retval = WS_create_pe( protocols[i].names[0], (char **)protocols[i].names + 1,
-                               protocols[i].prot );
-        break;
-    }
-    if (!retval)
-    {
-        WARN( "protocol %d not found\n", number );
-        SetLastError(WSANO_DATA);
-    }
-    TRACE("%i ret %p\n", number, retval);
-    return retval;
-}
-
-
 /***********************************************************************
  *		getservbyname		(WS2_32.55)
  */
@@ -6313,20 +6224,6 @@ static int list_dup(char** l_src, char** l_to, int item_size)
    return p - (char *)l_to;
 }
 
-static struct WS_protoent *WS_create_pe( const char *name, char **aliases, int prot )
-{
-    struct WS_protoent *ret;
-    unsigned int size = sizeof(*ret) + strlen(name) + sizeof(char *) + list_size(aliases, 0);
-
-    if (!(ret = check_buffer_pe( size ))) return NULL;
-    ret->p_proto = prot;
-    ret->p_name = (char *)(ret + 1);
-    strcpy( ret->p_name, name );
-    ret->p_aliases = (char **)ret->p_name + strlen(name) / sizeof(char *) + 1;
-    list_dup( aliases, ret->p_aliases, 0 );
-    return ret;
-}
-
 /* ----- servent */
 
 static struct WS_servent *WS_dup_se(const struct servent* p_se)




More information about the wine-cvs mailing list