At VC6, although there are winsock2.h and ws2tcpip.h, there is neither
authorHiroshi Saito <hiroshi@winpg.jp>
Wed, 26 Jul 2006 19:14:15 +0000 (19:14 +0000)
committerHiroshi Saito <hiroshi@winpg.jp>
Wed, 26 Jul 2006 19:14:15 +0000 (19:14 +0000)
a definition of the addrinfo structure nor a definition of getaddrinfo()
and a freeaddrinfo() function.
It seems that a header and a library are insufficient somehow.

psqlodbc.dsp
socket.c
socket.h

index 03665e024e0f014676fadeec14f3269aec25f7e0..ea346625df54f051493eecf7e89db93a3fae162e 100644 (file)
@@ -1,25 +1,25 @@
-# Microsoft Developer Studio Project File - Name="psqlodbc35w" - Package Owner=<4>\r
+# Microsoft Developer Studio Project File - Name="psqlODBC" - Package Owner=<4>\r
 # Microsoft Developer Studio Generated Build File, Format Version 6.00\r
 # ** \95Ò\8fW\82µ\82È\82¢\82Å\82­\82¾\82³\82¢ **\r
 \r
 # TARGTYPE "Win32 (x86) Console Application" 0x0103\r
 \r
-CFG=psqlodbc35w - Win32 Release\r
+CFG=psqlODBC - Win32 Release\r
 !MESSAGE \82±\82ê\82Í\97L\8cø\82ÈÒ²¸Ì§²Ù\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81\82±\82ÌÌßÛ¼Þª¸Ä\82ðËÞÙÄÞ\82·\82é\82½\82ß\82É\82Í NMAKE \82ð\8eg\97p\82µ\82Ä\82­\82¾\82³\82¢\81B\r
 !MESSAGE [Ò²¸Ì§²Ù\82Ì´¸½Îß°Ä] ºÏÝÄÞ\82ð\8eg\97p\82µ\82Ä\8eÀ\8ds\82µ\82Ä\82­\82¾\82³\82¢\r
 !MESSAGE \r
