windows-nt/Source/XPSP1/NT/net/tcpip/tools/checkv4/checkv4.c
2020-09-26 16:20:57 +08:00

177 lines
4.8 KiB
C

#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
//
// Localization library and MessageIds.
//
#include <nls.h>
#include "localmsg.h"
int
filematch(
char *pszfile,
char **ppszpat,
int cpat,
int fsubdirs
);
typedef struct token_tmp {
char *v4;
char *v6;
char *both;
} token_t;
token_t token[] = {
{ "AF_INET", "AF_INET6", NULL },
{ "PF_INET", "PF_INET6", NULL },
{ "in_addr", "in6_addr", NULL },
{ "IN_ADDR", "IN6_ADDR", NULL },
{ "PIN_ADDR", "PIN6_ADDR", NULL },
{ "LPIN_ADDR", "LPIN6_ADDR", NULL },
{ "IPAddr", NULL, "SOCKADDR_STORAGE" },
{ "sockaddr_in", "sockaddr_in6", "sockaddr_storage" },
{ "SOCKADDR_IN", "SOCKADDR_IN6", "SOCKADDR_STORAGE" },
{ "PSOCKADDR_IN", "PSOCKADDR_IN6", "PSOCKADDR_STORAGE" },
{ "LPSOCKADDR_IN", "LPSOCKADDR_IN6", "LPSOCKADDR_STORAGE" },
{ "INADDR_ANY", "in6addr_any", "getaddrinfo with nodename=NULL and AI_PASSIVE" },
{ "INADDR_LOOPBACK", "in6addr_loopback", NULL },
{ "IPPROTO_IP", "IPPROTO_IPV6", NULL },
{ "IP_MULTICAST_IF", "IPV6_MULTICAST_IF", NULL },
{ "IP_MULTICAST_TTL", "IPV6_MULTICAST_HOPS","SIO_MULTICAST_SCOPE" },
{ "IP_MULTICAST_LOOP", "IPV6_MULTICAST_LOOP","SIO_MULTIPOINT_LOOPBACK" },
{ "IP_ADD_MEMBERSHIP", "IPV6_JOIN_GROUP", "WSAJoinLeaf" },
{ "IP_DROP_MEMBERSHIP","IPV6_LEAVE_GROUP", NULL },
{ "ip_mreq", "ipv6_mreq", NULL },
{ "gethostbyname", NULL, "getaddrinfo" },
{ "hostent", NULL, "addrinfo" },
{ "HOSTENT", NULL, "ADDRINFO" },
{ "PHOSTENT", NULL, "LPADDRINFO" },
{ "LPHOSTENT", NULL, "LPADDRINFO" },
{ "inet_addr", NULL, "WSAStringToAddress or getaddrinfo with AI_NUMERICHOST"},
{ "gethostbyaddr", NULL, "getnameinfo" },
{ "inet_ntoa", NULL, "WSAAddressToString or getnameinfo with NI_NUMERICHOST"},
{ "IN_MULTICAST", "IN6_IS_ADDR_MULTICAST", NULL },
{ "IN_CLASSD", "IN6_IS_ADDR_MULTICAST", NULL },
{ "IP_TTL", "IPV6_UNICAST_HOPS", NULL },
{ "IN_CLASSA", NULL, NULL },
{ "IN_CLASSB", NULL, NULL },
{ "IN_CLASSC", NULL, NULL },
{ "INADDR_BROADCAST", NULL, NULL },
{ "WSAAsyncGetHostByAddr", NULL, "getnameinfo" },
{ "WSAAsyncGetHostByName", NULL, "getaddrinfo" },
{ NULL, NULL, NULL },
};
void
process_line(filename, lineno, str)
char *filename;
int lineno;
char *str;
{
int i, len;
char *p;
for (i=0; token[i].v4 != NULL; i++) {
p = strstr(str, token[i].v4);
if (p == NULL)
continue;
if (p>str && (isalnum(p[-1]) || p[-1] == '_'))
continue; /* not the start of a token */
len = strlen(token[i].v4);
if (isalnum(p[len]) || p[len] == '_')
continue; /* not the end of a token */
NlsPutMsg(STDOUT, CHECKV4_MESSAGE_0, filename, lineno, token[i].v4);
// printf("%s(%d) : %s : ", filename, lineno, token[i].v4);
if (token[i].both) {
NlsPutMsg(STDOUT, CHECKV4_MESSAGE_1, token[i].both);
// printf("use %s instead", token[i].both);
}
if (token[i].v6) {
if (token[i].both)
NlsPutMsg(STDOUT, CHECKV4_MESSAGE_2);
// printf(", or ");
NlsPutMsg(STDOUT, CHECKV4_MESSAGE_3, token[i].v6);
// printf("use %s in addition for IPv6 support", token[i].v6);
}
if (!token[i].both && !token[i].v6) {
NlsPutMsg(STDOUT, CHECKV4_MESSAGE_4);
// printf("valid for IPv4-only");
}
NlsPutMsg(STDOUT, CHECKV4_MESSAGE_5);
// printf("\n");
}
}
void
process_file(filename)
char *filename;
{
FILE *fp;
char buff[1024];
int lineno;
fp = fopen(filename, "r");
if (fp == NULL) {
NlsPutMsg(STDOUT, CHECKV4_MESSAGE_6, filename);
// printf("%s: cannot open file\n", filename);
return;
}
lineno = 0;
while (fgets(buff, sizeof(buff), fp)) {
lineno++;
process_line(filename, lineno, buff);
}
fclose(fp);
}
int
__cdecl
main(argc, argv)
int argc;
char **argv;
{
int i;
int recurse = 0;
char szfile[MAX_PATH];
argc--;
argv++;
if (argc>0) {
if (!_stricmp(argv[0], "/s")) {
recurse = 1;
argc--;
argv++;
} else if (!_stricmp(argv[0], "/?")) {
NlsPutMsg(STDOUT, CHECKV4_USAGE);
return 1;
}
}
if (argc < 1) {
NlsPutMsg(STDOUT, CHECKV4_MESSAGE_7);
return 1;
}
while (filematch(szfile,argv,argc,recurse) >= 0) {
process_file(szfile);
}
return 0;
}