X-Git-Url: https://git.tcpdump.org/libpcap/blobdiff_plain/936df0fbc137374a0ce9ab0f838815551419711e..cc3ca65d6519faf3a0e4609b5150757c14af36e9:/nametoaddr.c diff --git a/nametoaddr.c b/nametoaddr.c index 5835e4d1..71280b31 100644 --- a/nametoaddr.c +++ b/nametoaddr.c @@ -22,11 +22,6 @@ * These functions are not time critical. */ -#ifndef lint -static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/libpcap/nametoaddr.c,v 1.83 2008-02-06 10:21:30 guy Exp $ (LBL)"; -#endif - #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -36,10 +31,36 @@ static const char rcsid[] _U_ = #include #endif -#ifdef WIN32 +#ifdef _WIN32 #include -#else /* WIN32 */ +#ifdef INET6 +/* + * To quote the MSDN page for getaddrinfo() at + * + * https://msdn.microsoft.com/en-us/library/windows/desktop/ms738520(v=vs.85).aspx + * + * "Support for getaddrinfo on Windows 2000 and older versions + * The getaddrinfo function was added to the Ws2_32.dll on Windows XP and + * later. To execute an application that uses this function on earlier + * versions of Windows, then you need to include the Ws2tcpip.h and + * Wspiapi.h files. When the Wspiapi.h include file is added, the + * getaddrinfo function is defined to the WspiapiGetAddrInfo inline + * function in the Wspiapi.h file. At runtime, the WspiapiGetAddrInfo + * function is implemented in such a way that if the Ws2_32.dll or the + * Wship6.dll (the file containing getaddrinfo in the IPv6 Technology + * Preview for Windows 2000) does not include getaddrinfo, then a + * version of getaddrinfo is implemented inline based on code in the + * Wspiapi.h header file. This inline code will be used on older Windows + * platforms that do not natively support the getaddrinfo function." + * + * We use getaddrinfo(), so we include Wspiapi.h here. pcap-stdinc.h + * includes Ws2tcpip.h, so we don't need to include it ourselves. + */ +#include +#endif + +#else /* _WIN32 */ #include #include /* concession to AIX */ @@ -47,9 +68,9 @@ static const char rcsid[] _U_ = #include #include -#endif /* WIN32 */ +#endif /* _WIN32 */ -#ifndef WIN32 +#ifndef _WIN32 #ifdef HAVE_ETHER_HOSTTON /* * XXX - do we need any of this if doesn't declare @@ -67,7 +88,7 @@ struct rtentry; /* declarations in */ #endif /* HAVE_ETHER_HOSTTON */ #include #include -#endif /* WIN32 */ +#endif /* _WIN32 */ #include #include @@ -79,6 +100,7 @@ struct rtentry; /* declarations in */ #include "gencode.h" #include +#include "nametoaddr.h" #ifdef HAVE_OS_PROTO_H #include "os-proto.h" @@ -145,7 +167,7 @@ pcap_nametoaddrinfo(const char *name) bpf_u_int32 pcap_nametonetaddr(const char *name) { -#ifndef WIN32 +#ifndef _WIN32 struct netent *np; if ((np = getnetbyname(name)) != NULL) @@ -155,6 +177,15 @@ pcap_nametonetaddr(const char *name) #else /* * There's no "getnetbyname()" on Windows. + * + * XXX - I guess we could use the BSD code to read + * C:\Windows\System32\drivers\etc/networks, assuming + * that's its home on all the versions of Windows + * we use, but that file probably just has the loopback + * network on 127/24 on 99 44/100% of Windows machines. + * + * (Heck, these days it probably just has that on 99 44/100% + * of *UN*X* machines.) */ return 0; #endif @@ -247,6 +278,7 @@ pcap_nametoportrange(const char *name, int *port1, int *port2, int *proto) free(cpy); return 0; } + free(cpy); if (*proto != save_proto) *proto = PROTO_UNDEF; @@ -278,8 +310,14 @@ struct eproto { u_short p; }; -/* Static data base of ether protocol types. */ -struct eproto eproto_db[] = { +/* + * Static data base of ether protocol types. + * tcpdump used to import this, and it's declared as an export on + * Debian, at least, so make it a public symbol, even though we + * don't officially export it by declaring it in a header file. + * (Programs *should* do this themselves, as tcpdump now does.) + */ +PCAP_API_DEF struct eproto eproto_db[] = { { "pup", ETHERTYPE_PUP }, { "xns", ETHERTYPE_NS }, { "ip", ETHERTYPE_IP }, @@ -387,7 +425,7 @@ __pcap_atodn(const char *s, bpf_u_int32 *addr) u_int node, area; if (sscanf(s, "%d.%d", &area, &node) != 2) - bpf_error("malformed decnet address '%s'", s); + return(0); *addr = (area << AREASHIFT) & AREAMASK; *addr |= (node & NODEMASK); @@ -414,6 +452,8 @@ pcap_ether_aton(const char *s) register u_int d; e = ep = (u_char *)malloc(6); + if (e == NULL) + return (NULL); while (*s) { if (*s == ':' || *s == '.' || *s == '-') @@ -489,23 +529,20 @@ pcap_ether_hostton(const char *name) } #endif -u_short -__pcap_nametodnaddr(const char *name) +int +__pcap_nametodnaddr(const char *name, u_short *res) { #ifdef DECNETLIB struct nodeent *getnodebyname(); struct nodeent *nep; - unsigned short res; nep = getnodebyname(name); if (nep == ((struct nodeent *)0)) - bpf_error("unknown decnet host name '%s'\n", name); + return(0); - memcpy((char *)&res, (char *)nep->n_addr, sizeof(unsigned short)); - return(res); + memcpy((char *)res, (char *)nep->n_addr, sizeof(unsigned short)); + return(1); #else - bpf_error("decnet name support not included, '%s' cannot be translated\n", - name); return(0); #endif }