ws2_32: Avoid depending on system getprotoby(name|number) functions.
Signed-off-by: Alex Henrie <alexhenrie24@gmail.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
d2b0c10000
commit
a16f91ae36
5 changed files with 114 additions and 75 deletions
2
configure
vendored
2
configure
vendored
|
@ -18332,8 +18332,6 @@ for ac_func in \
|
|||
getaddrinfo \
|
||||
getnameinfo \
|
||||
getnetbyname \
|
||||
getprotobyname \
|
||||
getprotobynumber \
|
||||
getservbyport \
|
||||
|
||||
do :
|
||||
|
|
|
@ -2245,8 +2245,6 @@ AC_CHECK_FUNCS(\
|
|||
getaddrinfo \
|
||||
getnameinfo \
|
||||
getnetbyname \
|
||||
getprotobyname \
|
||||
getprotobynumber \
|
||||
getservbyport \
|
||||
)
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue