Alex Henrie : ws2_32: Avoid depending on system getprotoby(name|number) functions.
Alexandre Julliard
julliard at winehq.org
Fri Jul 17 16:30:46 CDT 2020
Module: wine
Branch: master
Commit: a16f91ae366b9f3f8e371598e13f4ef242f50af3
URL: https://source.winehq.org/git/wine.git/?a=commit;h=a16f91ae366b9f3f8e371598e13f4ef242f50af3
Author: Alex Henrie <alexhenrie24 at gmail.com>
Date: Wed Jul 15 01:19:04 2020 -0600
ws2_32: Avoid depending on system getprotoby(name|number) functions.
Signed-off-by: Alex Henrie <alexhenrie24 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
configure | 2 -
configure.ac | 2 -
dlls/ws2_32/socket.c | 79 ++++++----------------------------
dlls/ws2_32/tests/protocol.c | 100 +++++++++++++++++++++++++++++++++++++++++++
include/config.h.in | 6 ---
5 files changed, 114 insertions(+), 75 deletions(-)
diff --git a/configure b/configure
index 24d0a1d8b4..35f8b63ae0 100755
--- a/configure
+++ b/configure
@@ -18332,8 +18332,6 @@ for ac_func in \
getaddrinfo \
getnameinfo \
getnetbyname \
- getprotobyname \
- getprotobynumber \
getservbyport \
do :
diff --git a/configure.ac b/configure.ac
index d914e3eca8..928f8ebd1b 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..12126372d5 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,23 +6534,14 @@ 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 )) continue;
- retval = WS_create_pe( protocols[i].names[0], (char **)protocols[i].names + 1,
- protocols[i].prot );
- break;
- }
+ 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)
{
@@ -6601,23 +6559,14 @@ 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();
}
diff --git a/include/config.h.in b/include/config.h.in
index 720cbd4a5d..3a3277e613 100644
--- a/include/config.h.in
+++ b/include/config.h.in
@@ -245,12 +245,6 @@
/* Define to 1 if you have the `getopt_long_only' function. */
#undef HAVE_GETOPT_LONG_ONLY
-/* Define to 1 if you have the `getprotobyname' function. */
-#undef HAVE_GETPROTOBYNAME
-
-/* Define to 1 if you have the `getprotobynumber' function. */
-#undef HAVE_GETPROTOBYNUMBER
-
/* Define to 1 if you have the `getservbyport' function. */
#undef HAVE_GETSERVBYPORT
More information about the wine-cvs
mailing list