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

From: Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us>
To: Chuck McDevitt <cmcdevitt(at)greenplum(dot)com>
Cc: pgsql-patches(at)postgresql(dot)org, PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Proposed patch to getaddrinfo.c to support IPv6 on Windows
Date: 2005-08-24 19:07:30
Message-ID: 200508241907.j7OJ7UP15128@candle.pha.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers pgsql-patches


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 majordomo(at)postgresql(dot)org so that your
> message can get through to the mailing list cleanly

--
Bruce Momjian | http://candle.pha.pa.us
pgman(at)candle(dot)pha(dot)pa(dot)us | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Greg Stark 2005-08-24 19:11:31 Re: TODO questions
Previous Message Chuck McDevitt 2005-08-24 19:01:32 Proposed patch to getaddrinfo.c to support IPv6 on Windows

Browse pgsql-patches by date

  From Date Subject
Next Message Chuck McDevitt 2005-08-24 19:13:08 Corrected: Proposed patch to getaddrinfo.c to support IPv6 on Windows
Previous Message Chuck McDevitt 2005-08-24 19:01:32 Proposed patch to getaddrinfo.c to support IPv6 on Windows