[mingw-wpcap: 15/22] fix build and Windows 2000

Kalev Lember kalev at fedoraproject.org
Wed Mar 7 18:13:17 UTC 2012


commit a0cb4f6577665ea5e0d05f07a69e8a766335c851
Author: Thomas Sailer <t.sailer at alumni.ethz.ch>
Date:   Wed Nov 30 23:08:57 2011 +0100

    fix build and Windows 2000

 mingw32-wpcap.spec |   11 +-
 wpcap-w2k.patch    |  891 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 901 insertions(+), 1 deletions(-)
---
diff --git a/mingw32-wpcap.spec b/mingw32-wpcap.spec
index e2e6230..e8c18b6 100644
--- a/mingw32-wpcap.spec
+++ b/mingw32-wpcap.spec
@@ -7,7 +7,7 @@
 
 Name:           mingw32-wpcap
 Version:        %{versionmajor}.%{versionminor}.final%{versionsuffix}
-Release:        2%{?dist}
+Release:        3%{?dist}
 Summary:        MinGW user-level packet capture
 
 Group:          Development/Libraries
@@ -16,6 +16,7 @@ URL:            http://www.winpcap.org/
 Source0:        http://www.winpcap.org/install/bin/WpcapSrc_%{versionmajor}_%{versionminor}_%{versionsuffix}.zip
 Source1:        wpcap.pc
 Patch0:         wpcap.patch
+Patch1:         wpcap-w2k.patch
 BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 BuildArch:      noarch
 
@@ -69,6 +70,10 @@ pushd wpcap/libpcap/Win32/Include/
 mv ip6_misc.h IP6_misc.h
 popd
 
+%patch1 -p0 -b .w2k
+
+find . -name GNUmakefile |xargs perl -i -pe 's,-mno-cygwin,,'
+
 %build
 pushd packetNtx/Dll/Project
 make -f GNUmakefile CC=i686-pc-mingw32-gcc YACC=bison %{?_smp_mflags} 
@@ -146,6 +151,10 @@ rm -rf $RPM_BUILD_ROOT
 %{wpcapexamples}
 
 %changelog
+* Wed Nov 30 2011 Thomas Sailer <t.sailer at alumni.ethz.ch> - 4.1.final2-3
+- fix build
+- make wpcap.dll work again on Windows 2000
+
 * Tue Feb 08 2011 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 4.1.final2-2
 - Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
 
