Corrected: Proposed patch to getaddrinfo.c to support IPv6 on Windows

From: "Chuck McDevitt" <cmcdevitt(at)greenplum(dot)com>
To: pgsql-patches(at)postgresql(dot)org
Cc: "PostgreSQL-development" <pgsql-hackers(at)postgresql(dot)org>
Subject: Corrected: Proposed patch to getaddrinfo.c to support IPv6 on Windows
Date: 2005-08-24 19:13:08
Message-ID: BB05A27C22288540A3A3E8F3749B45AB0159CB49@MI8NYCMAIL06.Mi8.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-patches

I'm proposing this change to /src/port/getaddrinfo.c to support IPv6
under windows.

(this time with a context diff !)

*** \postgresql-snapshot\src\port\getaddrinfo.c Wed Aug 24 11:54:09 2005

--- \postgresql-patched\src\port\getaddrinfo.c Wed Aug 24 11:53:05 2005

***************

*** 8,18 ****

* platform, we'll need to split this file and provide a separate
configure

* test for getnameinfo().

*

*

* Copyright (c) 2003-2005, PostgreSQL Global Development Group

*

* IDENTIFICATION

! * $PostgreSQL: pgsql/src/port/getaddrinfo.c,v 1.17 2005/07/28
04:03:14 tgl Exp $

*


*-----------------------------------------------------------------------
--

*/

--- 8,22 ----

* platform, we'll need to split this file and provide a separate
configure

* test for getnameinfo().

*

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

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

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

+ *

*

* Copyright (c) 2003-2005, PostgreSQL Global Development Group

*

* IDENTIFICATION

! * $PostgreSQL: pgsql/src/port/getaddrinfo.c,v 1.16 2005/01/01
20:44:33 tgl Exp $

*


*-----------------------------------------------------------------------
--

*/

***************

*** 29,34 ****

--- 33,124 ----

#include "getaddrinfo.h"

+

+ #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

+

+

/*

* get address info for ipv4 sockets.

*

***************

*** 47,52 ****

--- 137,151 ----

*psin;

struct addrinfo hints;

+ #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

+

if (hintp == NULL)

{

memset(&hints, 0, sizeof(hints));

***************

*** 160,165 ****

--- 259,275 ----

{

if (res)

{

+ #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

if (res->ai_addr)

free(res->ai_addr);

free(res);

***************

*** 216,221 ****

--- 326,341 ----

char *node, int nodelen,

char *service, int servicelen, int flags)

{

+

+ #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

+

/* Invalid arguments. */

if (sa == NULL || (node == NULL && service == NULL))

return EAI_FAIL;

Attachment Content-Type Size
getaddrinfo.patch application/octet-stream 5.5 KB

Browse pgsql-patches by date

  From Date Subject
Next Message Tom Lane 2005-08-24 19:25:28 Re: PL/Perl regression tests with use_strict
Previous Message Bruce Momjian 2005-08-24 19:07:30 Re: Proposed patch to getaddrinfo.c to support IPv6 on Windows