[PATCHES] Proposed patch to getaddrinfo.c to support IPv6 on Windows

2005-08-24 Thread Chuck McDevitt








Im proposing this change to /src/port/getaddrinfo.c
to support IPv6 under windows.



10a11,14

 * Windows may or may not have these
routines, so we handle Windows special

 * by dynamically checking for their existence.
If they already exist, we

 * use the Windows native routines, but if
not, we use our own.

 *

31a36,121

 

 #ifdef WIN32

 

 #define WIN32_LEAN_AND_MEAN

 /* Bring in windows.h for LoadLibrary,
FreeLibrary, and GetProcAddress routines */

 #include windows.h

 

 /* 

 * The native routines may or may not
exist on the Windows platform we are on,

 * so we dynamically look up the routines,
and call them via function pointers.

 * Here we need to declare what the
function pointers look like

 */

 typedef

 int

 (__stdcall * getaddrinfo_ptr_t)(const char *
nodename, const char * servname,

 const struct
addrinfo * hints, struct addrinfo ** res);

 

 typedef

 void

 (__stdcall * freeaddrinfo_ptr_t)(struct
addrinfo * ai);

 

 typedef

 int

 (__stdcall * getnameinfo_ptr_t)(const struct
sockaddr * sa, int salen,

 char *
host, int hostlen, char * serv, int servlen, int flags);

 

 /* static pointers to the native Windows IPv6
routines, so we only do the lookup once. */

 static getaddrinfo_ptr_t getaddrinfo_ptr =
NULL;

 static freeaddrinfo_ptr_t freeaddrinfo_ptr =
NULL;

 static getnameinfo_ptr_t getnameinfo_ptr =
NULL;

 

 static

 bool haveNativeWindowsIPv6routines(void)

 {

 void * hLibrary =
NULL;

 static bool
alreadyLookedForIpv6routines = FALSE;

 

 if
(alreadyLookedForIpv6routines)



return (getaddrinfo_ptr != NULL);

 

 /* 

  * For Windows XP and
Windows 2003 (and longhorn/vista), the IPv6

 * routines are
present the WinSock 2 library (ws2_32.dll). Try that first

  */

 

 hLibrary = LoadLibraryA(ws2_32);

 

  if (hLibrary == NULL ||
GetProcAddress(hLibrary, getaddrinfo) == NULL)

  {

  /*
Well, ws2_32 doesn't exist, or more likely doesn't have getaddrinfo. */

  if
(hLibrary != NULL)

  FreeLibrary(hLibrary);

 

  /*
In Windows 2000, there was only the IPv6 Technology
Preview 

  *
look in the IPv6 WinSock library (wship6.dll).

  */

 

  hLibrary
= LoadLibraryA(wship6);

  }

 

  /* If hLibrary is null, we
couldn't find a dll that supports the functions */

 if (hLibrary != NULL)

 {

  /*
We found a dll, so now get the addresses of the routines */

 


getaddrinfo_ptr = GetProcAddress(hLibrary, getaddrinfo);

  freeaddrinfo_ptr
= GetProcAddress(hLibrary, freeaddrinfo);

  getnameinfo_ptr
= GetProcAddress(hLibrary, getnameinfo);

 

  /*
If any one of the routines is missing, let's play it safe and ignore them all
*/


if (getaddrinfo_ptr == NULL || freeaddrinfo_ptr == NULL || getnameinfo_ptr ==
NULL)


{


FreeLibrary(hLibrary);


hLibrary = NULL;

  getaddrinfo_ptr
= NULL;

  freeaddrinfo_ptr
= NULL;

  getnameinfo_ptr
= NULL;


}

 }





alreadyLookedForIpv6routines = TRUE;

 return (getaddrinfo_ptr
!= NULL); 

 }

 #endif 

 

 

49a140,148

 #ifdef WIN32

  /* 

  * If Windows has
native IPv6 support, use the native Windows routine.

  * Otherwise, fall
through and use our own code.

  */

  if (haveNativeWindowsIPv6routines())

  return
(*getaddrinfo_ptr)(node,service,hintp,res);

 #endif

 

162a262,272

 #ifdef WIN32

  /*


  *
If Windows has native IPv6 support, use the native Windows routine.

  *
Otherwise, fall through and use our own code.

  */

  if
(haveNativeWindowsIPv6routines())

  {

  (*freeaddrinfo_ptr)(node,service,hintp,res);

  return;

  }

 #endif

218a329,338

 

 #ifdef WIN32

  /* 

  * If Windows has
native IPv6 support, use the native Windows routine.

  * Otherwise, fall
through and use our own code.

  */

  if
(haveNativeWindowsIPv6routines())

  return
(*getnameinfo_ptr)(sa,salen,node,nodelen,service,servicelen,flags);

 #endif










getaddrinfo.patch
Description: getaddrinfo.patch

---(end of broadcast)---
TIP 1: if posting/reading through Usenet, please send an appropriate
   subscribe-nomail command to [EMAIL PROTECTED] so that your
   message can get through to the mailing list cleanly


Re: [PATCHES] Proposed patch to getaddrinfo.c to support IPv6 on Windows

2005-08-24 Thread Bruce Momjian

Context diff, please, diff -c.

---