diff --git a/wpcap-w2k.patch b/wpcap-w2k.patch
new file mode 100644
index 0000000..2dfa60d
--- /dev/null
+++ b/wpcap-w2k.patch
@@ -0,0 +1,891 @@
+--- wpcap/libpcap/Makefile.in.w2k	2011-11-30 22:32:31.263582325 +0100
++++ wpcap/libpcap/Makefile.in	2011-11-30 22:35:42.844865268 +0100
+@@ -86,13 +86,27 @@
+ 	etherent.c savefile.c bpf_filter.c bpf_image.c bpf_dump.c
+ GENSRC = scanner.c grammar.c version.c
+ # HAVE_REMOTE
+-REMOTESRC = @V_REMOTE_FILES@
++REMOTESRC = @V_REMOTE_FILES@ \
++	WspiapiClone.c \
++	WspiapiFreeAddrInfo.c \
++	WspiapiGetAddrInfo.c \
++	WspiapiGetNameInfo.c \
++	WspiapiLegacyFreeAddrInfo.c \
++	WspiapiLegacyGetAddrInfo.c \
++	WspiapiLegacyGetNameInfo.c \
++	WspiapiLoad.c \
++	WspiapiLookupNode.c \
++	WspiapiNewAddrInfo.c \
++	WspiapiParseV4Address.c \
++	WspiapiQueryDNS.c \
++	WspiapiStrdup.c
+ TCSRC = @V_TC_FILES@
+ LIBOBJS = @LIBOBJS@
+ 
+ # HAVE_REMOTE
+ SRC =	$(PSRC) $(FSRC) $(CSRC) $(SSRC) $(GENSRC) $(TCSRC) $(REMOTESRC)
+ 
++
+ # We would like to say "OBJ = $(SRC:.c=.o)" but Ultrix's make cannot
+ # hack the extra indirection
+ # HAVE_REMOTE
+@@ -118,7 +132,8 @@
+ 	pcap-namedb.h \
+ 	pcap-stdinc.h \
+ 	ppp.h \
+-	sunatmpos.h
++	sunatmpos.h \
++	wspiapi.h
+ 
+ GENHDR = \
+ 	scanner.h tokdefs.h version.h
+--- wpcap/libpcap/WspiapiClone.c.w2k	2011-11-30 22:31:14.690287820 +0100
++++ wpcap/libpcap/WspiapiClone.c	2011-11-30 22:31:14.690287820 +0100
+@@ -0,0 +1,28 @@
++#ifndef WIN32_LEAN_AND_MEAN
++#define WIN32_LEAN_AND_MEAN
++#endif
++#undef  __CRT__NO_INLINE
++#define __CRT__NO_INLINE
++#include <winsock2.h>
++#include <wspiapi.h>
++
++int WINAPI
++WspiapiClone (WORD wPort, struct addrinfo *ptResult)
++{
++  struct addrinfo *p = NULL;
++  struct addrinfo *n = NULL;
++
++  for (p = ptResult; p != NULL;)
++    {
++	n = WspiapiNewAddrInfo (SOCK_DGRAM, p->ai_protocol, wPort,
++				((struct sockaddr_in *) p->ai_addr)->sin_addr.s_addr);
++	if (!n)
++	  break;
++	n->ai_next = p->ai_next;
++	p->ai_next = n;
++	p = n->ai_next;
++    }
++  if (p != NULL)
++    return EAI_MEMORY;
++  return 0;
++}
+--- wpcap/libpcap/WspiapiFreeAddrInfo.c.w2k	2011-11-30 22:31:14.690287820 +0100
++++ wpcap/libpcap/WspiapiFreeAddrInfo.c	2011-11-30 22:31:14.690287820 +0100
+@@ -0,0 +1,17 @@
++#ifndef WIN32_LEAN_AND_MEAN
++#define WIN32_LEAN_AND_MEAN
++#endif
++#undef  __CRT__NO_INLINE
++#define __CRT__NO_INLINE
++#include <winsock2.h>
++#include <wspiapi.h>
++
++void WINAPI
++WspiapiFreeAddrInfo (struct addrinfo *ai)
++{
++  static WSPIAPI_PFREEADDRINFO pfFreeAddrInfo = NULL;
++
++  if (!pfFreeAddrInfo)
++    pfFreeAddrInfo = (WSPIAPI_PFREEADDRINFO) WspiapiLoad(2);
++  (*pfFreeAddrInfo) (ai);
++}
+--- wpcap/libpcap/WspiapiGetAddrInfo.c.w2k	2011-11-30 22:31:14.691287837 +0100
++++ wpcap/libpcap/WspiapiGetAddrInfo.c	2011-11-30 22:31:14.691287837 +0100
+@@ -0,0 +1,21 @@
++#ifndef WIN32_LEAN_AND_MEAN
++#define WIN32_LEAN_AND_MEAN
++#endif
++#undef  __CRT__NO_INLINE
++#define __CRT__NO_INLINE
++#include <winsock2.h>
++#include <wspiapi.h>
++
++int WINAPI
++WspiapiGetAddrInfo(const char *nodename, const char *servname,
++		   const struct addrinfo *hints, struct addrinfo **res)
++{
++  static WSPIAPI_PGETADDRINFO pfGetAddrInfo = NULL;
++  int err;
++
++  if (!pfGetAddrInfo)
++    pfGetAddrInfo = (WSPIAPI_PGETADDRINFO) WspiapiLoad (0);
++  err = (*pfGetAddrInfo) (nodename, servname, hints, res);
++  WSASetLastError (err);
++  return err;
++}
+--- wpcap/libpcap/WspiapiGetNameInfo.c.w2k	2011-11-30 22:31:14.691287837 +0100
++++ wpcap/libpcap/WspiapiGetNameInfo.c	2011-11-30 22:31:14.691287837 +0100
+@@ -0,0 +1,22 @@
++#ifndef WIN32_LEAN_AND_MEAN
++#define WIN32_LEAN_AND_MEAN
++#endif
++#undef  __CRT__NO_INLINE
++#define __CRT__NO_INLINE
++#include <winsock2.h>
++#include <wspiapi.h>
++
++int WINAPI
++WspiapiGetNameInfo (const struct sockaddr *sa, socklen_t salen,
++		    char *host, size_t hostlen,
++		    char *serv, size_t servlen, int flags)
++{
++  static WSPIAPI_PGETNAMEINFO pfGetNameInfo = NULL;
++  int err;
++
++  if (!pfGetNameInfo)
++    pfGetNameInfo = (WSPIAPI_PGETNAMEINFO) WspiapiLoad(1);
++  err = (*pfGetNameInfo) (sa, salen, host, hostlen, serv, servlen, flags);
++  WSASetLastError (err);
++  return err;
++}
+--- wpcap/libpcap/WspiapiLegacyFreeAddrInfo.c.w2k	2011-11-30 22:31:14.691287837 +0100
++++ wpcap/libpcap/WspiapiLegacyFreeAddrInfo.c	2011-11-30 22:31:14.691287837 +0100
+@@ -0,0 +1,23 @@
++#ifndef WIN32_LEAN_AND_MEAN
++#define WIN32_LEAN_AND_MEAN
++#endif
++#undef  __CRT__NO_INLINE
++#define __CRT__NO_INLINE
++#include <winsock2.h>
++#include <wspiapi.h>
++
++void WINAPI
++WspiapiLegacyFreeAddrInfo (struct addrinfo *ptHead)
++{
++  struct addrinfo *p;
++
++  for (p = ptHead; p != NULL; p = ptHead)
++    {
++	if (p->ai_canonname)
++	  WspiapiFree (p->ai_canonname);
++	if (p->ai_addr)
++	  WspiapiFree (p->ai_addr);
++	ptHead = p->ai_next;
++	WspiapiFree (p);
++    }
++}
+--- wpcap/libpcap/WspiapiLegacyGetAddrInfo.c.w2k	2011-11-30 22:31:14.691287837 +0100
++++ wpcap/libpcap/WspiapiLegacyGetAddrInfo.c	2011-11-30 22:31:14.691287837 +0100
+@@ -0,0 +1,112 @@
++#ifndef WIN32_LEAN_AND_MEAN
++#define WIN32_LEAN_AND_MEAN
++#endif
++#undef  __CRT__NO_INLINE
++#define __CRT__NO_INLINE
++#include <winsock2.h>
++#include <wspiapi.h>
++
++int WINAPI
++WspiapiLegacyGetAddrInfo(const char *pszNodeName,
++			 const char *pszServiceName,
++			 const struct addrinfo *ptHints,
++			 struct addrinfo **pptResult)
++{
++  int err = 0, iFlags = 0, iFamily = PF_UNSPEC, iSocketType = 0, iProtocol = 0;
++  struct in_addr inAddress;
++  struct servent *svc = NULL;
++  char *pc = NULL;
++  WINBOOL isCloned = FALSE;
++  WORD tcpPort = 0, udpPort = 0, port = 0;
++
++  *pptResult = NULL;
++  if (!pszNodeName && !pszServiceName)
++    return EAI_NONAME;
++  if (ptHints)
++    {
++	if (ptHints->ai_addrlen != 0 || ptHints->ai_canonname != NULL
++	    || ptHints->ai_addr!=NULL || ptHints->ai_next != NULL)
++	  return EAI_FAIL;
++	iFlags = ptHints->ai_flags;
++	if ((iFlags & AI_CANONNAME) != 0 && !pszNodeName)
++	  return EAI_BADFLAGS;
++	iFamily = ptHints->ai_family;
++	if (iFamily != PF_UNSPEC && iFamily != PF_INET)
++	  return EAI_FAMILY;
++	iSocketType = ptHints->ai_socktype;
++	if (iSocketType != 0 && iSocketType != SOCK_STREAM && iSocketType != SOCK_DGRAM
++	    && iSocketType != SOCK_RAW)
++	  return EAI_SOCKTYPE;
++	iProtocol = ptHints->ai_protocol;
++    }
++
++  if (pszServiceName)
++    {
++	port = (WORD) strtoul (pszServiceName, &pc, 10);
++	if(*pc == 0)
++	  {
++	    port = tcpPort = udpPort = htons (port);
++	    if (iSocketType == 0)
++	      {
++		isCloned = TRUE;
++		iSocketType = SOCK_STREAM;
++	      }
++	  }
++	else
++	  {
++	    if (iSocketType == 0 || iSocketType == SOCK_DGRAM)
++	      {
++		svc = getservbyname(pszServiceName, "udp");
++		if (svc)
++		  port = udpPort = svc->s_port;
++	      }
++	    if (iSocketType == 0 || iSocketType == SOCK_STREAM)
++	      {
++		svc = getservbyname(pszServiceName, "tcp");
++		if (svc)
++		  port = tcpPort = svc->s_port;
++	      }
++	    if (port == 0)
++	      return (iSocketType ? EAI_SERVICE : EAI_NONAME);
++	    if (iSocketType==0)
++	      {
++		iSocketType = (tcpPort) ? SOCK_STREAM : SOCK_DGRAM;
++		isCloned = (tcpPort && udpPort);
++	      }
++	  }
++    }
++  if (!pszNodeName || WspiapiParseV4Address(pszNodeName,&inAddress.s_addr))
++    {
++	if (!pszNodeName)
++	  {
++	    inAddress.s_addr = htonl ((iFlags & AI_PASSIVE) ? INADDR_ANY : INADDR_LOOPBACK);
++	  }
++      *pptResult = WspiapiNewAddrInfo(iSocketType, iProtocol, port, inAddress.s_addr);
++      if (!(*pptResult))
++	  err = EAI_MEMORY;
++	if (!err && pszNodeName)
++	  {
++	    (*pptResult)->ai_flags |= AI_NUMERICHOST;
++	    if (iFlags & AI_CANONNAME)
++	      {
++		(*pptResult)->ai_canonname =
++		  WspiapiStrdup (inet_ntoa (inAddress));
++		if (!(*pptResult)->ai_canonname)
++		  err = EAI_MEMORY;
++	      }
++	  }
++    }
++  else if (iFlags & AI_NUMERICHOST)
++    err = EAI_NONAME;
++  else
++    err = WspiapiLookupNode (pszNodeName, iSocketType, iProtocol, port,
++			       (iFlags & AI_CANONNAME), pptResult);
++  if (!err && isCloned)
++    err = WspiapiClone(udpPort, *pptResult);
++  if (err)
++    {
++	WspiapiLegacyFreeAddrInfo (*pptResult);
++	*pptResult = NULL;
++    }
++  return err;
++}
+--- wpcap/libpcap/WspiapiLegacyGetNameInfo.c.w2k	2011-11-30 22:31:14.691287837 +0100
++++ wpcap/libpcap/WspiapiLegacyGetNameInfo.c	2011-11-30 22:31:14.691287837 +0100
+@@ -0,0 +1,88 @@
++#ifndef WIN32_LEAN_AND_MEAN
++#define WIN32_LEAN_AND_MEAN
++#endif
++#undef  __CRT__NO_INLINE
++#define __CRT__NO_INLINE
++#include <winsock2.h>
++#include <wspiapi.h>
++
++int WINAPI
++WspiapiLegacyGetNameInfo (const struct sockaddr *ptSocketAddress,
++			 socklen_t tSocketLength,
++			 char *pszNodeName, size_t tNodeLength,
++			 char *pszServiceName, size_t tServiceLength,
++			 int iFlags)
++{
++  struct servent *svc;
++  WORD port;
++  char str[] = "65535";
++  char *pstr = str;
++  struct hostent *phost;
++  struct in_addr l_inaddr;
++  char *pnode = NULL, *pc = NULL;
++
++  if (!ptSocketAddress || tSocketLength < (int) sizeof (struct sockaddr))
++    return EAI_FAIL;
++  if (ptSocketAddress->sa_family != AF_INET)
++    return EAI_FAMILY;
++  if (tSocketLength < (int) sizeof (struct sockaddr_in))
++    return EAI_FAIL;
++  if (!(pszNodeName && tNodeLength) && !(pszServiceName && tServiceLength))
++    return EAI_NONAME;
++  if ((iFlags & NI_NUMERICHOST) != 0 && (iFlags & NI_NAMEREQD) != 0)
++    return EAI_BADFLAGS;
++  if (pszServiceName && tServiceLength)
++    {
++	port = ((struct sockaddr_in *) ptSocketAddress)->sin_port;
++	if (iFlags & NI_NUMERICSERV)
++	  sprintf (str, "%u", ntohs (port));
++      else
++	  {
++	    svc = getservbyport(port, (iFlags & NI_DGRAM) ? "udp" : NULL);
++	    if (svc && svc->s_name)
++	      pstr = svc->s_name;
++	    else
++	      sprintf (str, "%u", ntohs (port));
++	  }
++	if (tServiceLength > strlen (pstr))
++	  strcpy (pszServiceName, pstr);
++	else
++	  return EAI_FAIL;
++    }
++  if (pszNodeName && tNodeLength)
++    {
++	l_inaddr = ((struct sockaddr_in *) ptSocketAddress)->sin_addr;
++	if (iFlags & NI_NUMERICHOST)
++	  pnode = inet_ntoa (l_inaddr);
++	else
++	  {
++	    phost = gethostbyaddr ((char *) &l_inaddr, sizeof (struct in_addr), AF_INET);
++	    if (phost && phost->h_name)
++	      {
++		pnode = phost->h_name;
++		if ((iFlags & NI_NOFQDN) != 0 && ((pc = strchr (pnode,'.')) != NULL))
++		  *pc = 0;
++	      }
++	    else
++	      {
++		if ((iFlags & NI_NAMEREQD) != 0)
++		  {
++		    switch(WSAGetLastError())
++		      {
++		      case WSAHOST_NOT_FOUND: return EAI_NONAME;
++		      case WSATRY_AGAIN: return EAI_AGAIN;
++		      case WSANO_RECOVERY: return EAI_FAIL;
++		      default: return EAI_NONAME;
++		      }
++		  }
++		else
++		  pnode = inet_ntoa (l_inaddr);
++	      }
++	  }
++	if (tNodeLength > strlen (pnode))
++	  strcpy (pszNodeName, pnode);
++	else
++	  return EAI_FAIL;
++    }
++  return 0;
++}
+--- wpcap/libpcap/WspiapiLoad.c.w2k	2011-11-30 22:31:14.691287837 +0100
++++ wpcap/libpcap/WspiapiLoad.c	2011-11-30 22:31:14.691287837 +0100
+@@ -0,0 +1,75 @@
++#ifndef WIN32_LEAN_AND_MEAN
++#define WIN32_LEAN_AND_MEAN
++#endif
++#undef  __CRT__NO_INLINE
++#define __CRT__NO_INLINE
++#include <winsock2.h>
++#include <wspiapi.h>
++
++FARPROC WINAPI
++WspiapiLoad (WORD wFunction)
++{
++  static WINBOOL isinit = FALSE;
++  static WSPIAPI_FUNCTION rgtGlobal[] = WSPIAPI_FUNCTION_ARRAY;
++  static const int iNumGlobal = (sizeof(rgtGlobal) / sizeof(WSPIAPI_FUNCTION));
++  HMODULE hlib = NULL;
++  WSPIAPI_FUNCTION rgtLocal[] = WSPIAPI_FUNCTION_ARRAY;
++  FARPROC fScratch = NULL;
++  int i = 0;
++
++  if (isinit)
++    return rgtGlobal[wFunction].pfAddress;
++
++  for (;;)
++    {
++	CHAR systemdir[MAX_PATH + 1], path[MAX_PATH + 8];
++
++	if (GetSystemDirectoryA (systemdir, MAX_PATH) == 0)
++	  break;
++	strcpy (path, systemdir);
++	strcat (path, "\\ws2_32");
++	hlib = LoadLibraryA (path);
++	if(hlib != NULL)
++	  {
++	    fScratch = GetProcAddress (hlib, "getaddrinfo");
++	    if (!fScratch)
++	      {
++		FreeLibrary (hlib);
++		hlib = NULL;
++	      }
++	  }
++	if (hlib != NULL)
++	  break;
++	strcpy (path, systemdir);
++	strcat (path, "\\wship6");
++	hlib = LoadLibraryA (path);
++	if (hlib != NULL)
++	  {
++	    if ((fScratch = GetProcAddress (hlib, "getaddrinfo")) == NULL)
++	      {
++		FreeLibrary (hlib);
++		hlib = NULL;
++	      }
++	  }
++	break;
++    }
++  if (hlib != NULL)
++    {
++	for (i = 0; i < iNumGlobal; i++)
++	  {
++	    if ((rgtLocal[i].pfAddress = GetProcAddress (hlib, rgtLocal[i].pszName)) == NULL)
++	      {
++		FreeLibrary (hlib);
++		hlib = NULL;
++		break;
++	      }
++	  }
++	if (hlib != NULL)
++	  {
++	    for (i = 0; i < iNumGlobal; i++)
++	      rgtGlobal[i].pfAddress = rgtLocal[i].pfAddress;
++	  }
++    }
++  isinit = TRUE;
++  return rgtGlobal[wFunction].pfAddress;
++}
+--- wpcap/libpcap/WspiapiLookupNode.c.w2k	2011-11-30 22:31:14.691287837 +0100
++++ wpcap/libpcap/WspiapiLookupNode.c	2011-11-30 22:31:14.691287837 +0100
+@@ -0,0 +1,44 @@
++#ifndef WIN32_LEAN_AND_MEAN
++#define WIN32_LEAN_AND_MEAN
++#endif
++#undef  __CRT__NO_INLINE
++#define __CRT__NO_INLINE
++#include <winsock2.h>
++#include <wspiapi.h>
++
++int WINAPI
++WspiapiLookupNode (const char *pszNodeName,
++		   int iSocketType, int iProtocol,
++		   WORD wPort, WINBOOL bAI_CANONNAME,
++		   struct addrinfo **pptResult)
++{
++  int err = 0, cntAlias = 0;
++  char name[NI_MAXHOST] = "";
++  char alias[NI_MAXHOST] = "";
++  char *pname = name, *palias = alias, *tmp = NULL;
++
++  strncpy (pname, pszNodeName, NI_MAXHOST - 1);
++  pname[NI_MAXHOST - 1] = 0;
++  for (;;)
++    {
++	err = WspiapiQueryDNS (pszNodeName, iSocketType, iProtocol, wPort, palias, pptResult);
++	if (err)
++	  break;
++	if (*pptResult)
++	  break;
++	++cntAlias;
++	if (strlen (palias) == 0 || !strcmp (pname, palias) || cntAlias == 16)
++	  {
++	    err = EAI_FAIL;
++	    break;
++	  }
++	WspiapiSwap(pname, palias, tmp);
++    }
++  if (!err && bAI_CANONNAME)
++    {
++      (*pptResult)->ai_canonname = WspiapiStrdup (palias);
++      if (!(*pptResult)->ai_canonname)
++	  err = EAI_MEMORY;
++    }
++  return err;
++}
+--- wpcap/libpcap/WspiapiNewAddrInfo.c.w2k	2011-11-30 22:31:14.691287837 +0100
++++ wpcap/libpcap/WspiapiNewAddrInfo.c	2011-11-30 22:31:14.691287837 +0100
+@@ -0,0 +1,31 @@
++#ifndef WIN32_LEAN_AND_MEAN
++#define WIN32_LEAN_AND_MEAN
++#endif
++#undef  __CRT__NO_INLINE
++#define __CRT__NO_INLINE
++#include <winsock2.h>
++#include <wspiapi.h>
++
++struct addrinfo * WINAPI
++WspiapiNewAddrInfo (int iSocketType, int iProtocol, WORD wPort, DWORD dwAddress)
++{
++  struct addrinfo *n;
++  struct sockaddr_in *pa;
++
++  if ((n = (struct addrinfo *) WspiapiMalloc (sizeof (struct addrinfo))) == NULL)
++    return NULL;
++  if ((pa = (struct sockaddr_in *) WspiapiMalloc (sizeof(struct sockaddr_in))) == NULL)
++    {
++	WspiapiFree(n);
++	return NULL;
++    }
++  pa->sin_family = AF_INET;
++  pa->sin_port = wPort;
++  pa->sin_addr.s_addr = dwAddress;
++  n->ai_family = PF_INET;
++  n->ai_socktype = iSocketType;
++  n->ai_protocol = iProtocol;
++  n->ai_addrlen = sizeof (struct sockaddr_in);
++  n->ai_addr = (struct sockaddr *) pa;
++  return n;
++}
+--- wpcap/libpcap/WspiapiParseV4Address.c.w2k	2011-11-30 22:31:14.692287854 +0100
++++ wpcap/libpcap/WspiapiParseV4Address.c	2011-11-30 22:31:14.692287854 +0100
+@@ -0,0 +1,26 @@
++#ifndef WIN32_LEAN_AND_MEAN
++#define WIN32_LEAN_AND_MEAN
++#endif
++#undef  __CRT__NO_INLINE
++#define __CRT__NO_INLINE
++#include <winsock2.h>
++#include <wspiapi.h>
++
++WINBOOL WINAPI
++WspiapiParseV4Address (const char *pszAddress, PDWORD pdwAddress)
++{
++  DWORD dwAddress = 0;
++  const char *h = NULL;
++  int cnt;
++
++  for (cnt = 0,h = pszAddress; *h != 0; h++)
++    if (h[0] == '.')
++	cnt++;
++  if (cnt != 3)
++    return FALSE;
++  dwAddress = inet_addr (pszAddress);
++  if (dwAddress == INADDR_NONE)
++    return FALSE;
++  *pdwAddress = dwAddress;
++  return TRUE;
++}
+--- wpcap/libpcap/WspiapiQueryDNS.c.w2k	2011-11-30 22:31:14.692287854 +0100
++++ wpcap/libpcap/WspiapiQueryDNS.c	2011-11-30 22:31:14.692287854 +0100
+@@ -0,0 +1,48 @@
++#ifndef WIN32_LEAN_AND_MEAN
++#define WIN32_LEAN_AND_MEAN
++#endif
++#undef  __CRT__NO_INLINE
++#define __CRT__NO_INLINE
++#include <winsock2.h>
++#include <wspiapi.h>
++
++int WINAPI
++WspiapiQueryDNS(const char *pszNodeName,
++		int iSocketType, int iProtocol,
++		WORD wPort, char pszAlias[NI_MAXHOST],
++		struct addrinfo **pptResult)
++{
++  struct addrinfo **paddrinfo = pptResult;
++  struct hostent *phost = NULL;
++  char **h;
++
++  *paddrinfo = NULL;
++  pszAlias[0] = 0;
++  phost = gethostbyname (pszNodeName);
++  if (phost)
++    {
++      if (phost->h_addrtype == AF_INET && phost->h_length == sizeof(struct in_addr))
++	  {
++	    for (h = phost->h_addr_list; *h != NULL; h++)
++	      {
++		*paddrinfo = WspiapiNewAddrInfo (iSocketType, iProtocol, wPort,
++						 ((struct in_addr *) *h)->s_addr);
++		if (!*paddrinfo)
++		  return EAI_MEMORY;
++		paddrinfo = &((*paddrinfo)->ai_next);
++	      }
++	  }
++	strncpy (pszAlias, phost->h_name, NI_MAXHOST - 1);
++	pszAlias[NI_MAXHOST - 1] = 0;
++	return 0;
++    }
++  switch(WSAGetLastError())
++    {
++    case WSAHOST_NOT_FOUND: break;
++    case WSATRY_AGAIN: return EAI_AGAIN;
++    case WSANO_RECOVERY: return EAI_FAIL;
++    case WSANO_DATA: return EAI_NODATA;
++    default: break;
++    }
++  return EAI_NONAME;
++}
+--- wpcap/libpcap/WspiapiStrdup.c.w2k	2011-11-30 22:31:14.692287854 +0100
++++ wpcap/libpcap/WspiapiStrdup.c	2011-11-30 22:31:14.692287854 +0100
+@@ -0,0 +1,23 @@
++#ifndef WIN32_LEAN_AND_MEAN
++#define WIN32_LEAN_AND_MEAN
++#endif
++#undef  __CRT__NO_INLINE
++#define __CRT__NO_INLINE
++#include <winsock2.h>
++#include <wspiapi.h>
++
++char * WINAPI
++WspiapiStrdup (const char *pszString)
++{
++  char *rstr;
++  size_t szlen;
++
++  if(!pszString)
++    return NULL;
++  szlen = strlen(pszString) + 1;
++  rstr = (char *) WspiapiMalloc (szlen);
++  if (!rstr)
++    return NULL;
++  strcpy (rstr, pszString);
++  return rstr;
++}
+--- wpcap/libpcap/wspiapi.h.w2k	2011-11-30 22:31:22.016411156 +0100
++++ wpcap/libpcap/wspiapi.h	2011-11-30 22:31:22.016411156 +0100
+@@ -0,0 +1,207 @@
++/**
++ * This file has no copyright assigned and is placed in the Public Domain.
++ * This file is part of the w64 mingw-runtime package.
++ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
++ */
++#ifndef _WSPIAPI_H_
++#define _WSPIAPI_H_
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <malloc.h>
++#include <string.h>
++#include <ws2tcpip.h>
++
++//#include <_mingw_print_push.h>
++
++#define _WSPIAPI_STRCPY_S(_Dst,_Size,_Src) strcpy((_Dst),(_Src))
++#define _WSPIAPI_STRCAT_S(_Dst,_Size,_Src) strcat((_Dst),(_Src))
++#define _WSPIAPI_STRNCPY_S(_Dst,_Size,_Src,_Count) strncpy((_Dst),(_Src),(_Count)); (_Dst)[(_Size) - 1] = 0
++#define _WSPIAPI_SPRINTF_S_1(_Dst,_Size,_Format,_Arg1) sprintf((_Dst),(_Format),(_Arg1))
++
++#ifndef _WSPIAPI_COUNTOF
++#ifndef __cplusplus
++#define _WSPIAPI_COUNTOF(_Array) (sizeof(_Array) / sizeof(_Array[0]))
++#else
++template <typename __CountofType,size_t _N> char (&__wspiapi_countof_helper(__CountofType (&_Array)[_N]))[_N];
++#define _WSPIAPI_COUNTOF(_Array) sizeof(__wspiapi_countof_helper(_Array))
++#endif
++#endif
++
++#define WspiapiMalloc(tSize) calloc(1,(tSize))
++#define WspiapiFree(p) free(p)
++#define WspiapiSwap(a,b,c) { (c) = (a); (a) = (b); (b) = (c); }
++#define getaddrinfo WspiapiGetAddrInfo
++#define getnameinfo WspiapiGetNameInfo
++#define freeaddrinfo WspiapiFreeAddrInfo
++
++typedef int (WINAPI *WSPIAPI_PGETADDRINFO)(const char *nodename,const char *servname,const struct addrinfo *hints,struct addrinfo **res);
++typedef int (WINAPI *WSPIAPI_PGETNAMEINFO)(const struct sockaddr *sa,socklen_t salen,char *host,size_t hostlen,char *serv,size_t servlen,int flags);
++typedef void (WINAPI *WSPIAPI_PFREEADDRINFO)(struct addrinfo *ai);
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++  typedef struct {
++    char const *pszName;
++    FARPROC pfAddress;
++  } WSPIAPI_FUNCTION;
++
++#define WSPIAPI_FUNCTION_ARRAY { { "getaddrinfo",(FARPROC) WspiapiLegacyGetAddrInfo }, \
++  { "getnameinfo",(FARPROC) WspiapiLegacyGetNameInfo }, \
++  { "freeaddrinfo",(FARPROC) WspiapiLegacyFreeAddrInfo } }
++
++  char *WINAPI WspiapiStrdup (const char *pszString);
++  WINBOOL WINAPI WspiapiParseV4Address (const char *pszAddress,PDWORD pdwAddress);
++  struct addrinfo * WINAPI WspiapiNewAddrInfo (int iSocketType,int iProtocol,WORD wPort,DWORD dwAddress);
++  int WINAPI WspiapiQueryDNS (const char *pszNodeName,int iSocketType,int iProtocol,WORD wPort,char pszAlias[NI_MAXHOST],struct addrinfo **pptResult);
++  int WINAPI WspiapiLookupNode (const char *pszNodeName,int iSocketType,int iProtocol,WORD wPort,WINBOOL bAI_CANONNAME,struct addrinfo **pptResult);
++  int WINAPI WspiapiClone (WORD wPort,struct addrinfo *ptResult);
++  void WINAPI WspiapiLegacyFreeAddrInfo (struct addrinfo *ptHead);
++  int WINAPI WspiapiLegacyGetAddrInfo(const char *pszNodeName,const char *pszServiceName,const struct addrinfo *ptHints,struct addrinfo **pptResult);
++  int WINAPI WspiapiLegacyGetNameInfo(const struct sockaddr *ptSocketAddress,socklen_t tSocketLength,char *pszNodeName,size_t tNodeLength,char *pszServiceName,size_t tServiceLength,int iFlags);
++  FARPROC WINAPI WspiapiLoad(WORD wFunction);
++  int WINAPI WspiapiGetAddrInfo(const char *nodename,const char *servname,const struct addrinfo *hints,struct addrinfo **res);
++  int WINAPI WspiapiGetNameInfo (const struct sockaddr *sa,socklen_t salen,char *host,size_t hostlen,char *serv,size_t servlen,int flags);
++  void WINAPI WspiapiFreeAddrInfo (struct addrinfo *ai);
++
++#ifndef __CRT__NO_INLINE
++  __CRT_INLINE char * WINAPI
++  WspiapiStrdup (const char *pszString)
++  {
++    char *rstr;
++    size_t szlen;
++
++    if(!pszString)
++      return NULL;
++    szlen = strlen(pszString) + 1;
++    rstr = (char *) WspiapiMalloc (szlen);
++    if (!rstr)
++      return NULL;
++    strcpy (rstr, pszString);
++    return rstr;
++  }
++
++  __CRT_INLINE WINBOOL WINAPI
++  WspiapiParseV4Address (const char *pszAddress, PDWORD pdwAddress)
++  {
++    DWORD dwAddress = 0;
++    const char *h = NULL;
++    int cnt;
++
++    for (cnt = 0,h = pszAddress; *h != 0; h++)
++      if (h[0] == '.')
++	cnt++;
++    if (cnt != 3)
++      return FALSE;
++    dwAddress = inet_addr (pszAddress);
++    if (dwAddress == INADDR_NONE)
++      return FALSE;
++    *pdwAddress = dwAddress;
++    return TRUE;
++  }
++
++  __CRT_INLINE struct addrinfo * WINAPI
++  WspiapiNewAddrInfo (int iSocketType,int iProtocol, WORD wPort,DWORD dwAddress)
++  {
++    struct addrinfo *n;
++    struct sockaddr_in *pa;
++
++    if ((n = (struct addrinfo *) WspiapiMalloc (sizeof (struct addrinfo))) == NULL)
++      return NULL;
++    if ((pa = (struct sockaddr_in *) WspiapiMalloc (sizeof(struct sockaddr_in))) == NULL)
++      {
++	WspiapiFree(n);
++	return NULL;
++      }
++    pa->sin_family = AF_INET;
++    pa->sin_port = wPort;
++    pa->sin_addr.s_addr = dwAddress;
++    n->ai_family = PF_INET;
++    n->ai_socktype = iSocketType;
++    n->ai_protocol = iProtocol;
++    n->ai_addrlen = sizeof (struct sockaddr_in);
++    n->ai_addr = (struct sockaddr *) pa;
++    return n;
++  }
++
++  __CRT_INLINE int WINAPI
++  WspiapiLookupNode (const char *pszNodeName, int iSocketType, int iProtocol, WORD wPort,
++		     WINBOOL bAI_CANONNAME, struct addrinfo **pptResult)
++  {
++    int err = 0, cntAlias = 0;
++    char name[NI_MAXHOST] = "";
++    char alias[NI_MAXHOST] = "";
++    char *pname = name, *palias = alias, *tmp = NULL;
++
++    strncpy (pname, pszNodeName, NI_MAXHOST - 1);
++    pname[NI_MAXHOST - 1] = 0;
++    for (;;)
++      {
++	err = WspiapiQueryDNS (pszNodeName, iSocketType, iProtocol, wPort, palias, pptResult);
++	if (err)
++	  break;
++	if (*pptResult)
++	  break;
++	++cntAlias;
++	if (strlen (palias) == 0 || !strcmp (pname, palias) || cntAlias == 16)
++	  {
++	    err = EAI_FAIL;
++	    break;
++	  }
++	WspiapiSwap(pname, palias, tmp);
++      }
++    if (!err && bAI_CANONNAME)
++      {
++        (*pptResult)->ai_canonname = WspiapiStrdup (palias);
++        if (!(*pptResult)->ai_canonname)
++	  err = EAI_MEMORY;
++      }
++    return err;
++  }
++
++  __CRT_INLINE int WINAPI
++  WspiapiClone (WORD wPort,struct addrinfo *ptResult)
++  {
++    struct addrinfo *p = NULL;
++    struct addrinfo *n = NULL;
++
++    for (p = ptResult; p != NULL;)
++      {
++	n = WspiapiNewAddrInfo (SOCK_DGRAM, p->ai_protocol, wPort,
++				((struct sockaddr_in *) p->ai_addr)->sin_addr.s_addr);
++	if (!n)
++	  break;
++	n->ai_next = p->ai_next;
++	p->ai_next = n;
++	p = n->ai_next;
++      }
++    if (p != NULL)
++      return EAI_MEMORY;
++    return 0;
++  }
++
++  __CRT_INLINE void WINAPI
++  WspiapiLegacyFreeAddrInfo (struct addrinfo *ptHead)
++  {
++    struct addrinfo *p;
++
++    for (p = ptHead; p != NULL; p = ptHead)
++      {
++	if (p->ai_canonname)
++	  WspiapiFree (p->ai_canonname);
++	if (p->ai_addr)
++	  WspiapiFree (p->ai_addr);
++	ptHead = p->ai_next;
++	WspiapiFree (p);
++      }
++  }
++#endif /* !__CRT__NO_INLINE */
++
++#ifdef __cplusplus
++}
++#endif
++
++//#include <_mingw_print_pop.h>
++
++#endif
+--- wpcap/libpcap/sockutils.h.w2k	2011-11-30 22:31:36.148649395 +0100
++++ wpcap/libpcap/sockutils.h	2011-11-30 22:32:21.197411498 +0100
+@@ -52,6 +52,7 @@
+ #endif
+ #include <winsock2.h>
+ #include <ws2tcpip.h>
++#include <wspiapi.h>
+ #else
+ #include <stdio.h>
+ #include <string.h>	/* for memset() */
+@@ -69,7 +70,7 @@
+ /* MingW headers include this definition, but only for Windows XP and above.
+    MSDN states that this function is available for most versions on Windows.
+ */
+-#if ((defined(__MINGW32__)) && (_WIN32_WINNT < 0x0501))
++#if 0 && ((defined(__MINGW32__)) && (_WIN32_WINNT < 0x0501))
+ int WSAAPI getnameinfo(const struct sockaddr*,socklen_t,char*,DWORD,
+ 		       char*,DWORD,int);
+ #endif
+--- wpcap/PRJ/GNUmakefile.w2k	2011-11-30 22:52:59.541092745 +0100
++++ wpcap/PRJ/GNUmakefile	2011-11-30 22:54:11.127259152 +0100
+@@ -62,7 +62,20 @@
+ 	../libpcap/sockutils.o \
+ 	../libpcap/Win32/Src/gai_strerror.o \
+ 	../libpcap/pcap-tc.o \
+-	../Win32-Extensions/Win32-Extensions.o
++	../Win32-Extensions/Win32-Extensions.o \
++	../libpcap/WspiapiClone.o \
++	../libpcap/WspiapiFreeAddrInfo.o \
++	../libpcap/WspiapiGetAddrInfo.o \
++	../libpcap/WspiapiGetNameInfo.o \
++	../libpcap/WspiapiLegacyFreeAddrInfo.o \
++	../libpcap/WspiapiLegacyGetAddrInfo.o \
++	../libpcap/WspiapiLegacyGetNameInfo.o \
++	../libpcap/WspiapiLoad.o \
++	../libpcap/WspiapiLookupNode.o \
++	../libpcap/WspiapiNewAddrInfo.o \
++	../libpcap/WspiapiParseV4Address.o \
++	../libpcap/WspiapiQueryDNS.o \
++	../libpcap/WspiapiStrdup.o
+ 
+ main: ${OBJS}
+ 	@${RM} -rf ../lib/


More information about the scm-commits mailing list