[PATCH v5] ws2_32: Drop dependencies on system getprotoby(name|number) functions

Alex Henrie alexhenrie24 at gmail.com
Wed Jul 15 02:19:04 CDT 2020


Signed-off-by: Alex Henrie <alexhenrie24 at gmail.com>
---
v5: Remove the controversial line break (for real this time)
---
 configure.ac                 |   2 -
 dlls/ws2_32/socket.c         |  69 ++++--------------------
 dlls/ws2_32/tests/protocol.c | 100 +++++++++++++++++++++++++++++++++++
 3 files changed, 109 insertions(+), 62 deletions(-)

diff --git a/configure.ac b/configure.ac
index 4829648c3a..9002ce8d60 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2245,8 +2245,6 @@ AC_CHECK_FUNCS(\
 	getaddrinfo \
 	getnameinfo \
 	getnetbyname \
-	getprotobyname \
-	getprotobynumber \
 	getservbyport \
 )
 
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index d7eddde44d..e7f08fe14a 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -6509,56 +6509,23 @@ static const struct { int prot; const char *names[3]; } protocols[] =
 {
     {   0, { "ip", "IP" }},
     {   1, { "icmp", "ICMP" }},
-    {   2, { "igmp", "IGMP" }},
     {   3, { "ggp", "GGP" }},
     {   6, { "tcp", "TCP" }},
     {   8, { "egp", "EGP" }},
-    {   9, { "igp", "IGP" }},
     {  12, { "pup", "PUP" }},
     {  17, { "udp", "UDP" }},
     {  20, { "hmp", "HMP" }},
     {  22, { "xns-idp", "XNS-IDP" }},
     {  27, { "rdp", "RDP" }},
-    {  29, { "iso-tp4", "ISO-TP4" }},
-    {  33, { "dccp", "DCCP" }},
-    {  36, { "xtp", "XTP" }},
-    {  37, { "ddp", "DDP" }},
-    {  38, { "idpr-cmtp", "IDPR-CMTP" }},
     {  41, { "ipv6", "IPv6" }},
     {  43, { "ipv6-route", "IPv6-Route" }},
     {  44, { "ipv6-frag", "IPv6-Frag" }},
-    {  45, { "idrp", "IDRP" }},
-    {  46, { "rsvp", "RSVP" }},
-    {  47, { "gre", "GRE" }},
     {  50, { "esp", "ESP" }},
     {  51, { "ah", "AH" }},
-    {  57, { "skip", "SKIP" }},
     {  58, { "ipv6-icmp", "IPv6-ICMP" }},
     {  59, { "ipv6-nonxt", "IPv6-NoNxt" }},
     {  60, { "ipv6-opts", "IPv6-Opts" }},
     {  66, { "rvd", "RVD" }},
-    {  73, { "rspf", "RSPF" }},
-    {  81, { "vmtp", "VMTP" }},
-    {  88, { "eigrp", "EIGRP" }},
-    {  89, { "ospf", "OSPFIGP" }},
-    {  93, { "ax.25", "AX.25" }},
-    {  94, { "ipip", "IPIP" }},
-    {  97, { "etherip", "ETHERIP" }},
-    {  98, { "encap", "ENCAP" }},
-    { 103, { "pim", "PIM" }},
-    { 108, { "ipcomp", "IPCOMP" }},
-    { 112, { "vrrp", "VRRP" }},
-    { 115, { "l2tp", "L2TP" }},
-    { 124, { "isis", "ISIS" }},
-    { 132, { "sctp", "SCTP" }},
-    { 133, { "fc", "FC" }},
-    { 135, { "mobility-header", "Mobility-Header" }},
-    { 136, { "udplite", "UDPLite" }},
-    { 137, { "mpls-in-ip", "MPLS-in-IP" }},
-    { 139, { "hip", "HIP" }},
-    { 140, { "shim6", "Shim6" }},
-    { 141, { "wesp", "WESP" }},
-    { 142, { "rohc", "ROHC" }},
 };
 
 /***********************************************************************
@@ -6567,19 +6534,11 @@ static const struct { int prot; const char *names[3]; } protocols[] =
 struct WS_protoent* WINAPI WS_getprotobyname(const char* name)
 {
     struct WS_protoent* retval = NULL;
-#ifdef HAVE_GETPROTOBYNAME
-    struct protoent*     proto;
-    EnterCriticalSection( &csWSgetXXXbyYYY );
-    if( (proto = getprotobyname(name)) != NULL )
-        retval = WS_create_pe( proto->p_name, proto->p_aliases, proto->p_proto );
-    LeaveCriticalSection( &csWSgetXXXbyYYY );
-#endif
-    if (!retval)
+    unsigned int i;
+    for (i = 0; i < ARRAY_SIZE(protocols); i++)
     {
-        unsigned int i;
-        for (i = 0; i < ARRAY_SIZE(protocols); i++)
+        if (_strnicmp( protocols[i].names[0], name, -1 ) == 0)
         {
-            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;
@@ -6601,23 +6560,13 @@ struct WS_protoent* WINAPI WS_getprotobyname(const char* name)
 struct WS_protoent* WINAPI WS_getprotobynumber(int number)
 {
     struct WS_protoent* retval = NULL;
-#ifdef HAVE_GETPROTOBYNUMBER
-    struct protoent*     proto;
-    EnterCriticalSection( &csWSgetXXXbyYYY );
-    if( (proto = getprotobynumber(number)) != NULL )
-        retval = WS_create_pe( proto->p_name, proto->p_aliases, proto->p_proto );
-    LeaveCriticalSection( &csWSgetXXXbyYYY );
-#endif
-    if (!retval)
+    unsigned int i;
+    for (i = 0; i < ARRAY_SIZE(protocols); i++)
     {
-        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 (protocols[i].prot != number) continue;
+        retval = WS_create_pe( protocols[i].names[0], (char **)protocols[i].names + 1,
+                               protocols[i].prot );
+        break;
     }
     if (!retval)
     {
diff --git a/dlls/ws2_32/tests/protocol.c b/dlls/ws2_32/tests/protocol.c
index 99bd1373a9..de5fe36d45 100644
--- a/dlls/ws2_32/tests/protocol.c
+++ b/dlls/ws2_32/tests/protocol.c
@@ -192,6 +192,104 @@ static void test_WSAEnumProtocolsW(void)
     }
 }
 
+struct protocol
+{
+    int prot;
+    const char *names[2];
+    BOOL missing_from_xp;
+};
+
+static const struct protocol 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" }, TRUE},
+    {  43, { "ipv6-route", "IPv6-Route" }, TRUE},
+    {  44, { "ipv6-frag", "IPv6-Frag" }, TRUE},
+    {  50, { "esp", "ESP" }},
+    {  51, { "ah", "AH" }},
+    {  58, { "ipv6-icmp", "IPv6-ICMP" }, TRUE},
+    {  59, { "ipv6-nonxt", "IPv6-NoNxt" }, TRUE},
+    {  60, { "ipv6-opts", "IPv6-Opts" }, TRUE},
+    {  66, { "rvd", "RVD" }},
+};
+
+static const struct protocol *find_protocol(int number)
+{
+    int i;
+    for (i = 0; i < ARRAY_SIZE(protocols); i++)
+    {
+        if (protocols[i].prot == number)
+            return &protocols[i];
+    }
+    return NULL;
+}
+
+static void test_getprotobyname(void)
+{
+    struct protoent *ent;
+    char all_caps_name[16];
+    int i, j;
+
+    for (i = 0; i < ARRAY_SIZE(protocols); i++)
+    {
+        for (j = 0; j < ARRAY_SIZE(protocols[0].names); j++)
+        {
+            ent = getprotobyname(protocols[i].names[j]);
+            ok((ent && ent->p_proto == protocols[i].prot) || broken(!ent && protocols[i].missing_from_xp),
+               "Expected %s to be protocol number %d, got %d\n",
+               wine_dbgstr_a(protocols[i].names[j]), protocols[i].prot, ent ? ent->p_proto : -1);
+        }
+
+        for (j = 0; protocols[i].names[0][j]; j++)
+            all_caps_name[j] = toupper(protocols[i].names[0][j]);
+        all_caps_name[j] = 0;
+        ent = getprotobyname(all_caps_name);
+        ok((ent && ent->p_proto == protocols[i].prot) || broken(!ent && protocols[i].missing_from_xp),
+           "Expected %s to be protocol number %d, got %d\n",
+           wine_dbgstr_a(all_caps_name), protocols[i].prot, ent ? ent->p_proto : -1);
+    }
+}
+
+static void test_getprotobynumber(void)
+{
+    struct protoent *ent;
+    const struct protocol *ref;
+    int i;
+
+    for (i = -1; i <= 256; i++)
+    {
+        ent = getprotobynumber(i);
+        ref = find_protocol(i);
+
+        if (!ref)
+        {
+            ok(!ent, "Expected protocol number %d to be undefined, got %s\n",
+               i, wine_dbgstr_a(ent ? ent->p_name : NULL));
+            continue;
+        }
+
+        ok((ent && ent->p_name && strcmp(ent->p_name, ref->names[0]) == 0) ||
+           broken(!ent && ref->missing_from_xp),
+           "Expected protocol number %d to be %s, got %s\n",
+           i, ref->names[0], wine_dbgstr_a(ent ? ent->p_name : NULL));
+
+        ok((ent && ent->p_aliases && ent->p_aliases[0] &&
+            strcmp(ent->p_aliases[0], ref->names[1]) == 0) ||
+           broken(!ent && ref->missing_from_xp),
+           "Expected protocol number %d alias 0 to be %s, got %s\n",
+           i, ref->names[0], wine_dbgstr_a(ent && ent->p_aliases ? ent->p_aliases[0] : NULL));
+    }
+}
+
 START_TEST( protocol )
 {
     WSADATA data;
@@ -201,4 +299,6 @@ START_TEST( protocol )
 
     test_WSAEnumProtocolsA();
     test_WSAEnumProtocolsW();
+    test_getprotobyname();
+    test_getprotobynumber();
 }
-- 
2.27.0




More information about the wine-devel mailing list