Chuck McDevitt wrote:
 I'm proposing this change to /src/port/getaddrinfo.c to support IPv6
 under windows.
 
  
 
 10a11,14
 
   * Windows may or may not have these routines, so we handle Windows
 special
 
   * by dynamically checking for their existence.  If they already
 exist, we
 
   * use the Windows native routines, but if not, we use our own.
 
   *
 
 31a36,121
 
  
 
  #ifdef WIN32
 
  
 
  #define WIN32_LEAN_AND_MEAN
 
  /* Bring in windows.h for LoadLibrary, FreeLibrary, and GetProcAddress
 routines */
 
  #include windows.h
 
  
 
  /* 
 
   * The native routines may or may not exist on the Windows platform we
 are on,
 
   * so we dynamically look up the routines, and call them via function
 pointers.
 
   * Here we need to declare what the function pointers look like
 
   */
 
  typedef
 
  int
 
  (__stdcall * getaddrinfo_ptr_t)(const char * nodename, const char *
 servname,
 
   const struct addrinfo * hints, struct addrinfo ** res);
 
  
 
  typedef
 
  void
 
  (__stdcall * freeaddrinfo_ptr_t)(struct addrinfo * ai);
 
  
 
  typedef
 
  int
 
  (__stdcall * getnameinfo_ptr_t)(const struct sockaddr * sa, int salen,
 
   char *  host, int hostlen, char * serv, int servlen, int flags);
 
  
 
  /* static pointers to the native Windows IPv6 routines, so we only do
 the lookup once. */
 
  static getaddrinfo_ptr_t getaddrinfo_ptr = NULL;
 
  static freeaddrinfo_ptr_t freeaddrinfo_ptr = NULL;
 
  static getnameinfo_ptr_t getnameinfo_ptr = NULL;
 
  
 
  static
 
  bool haveNativeWindowsIPv6routines(void)
 
  {
 
  void * hLibrary  = NULL;
 
  static bool  alreadyLookedForIpv6routines= FALSE;
 
 
 
  if (alreadyLookedForIpv6routines)
 
  return (getaddrinfo_ptr != NULL);
 
  
 
  /* 
 
   * For Windows XP and Windows 2003 (and longhorn/vista), the IPv6
 
   * routines are present the WinSock 2 library (ws2_32.dll).  Try
 that first
 
   */
 
  
 
  hLibrary = LoadLibraryA(ws2_32);
 
  
 
  if (hLibrary == NULL || GetProcAddress(hLibrary, getaddrinfo) ==
 NULL)
 
  {
 
/* Well, ws2_32 doesn't exist, or more likely doesn't have
 getaddrinfo. */
 
if (hLibrary != NULL)
 
  FreeLibrary(hLibrary);
 
  
 
/* In Windows 2000, there was only the IPv6 Technology
 Preview
 
 * look in the IPv6 WinSock library (wship6.dll).
 
 */
 
  
 
hLibrary = LoadLibraryA(wship6);
 
  }
 
  
 
  /* If hLibrary is null, we couldn't find a dll that supports the
 functions */
 
  if (hLibrary != NULL)
 
  {
 
/* We found a dll, so now get the addresses of the routines
 */
 
  
 
  getaddrinfo_ptr = GetProcAddress(hLibrary, getaddrinfo);
 
freeaddrinfo_ptr = GetProcAddress(hLibrary, freeaddrinfo);
 
getnameinfo_ptr = GetProcAddress(hLibrary, getnameinfo);
 
  
 
/* If any one of the routines is missing, let's play it safe
 and ignore them all */
 
  if (getaddrinfo_ptr == NULL || freeaddrinfo_ptr == NULL ||
 getnameinfo_ptr == NULL)
 
  {
 
  FreeLibrary(hLibrary);
 
  hLibrary = NULL;
 
  getaddrinfo_ptr = NULL;
 
  freeaddrinfo_ptr = NULL;
 
  getnameinfo_ptr = NULL;
 
  }
 
  }
 
  
 
  alreadyLookedForIpv6routines = TRUE;
 
  return (getaddrinfo_ptr != NULL); 
 
  }
 
  #endif 
 
  
 
  
 
 49a140,148
 
  #ifdef WIN32
 
  /* 
 
   * If Windows has native IPv6 support, use the native Windows
 routine.
 
   * Otherwise, fall through and use our own code.
 
   */
 
  if (haveNativeWindowsIPv6routines())
 
return (*getaddrinfo_ptr)(node,service,hintp,res);
 
  #endif
 
  
 
 162a262,272
 
  #ifdef WIN32
 
/* 
 
 * If Windows has native IPv6 support, use the native
 Windows routine.
 
 * Otherwise, fall through and use our own code.
 
 */
 
if (haveNativeWindowsIPv6routines())
 
{
 
  (*freeaddrinfo_ptr)(node,service,hintp,res);
 
  return;
 
}
 
  #endif
 
 218a329,338
 
  
 
  #ifdef WIN32
 
  /* 
 
   * If Windows has native IPv6 support, use the native Windows
 routine.
 
   * Otherwise, fall through and use our own code.
 
   */
 
  if (haveNativeWindowsIPv6routines())
 
return
 (*getnameinfo_ptr)(sa,salen,node,nodelen,service,servicelen,flags);
 
  #endif
 
  
 

Content-Description: getaddrinfo.patch

[ Attachment, skipping... ]

 
 ---(end of broadcast)---
 TIP 1: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to [EMAIL PROTECTED] so that your
message can get through to