-!MESSAGE NMAKE /f "psqlodbc35w.mak".\r
+!MESSAGE NMAKE /f "psqlodbc.mak".\r
 !MESSAGE \r
 !MESSAGE NMAKE \82Ì\8eÀ\8ds\8e\9e\82É\8d\\90¬\82ð\8ew\92è\82Å\82«\82Ü\82·\r
 !MESSAGE ºÏÝÄޠײÝ\8fã\82ÅϸÛ\82Ì\90Ý\92è\82ð\92è\8b`\82µ\82Ü\82·\81B\97á:\r
 !MESSAGE \r
-!MESSAGE NMAKE /f "psqlodbc35w.mak" CFG="psqlODBC - Win32 Release"\r
-!MESSAGE\r
+!MESSAGE NMAKE /f "psqlodbc.mak" CFG="psqlODBC - Win32 Release"\r
+!MESSAGE \r
 !MESSAGE \91I\91ð\89Â\94\\82ÈËÞÙÄÞ Ó°ÄÞ:\r
-!MESSAGE\r
+!MESSAGE \r
 !MESSAGE "psqlODBC - Win32 Release" ("Win32 (x86) Console Application" \97p)\r
 !MESSAGE "psqlODBC - Win32 Debug" ("Win32 (x86) Console Application" \97p)\r
-!MESSAGE\r
+!MESSAGE \r
 \r
 # Begin Project\r
 # PROP AllowPerConfigDependencies 0\r
@@ -42,7 +42,7 @@ RSC=rc.exe
 # PROP Ignore_Export_Lib 0\r
 # PROP Target_Dir ""\r
 # ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "USE_LIBPQ" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PSQLODBC_EXPORTS" /D ODBCVER=0x0351 /D "DRIVER_CURSOR_IMPLEMENT" /D "WIN_MULTITHREAD_SUPPORT" /D "MULTIBYTE" /D "UNICODE_SUPPORT" /Fp"psqlodbc.pch" /YX /FD /c\r
-# ADD CPP /nologo /MD /W3 /GX /O2 /I "C:\VSHOME\postgresql-8.1.3\src\include" /I "C:\VSHOME\postgresql-8.1.3\src\interfaces\libpq" /I "C:\VSHOME\openssl-0.9.8a\inc32" /D "NDEBUG" /D "USE_LIBPQ" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PSQLODBC_EXPORTS" /D ODBCVER=0x0351 /D "DRIVER_CURSOR_IMPLEMENT" /D "WIN_MULTITHREAD_SUPPORT" /D "MULTIBYTE" /D "UNICODE_SUPPORT" /D "USE_SSL" /Fp"psqlodbc.pch" /YX /FD /c\r
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "C:\HOME\postgresql-8.1.4_client\src\include" /I "C:\HOME\postgresql-8.1.4_client\src\interfaces\libpq" /I "C:\HOME\openssl-0.9.8a\inc32" /D "NDEBUG" /D "USE_LIBPQ" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PSQLODBC_EXPORTS" /D ODBCVER=0x0351 /D "DRIVER_CURSOR_IMPLEMENT" /D "WIN_MULTITHREAD_SUPPORT" /D "MULTIBYTE" /D "UNICODE_SUPPORT" /D "USE_SSL" /Fp"psqlodbc.pch" /YX /FD /c\r
 # ADD BASE RSC /l 0x411 /d "NDEBUG"\r
 # ADD RSC /l 0x411 /i "." /i "japanese" /d "NDEBUG"\r
 # SUBTRACT RSC /x\r
@@ -51,7 +51,7 @@ BSC32=bscmake.exe
 # ADD BSC32 /nologo\r
 LINK32=link.exe\r
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib /nologo /subsystem:windows /machine:I386\r
-# ADD LINK32 wsock32.lib shfolder.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libpq.lib C:\VSHOME\openssl-0.9.8a\out32\ssleay32.lib C:\VSHOME\openssl-0.9.8a\out32\libeay32.lib /nologo /subsystem:windows /dll /pdb:"psqlodbc35w.pdb" /machine:I386 /out:"psqlodbc35w.dll" /implib:"psqlodbc35w.lib" /libpath:"C:\VSHOME\postgresql-8.1.3\src\interfaces\libpq\Release"\r
+# ADD LINK32 ws2_32.lib shfolder.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libpq.lib C:\HOME\openssl-0.9.8a\out32\ssleay32.lib C:\HOME\openssl-0.9.8a\out32\libeay32.lib /nologo /subsystem:windows /dll /pdb:"psqlodbc35w.pdb" /machine:I386 /out:"psqlodbc35w.dll" /implib:"psqlodbc35w.lib" /libpath:"C:\HOME\postgresql-8.1.4_client\src\interfaces\libpq\Release"\r
 # SUBTRACT LINK32 /pdb:none\r
 \r
 !ELSEIF  "$(CFG)" == "psqlODBC - Win32 Debug"\r
@@ -68,7 +68,7 @@ LINK32=link.exe
 # PROP Ignore_Export_Lib 0\r
 # PROP Target_Dir ""\r
 # ADD BASE CPP /nologo /MD /W3 /Gm /GX /ZI /Od /D "USE_LIBPQ" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PSQLODBC_EXPORTS" /D ODBCVER=0x0351 /D "DRIVER_CURSOR_IMPLEMENT" /D "WIN_MULTITHREAD_SUPPORT" /D "MULTIBYTE" /D "UNICODE_SUPPORT" /YX /FD /GZ /c\r
-# ADD CPP /nologo /MD /W3 /Gm /GX /ZI /I "C:\VSHOME\postgresql-8.1.3\src\include" /I "C:\VSHOME\postgresql-8.1.3\src\interfaces\libpq" /I "C:\VSHOME\openssl-0.9.8a\inc32" /D "_DEBUG" /D "USE_LIBPQ" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PSQLODBC_EXPORTS" /D ODBCVER=0x0351 /D "DRIVER_CURSOR_IMPLEMENT" /D "WIN_MULTITHREAD_SUPPORT" /D "MULTIBYTE" /D "UNICODE_SUPPORT" /D "USE_SSL" /FR /YX /FD /GZ /c\r
+# ADD CPP /nologo /MD /W3 /Gm /GX /ZI /I "C:\HOME\postgresql-8.1.4_client\src\include" /I "C:\HOME\postgresql-8.1.4_client\src\interfaces\libpq" /I "C:\HOME\openssl-0.9.8a\inc32" /D "_DEBUG" /D "USE_LIBPQ" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PSQLODBC_EXPORTS" /D ODBCVER=0x0351 /D "DRIVER_CURSOR_IMPLEMENT" /D "WIN_MULTITHREAD_SUPPORT" /D "MULTIBYTE" /D "UNICODE_SUPPORT" /D "USE_SSL" /FR /YX /FD /GZ /c\r
 # ADD BASE RSC /l 0x411 /d "_DEBUG"\r
 # ADD RSC /l 0x411 /i "." /i "japanese" /d "_DEBUG"\r
 # SUBTRACT RSC /x\r
@@ -77,7 +77,7 @@ BSC32=bscmake.exe
 # ADD BSC32 /nologo\r
 LINK32=link.exe\r
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib /nologo /subsystem:windows /debug /machine:I386\r
-# ADD LINK32 wsock32.lib shfolder.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libpq.lib C:\VSHOME\openssl-0.9.8a\out32\ssleay32.lib C:\VSHOME\openssl-0.9.8a\out32\libeay32.lib /nologo /subsystem:windows /dll /pdb:"psqlodbc35w.pdb" /debug /machine:I386 /out:"psqlodbc35w.dll" /implib:"psqlodbc35w.lib" /libpath:"C:\VSHOME\postgresql-8.1.3\src\interfaces\libpq\Debug"\r
+# ADD LINK32 ws2_32.lib shfolder.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libpq.lib C:\HOME\openssl-0.9.8a\out32\ssleay32.lib C:\HOME\openssl-0.9.8a\out32\libeay32.lib /nologo /subsystem:windows /dll /pdb:"psqlodbc35w.pdb" /debug /machine:I386 /out:"psqlodbc35w.dll" /implib:"psqlodbc35w.lib" /libpath:"C:\HOME\postgresql-8.1.4_client\src\interfaces\libpq\Debug"\r
 # SUBTRACT LINK32 /pdb:none\r
 \r
 !ENDIF \r
@@ -335,11 +335,11 @@ SOURCE=win_setup.h
 # PROP Default_Filter ""\r
 # Begin Source File\r
 \r
-SOURCE=.\psqlodbc.rc\r
+SOURCE=.\psqlodbc.def\r
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=.\psqlodbc.def\r
+SOURCE=.\psqlodbc.rc\r
 # End Source File\r
 # Begin Source File\r
 \r
index d9644710bc765a8eee96aa7370cad3bc08d151cf..f0a6f191943226a9005878758816a73ac12e68db 100644 (file)
--- a/socket.c
+++ b/socket.c
@@ -121,6 +121,12 @@ SOCK_Destructor(SocketClass *self)
    free(self);
 }
 
+#if defined(_MSC_VER) && (_MSC_VER < 1300)
+static freeaddrinfo_func freeaddrinfo_ptr = NULL;
+static getaddrinfo_func getaddrinfo_ptr = NULL;
+static getnameinfo_func getnameinfo_ptr = NULL;
+static HMODULE ws2_hnd = NULL;
+#endif
 
 char
 SOCK_connect_to(SocketClass *self, unsigned short port, char *hostname, long timeout)
@@ -129,13 +135,21 @@ SOCK_connect_to(SocketClass *self, unsigned short port, char *hostname, long tim
    int family; 
    char    retval = 0;
 
+
    if (self->socket != -1)
    {
        SOCK_set_error(self, SOCKET_ALREADY_CONNECTED, "Socket is already connected");
        return 0;
    }
 
-
+#if defined(_MSC_VER) && (_MSC_VER < 1300)
+   if (ws2_hnd == NULL)
+       ws2_hnd = GetModuleHandle("ws2_32.dll");
+   if (freeaddrinfo_ptr == NULL)
+       freeaddrinfo_ptr = (freeaddrinfo_func)GetProcAddress(ws2_hnd, "freeaddrinfo"); 
+   if (getnameinfo_ptr == NULL)
+       getaddrinfo_ptr = (getaddrinfo_func)GetProcAddress(ws2_hnd, "getaddrinfo"); 
+#endif
    /*
     * If it is a valid IP address, use it. Otherwise use hostname lookup.
     */
@@ -150,12 +164,20 @@ SOCK_connect_to(SocketClass *self, unsigned short port, char *hostname, long tim
        snprintf(portstr, sizeof(portstr), "%d", port);
        if (inet_addr(hostname) != INADDR_NONE)
            rest.ai_flags = AI_NUMERICHOST; 
+#if defined(_MSC_VER) && (_MSC_VER < 1300)
+       ret = getaddrinfo_ptr(hostname, portstr, &rest, &addrs);
+#else
        ret = getaddrinfo(hostname, portstr, &rest, &addrs);
+#endif
        if (ret || !addrs)
        {
            SOCK_set_error(self, SOCKET_HOST_NOT_FOUND, "Could not resolve hostname.");
            if (addrs)
+#if defined(_MSC_VER) && (_MSC_VER < 1300)
+               freeaddrinfo_ptr(addrs);
+#else
                freeaddrinfo(addrs);
+#endif
            return 0;
        }
        curadr = addrs;
@@ -310,7 +332,11 @@ cleanup:
            goto retry;
        }
        if (addrs)
+#if defined(_MSC_VER) && (_MSC_VER < 1300)
+           freeaddrinfo_ptr(addrs);
+#else
            freeaddrinfo(addrs);
+#endif
    }
    return retval;
 }
index ebab3fe8ca45474278a9df106384850942801e6c..556d70e7a88afcd4993e3ff5e8b9545ae01c78ec 100644 (file)
--- a/socket.h
+++ b/socket.h
@@ -38,8 +38,54 @@ typedef unsigned int in_addr_t;
 #define HAVE_UNIX_SOCKETS
 #endif /* HAVE_SYS_UN_H */
 #else
+
 #include <winsock2.h>
 #include <ws2tcpip.h>
+
+#if defined(_MSC_VER) && (_MSC_VER < 1300)
+/*
+ *      The order of the structure elements on Win32 doesn't match the
+ *      order specified in the standard, but we have to match it for
+ *      IPv6 to work.
+ */
+
+#define AI_PASSIVE     0x1  // Socket address will be used in bind() call.
+#define AI_CANONNAME   0x2  // Return canonical name in first ai_canonname.
+#define AI_NUMERICHOST 0x4  // Nodename must be a numeric address string.
+
+#define _SS_MAXSIZE 128
+#define _SS_ALIGNSIZE (sizeof(__int64))
+#define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof (short))
+#define _SS_PAD2SIZE (_SS_MAXSIZE - (sizeof (short) + _SS_PAD1SIZE + _SS_ALIGNSIZE))
+
+typedef int socklen_t;
+
+struct sockaddr_storage {
+   short ss_family;
+   char __ss_pad1[_SS_PAD1SIZE];
+   __int64 __ss_align;
+   char __ss_pad2[_SS_PAD2SIZE];
+};
+struct addrinfo
+{
+   int     ai_flags;
+   int     ai_family;
+   int     ai_socktype;
+   int     ai_protocol;
+   size_t  ai_addrlen;
+   char    *ai_canonname;
+   struct sockaddr *ai_addr;
+   struct addrinfo *ai_next;
+};
+typedef void (WSAAPI *freeaddrinfo_func) (struct addrinfo*); 
+typedef int (WSAAPI *getaddrinfo_func) (const char*, const char*, 
+                                       const struct addrinfo*, 
+                                       struct addrinfo**); 
+typedef int (WSAAPI *getnameinfo_func) (const struct sockaddr*,
+                                       socklen_t, char*, DWORD,
+                                       char*, DWORD, int);
+#endif
+
 #include <libpq-fe.h>
 #include <openssl/ssl.h>
 #define SOCKETFD SOCKET