]> granicus.if.org Git - postgresql/commitdiff
Hello!
authorBruce Momjian <bruce@momjian.us>
Fri, 3 Jul 1998 04:24:16 +0000 (04:24 +0000)
committerBruce Momjian <bruce@momjian.us>
Fri, 3 Jul 1998 04:24:16 +0000 (04:24 +0000)
Through some minor changes, I have been able to compile the libpq
client libraries on the Win32 platform. Since the libpq communications
part has been rewritten, this has become much easier. Enclosed is
a patch that will allow at least Microsoft Visual C++ to compile
libpq into both a static and a dynamic library.  I will take a look
at porting the psql frontend as well, but I figured it was a good
idea to send in these patches first - so no major changes are done
to the files before it gets applied (if it does).

Regards,
  Magnus Hagander

12 files changed:
src/include/postgres.h
src/interfaces/libpq/fe-auth.c
src/interfaces/libpq/fe-connect.c
src/interfaces/libpq/fe-exec.c
src/interfaces/libpq/fe-lobj.c
src/interfaces/libpq/fe-misc.c
src/interfaces/libpq/fe-print.c
src/interfaces/libpq/libpqdll.c [new file with mode: 0644]
src/interfaces/libpq/libpqdll.def [new file with mode: 0644]
src/interfaces/libpq/win32.h [new file with mode: 0644]
src/interfaces/libpq/win32.mak [new file with mode: 0644]
src/win32.mak [new file with mode: 0644]

index 82806f0f313ebd53fce7d5d1338c34a168145cb6..f6cbc47c55ecdaf61f2c4b140e64c118f34f6403 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1995, Regents of the University of California
  *
- * $Id: postgres.h,v 1.16 1998/04/26 04:08:18 momjian Exp $
+ * $Id: postgres.h,v 1.17 1998/07/03 04:24:10 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -37,7 +37,9 @@
 #define POSTGRES_H
 
 #include "postgres_ext.h"
+#ifndef WIN32
 #include "config.h"
+#endif
 #include "c.h"
 #include "utils/elog.h"
 #include "utils/palloc.h"
index a5d842d905de3517905dea4fed94948ca0a6134b..022c5cb3860c01229c92eba4a2a0bc787f2a2898 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-auth.c,v 1.17 1998/06/15 19:30:22 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-auth.c,v 1.18 1998/07/03 04:24:11 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -24,6 +24,9 @@
  *
  *
  */
+#ifdef WIN32
+#include "win32.h"
+#else
 #include <stdio.h>
 #include <string.h>
 #include <sys/param.h>                 /* for MAXHOSTNAMELEN on most */
@@ -33,6 +36,7 @@
 #endif
 #include <unistd.h>
 #include <pwd.h>
+#endif /* WIN32 */
 
 #include "postgres.h"
 
@@ -600,10 +604,18 @@ fe_getauthname(char *PQerrormsg)
 #endif
                case STARTUP_MSG:
                        {
+#ifdef WIN32
+                               char username[128];
+                               DWORD namesize = sizeof(username) - 1;
+
+                               if (GetUserName(username,&namesize)) 
+                                       name = username;
+#else
                                struct passwd *pw = getpwuid(geteuid());
 
                                if (pw)
                                        name = pw->pw_name;
+#endif
                        }
                        break;
                default:
index b95f86b02b509ddcfd601bf33914198461f1b270..ba886d4c643230e7ce86300751ecb00b8bc799a8 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.69 1998/06/21 16:39:11 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.70 1998/07/03 04:24:12 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -407,6 +407,7 @@ connectDB(PGconn *conn)
                                family,
                                len;
        char            beresp;
+       int                     on = 1;
 
        /*
         * Initialize the startup packet.
@@ -456,8 +457,11 @@ connectDB(PGconn *conn)
                conn->raddr.in.sin_port = htons((unsigned short) (portno));
                len = sizeof(struct sockaddr_in);
        }
+#ifndef WIN32
        else
                len = UNIXSOCK_PATH(conn->raddr.un, portno);
+#endif
+       
 
        /* Connect to the server  */
        if ((conn->sock = socket(family, SOCK_STREAM, 0)) < 0)
@@ -482,7 +486,11 @@ connectDB(PGconn *conn)
         * We need nonblocking I/O, and we don't want delay of outgoing data.
         */
 
+#ifndef WIN32
        if (fcntl(conn->sock, F_SETFL, O_NONBLOCK) < 0)
+#else
+       if (ioctlsocket(conn->sock,FIONBIO, &on) != 0) 
+#endif
        {
                (void) sprintf(conn->errorMessage,
                                           "connectDB() -- fcntl() failed: errno=%d\n%s\n",
@@ -493,7 +501,6 @@ connectDB(PGconn *conn)
        if (family == AF_INET)
        {
                struct protoent *pe;
-               int                     on = 1;
 
                pe = getprotobyname("TCP");
                if (pe == NULL)
@@ -503,11 +510,18 @@ connectDB(PGconn *conn)
                        goto connect_errReturn;
                }
                if (setsockopt(conn->sock, pe->p_proto, TCP_NODELAY,
-                                          &on, sizeof(on)) < 0)
+#ifdef WIN32
+                       (char *)
+#endif
+                                          &on, 
+                                          sizeof(on)) < 0)
                {
                        (void) sprintf(conn->errorMessage,
                                                   "connectDB() -- setsockopt failed: errno=%d\n%s\n",
                                                   errno, strerror(errno));
+#ifdef WIN32
+                       printf("Winsock error: %i\n",WSAGetLastError());
+#endif
                        goto connect_errReturn;
                }
        }
@@ -666,7 +680,11 @@ connectDB(PGconn *conn)
 connect_errReturn:
        if (conn->sock >= 0)
        {
+#ifdef WIN32
+               closesocket(conn->sock);
+#else
                close(conn->sock);
+#endif
                conn->sock = -1;
        }
        return CONNECTION_BAD;
@@ -742,7 +760,11 @@ freePGconn(PGconn *conn)
                return;
        PQclearAsyncResult(conn);       /* deallocate result and curTuple */
        if (conn->sock >= 0)
-               close(conn->sock);              /* shouldn't happen, but... */
+#ifdef WIN32
+               closesocket(conn->sock);
+#else
+               close(conn->sock);
+#endif
        if (conn->pghost)
                free(conn->pghost);
        if (conn->pgport)
@@ -783,6 +805,7 @@ closePGconn(PGconn *conn)
                 * If connection is already gone, that's cool.  No reason for kernel
                 * to kill us when we try to write to it.  So ignore SIGPIPE signals.
                 */
+#ifndef WIN32
 #if defined(USE_POSIX_SIGNALS)
                struct sigaction ignore_action;
                struct sigaction oldaction;
@@ -806,13 +829,18 @@ closePGconn(PGconn *conn)
 
                signal(SIGPIPE, oldsignal);
 #endif
+#endif /* Win32 uses no signals at all */
        }
 
        /*
         * Close the connection, reset all transient state, flush I/O buffers.
         */
        if (conn->sock >= 0)
+#ifdef WIN32
+               closesocket(conn->sock);
+#else
                close(conn->sock);
+#endif
        conn->sock = -1;
        conn->status = CONNECTION_BAD;          /* Well, not really _bad_ - just
                                                                                 * absent */
index 506edc8b1a3958c6043313d240755a0a840a2ce4..49bd6d07e513363c1bf655b014cdfd4afa72c9ea 100644 (file)
@@ -7,10 +7,13 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.54 1998/06/16 07:29:48 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.55 1998/07/03 04:24:13 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
+#ifdef WIN32
+#include "win32.h"
+#endif
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
index d18a4d53c153e152ce8692973f84b3012f79ad42..a59815fc529624b49e0deb166c6b295015b4ac46 100644 (file)
@@ -7,11 +7,16 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-lobj.c,v 1.13 1998/06/15 19:30:26 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-lobj.c,v 1.14 1998/07/03 04:24:14 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
+#ifdef WIN32
+#include "win32.h"
+#include <io.h>
+#else
 #include <unistd.h>
+#endif
 #include <stdio.h>
 #include <string.h>
 #include <fcntl.h>
index e79460798d9e4e712769d802d9bc12b31f955269..52bf28b6123cedee49aa17ae35a4772489457022 100644 (file)
@@ -24,7 +24,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.15 1998/06/15 19:30:26 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.16 1998/07/03 04:24:14 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include <string.h>
 #include <errno.h>
 #include <time.h>
+#ifdef WIN32
+#include "win32.h"
+#else
 #include <sys/time.h>
 #if !defined(NO_UNISTD_H)
 #include <unistd.h>
 #endif
+#endif /* WIN32 */
 #include <sys/types.h>                 /* for fd_set stuff */
 #ifdef HAVE_SYS_SELECT_H
 #include <sys/select.h>
@@ -412,7 +416,11 @@ tryAgain2:
                        " before or while processing the request.\n");
        conn->status = CONNECTION_BAD; /* No more connection to
                                                                        * backend */
+#ifdef WIN32
+       closesocket(conn->sock);
+#else
        close(conn->sock);
+#endif
        conn->sock = -1;
        
        return -1;
index ae820561c06f016ca4fc07ca10d62500ed1d2812..586ec370aa44e1d6bdd29c4a4fce4032786da9b0 100644 (file)
@@ -9,24 +9,31 @@
  * didn't really belong there.
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-print.c,v 1.5 1998/06/16 07:29:49 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-print.c,v 1.6 1998/07/03 04:24:15 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
+#ifdef WIN32
+#include "win32.h"
+#endif
 #include <postgres.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <signal.h>
 #include <string.h>
+#ifndef WIN32
 #include <unistd.h>
 #include <sys/ioctl.h>
+#endif
 #include "libpq/pqsignal.h"
 #include "libpq-fe.h"
+#ifndef WIN32
 #ifndef HAVE_TERMIOS_H
 #include <sys/termios.h>
 #else
 #include <termios.h>
 #endif
+#endif /* WIN32 */
 
 #ifdef MB
 #include "regex/pg_wchar.h"
@@ -143,9 +150,13 @@ PQprint(FILE *fout,
 
                if (fout == NULL)
                        fout = stdout;
-               if (po->pager && fout == stdout &&
+               if (po->pager && fout == stdout 
+#ifndef WIN32
+                       &&
                        isatty(fileno(stdin)) &&
-                       isatty(fileno(stdout)))
+                       isatty(fileno(stdout))
+#endif
+                       )
                {
                        /* try to pipe to the pager program if possible */
 #ifdef TIOCGWINSZ
@@ -174,11 +185,17 @@ PQprint(FILE *fout,
                                  - (po->header != 0) * 2               /* row count and newline */
                                  )))
                        {
+#ifdef WIN32
+                               fout = _popen(pagerenv, "w");
+#else
                                fout = popen(pagerenv, "w");
+#endif
                                if (fout)
                                {
                                        usePipe = 1;
+#ifndef WIN32
                                        pqsignal(SIGPIPE, SIG_IGN);
+#endif
                                }
                                else
                                        fout = stdout;
@@ -289,8 +306,12 @@ PQprint(FILE *fout,
                free(fieldNames);
                if (usePipe)
                {
+#ifdef WIN32
+                       _pclose(fout);
+#else
                        pclose(fout);
                        pqsignal(SIGPIPE, SIG_DFL);
+#endif
                }
                if (po->html3 && !po->expanded)
                        fputs("</table>\n", fout);
diff --git a/src/interfaces/libpq/libpqdll.c b/src/interfaces/libpq/libpqdll.c
new file mode 100644 (file)
index 0000000..aa67806
--- /dev/null
@@ -0,0 +1,6 @@
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+BOOL WINAPI DllMain( HINSTANCE hinstDLL,                      DWORD fdwReason,
+                     LPVOID lpReserved ){
+       return (TRUE);
+}
diff --git a/src/interfaces/libpq/libpqdll.def b/src/interfaces/libpq/libpqdll.def
new file mode 100644 (file)
index 0000000..0a46f82
--- /dev/null
@@ -0,0 +1,73 @@
+LIBRARY LIBPQ
+DESCRIPTION "Postgres Client Access Library"
+EXPORTS
+       PQconnectdb             @ 1
+       PQconndefaults          @ 2
+       PQsetdbLogin            @ 3
+       PQfinish                @ 4
+       PQreset                 @ 5
+       PQdb                    @ 6
+       PQuser                  @ 7
+       PQhost                  @ 8
+       PQoptions               @ 9
+       PQport                  @ 10
+       PQtty                   @ 11
+       PQstatus                @ 12
+       PQerrorMessage          @ 13
+       PQsocket                @ 14
+       PQtrace                 @ 15
+       PQuntrace               @ 16
+       PQexec                  @ 17
+       PQnotifies              @ 18
+       PQsendQuery             @ 19
+       PQgetResult             @ 20
+       PQisBusy                @ 21
+       PQconsumeInput          @ 22
+       PQrequestCancel         @ 23
+       PQgetline               @ 24
+       PQputline               @ 25
+       PQendcopy               @ 26
+       PQfn                    @ 27
+       PQclearAsyncResult      @ 28
+       PQresultStatus          @ 29
+       PQntuples               @ 30
+       PQnfields               @ 31
+       PQfname                 @ 32
+       PQfnumber               @ 33
+       PQftype                 @ 34
+       PQfsize                 @ 35
+       PQfmod                  @ 36
+       PQcmdStatus             @ 37
+       PQoidStatus             @ 38
+       PQcmdTuples             @ 39
+       PQgetvalue              @ 40
+       PQgetlength             @ 41
+       PQgetisnull             @ 42
+       PQclear                 @ 43
+       PQprint                 @ 44
+       PQdisplayTuples         @ 45
+       PQprintTuples           @ 46
+       fe_getauthsvc           @ 47
+       fe_setauthsvc           @ 48
+       fe_getauthname          @ 49
+       pqGetc                  @ 50
+       pqGets                  @ 51
+       pqPuts                  @ 52
+       pqGetnchar              @ 53
+       pqPutnchar              @ 54
+       pqGetInt                @ 55
+       pqPutInt                @ 56
+       pqReadData              @ 57
+       pqFlush                 @ 58
+       pqWait                  @ 59
+       lo_open                 @ 60
+       lo_close                @ 61
+       lo_read                 @ 62
+       lo_write                @ 63
+       lo_lseek                @ 64
+       lo_creat                @ 65
+       lo_tell                 @ 66
+       lo_unlink               @ 67
+       lo_import               @ 68
+       lo_export               @ 69
+               
diff --git a/src/interfaces/libpq/win32.h b/src/interfaces/libpq/win32.h
new file mode 100644 (file)
index 0000000..878c7af
--- /dev/null
@@ -0,0 +1,35 @@
+#include <winsock.h>
+
+/*
+ * strcasecmp() is not in Windows, stricmp is, though
+ */
+#define strcasecmp(a,b) stricmp(a,b)
+
+
+
+#define NO_UNISTD_H
+
+
+/*
+ * Some compat functions 
+ */
+#define open(a,b,c) _open(a,b,c)
+#define read(a,b,c) _read(a,b,c)
+#define write(a,b,c) _write(a,b,c)
+
+
+/*
+ * crypt not available (yet)
+ */
+#define crypt(a,b) a
+
+
+
+/*
+ * Parts of config.h that you get with autoconf on other systems
+ */
+
+/*
+ * Default port to connect to
+ */
+#define DEF_PGPORT "5432"
diff --git a/src/interfaces/libpq/win32.mak b/src/interfaces/libpq/win32.mak
new file mode 100644 (file)
index 0000000..4c50caf
--- /dev/null
@@ -0,0 +1,112 @@
+# Makefile for Microsoft Visual C++ 5.0 (or compat)
+
+# Will build a Win32 static library (non-debug) libpq.lib
+#        and a Win32 dynamic library (non-debug) libpq.dll with import library libpqdll.lib
+
+
+!IF "$(OS)" == "Windows_NT"
+NULL=
+!ELSE 
+NULL=nul
+!ENDIF 
+
+CPP=cl.exe
+
+OUTDIR=.\Release
+INTDIR=.\Release
+# Begin Custom Macros
+OutDir=.\Release
+# End Custom Macros
+
+ALL : "$(OUTDIR)\libpq.lib" "$(OUTDIR)\libpq.dll" 
+
+CLEAN :
+       -@erase "$(INTDIR)\dllist.obj"
+       -@erase "$(INTDIR)\fe-auth.obj"
+       -@erase "$(INTDIR)\fe-connect.obj"
+       -@erase "$(INTDIR)\fe-exec.obj"
+       -@erase "$(INTDIR)\fe-lobj.obj"
+       -@erase "$(INTDIR)\fe-misc.obj"
+       -@erase "$(INTDIR)\fe-print.obj"
+        -@erase "$(OUTDIR)\libpqdll.obj"
+       -@erase "$(INTDIR)\vc50.idb"
+       -@erase "$(OUTDIR)\libpq.lib"
+        -@erase "$(OUTDIR)\libpq.dll"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP_PROJ=/nologo /ML /W3 /GX /O2 /I "..\..\include" /D "NDEBUG" /D\
+ "WIN32" /D "_WINDOWS" /Fp"$(INTDIR)\libpq.pch" /YX\
+ /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c 
+CPP_OBJS=.\Release/
+CPP_SBRS=.
+       
+LIB32=link.exe -lib
+LIB32_FLAGS=/nologo /out:"$(OUTDIR)\libpq.lib" 
+LIB32_OBJS= \
+       "$(INTDIR)\dllist.obj" \
+       "$(INTDIR)\fe-auth.obj" \
+       "$(INTDIR)\fe-connect.obj" \
+       "$(INTDIR)\fe-exec.obj" \
+       "$(INTDIR)\fe-lobj.obj" \
+       "$(INTDIR)\fe-misc.obj" \
+       "$(INTDIR)\fe-print.obj"
+
+LINK32=link.exe
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib wsock32.lib\
+ odbccp32.lib /nologo /subsystem:windows /dll /incremental:no\
+ /pdb:"$(OUTDIR)\libpqdll.pdb" /machine:I386 /out:"$(OUTDIR)\libpq.dll"\
+ /implib:"$(OUTDIR)\libpqdll.lib"  /def:libpqdll.def
+LINK32_OBJS= \
+       "$(INTDIR)\libpqdll.obj" \
+       "$(OUTDIR)\libpq.lib"
+
+
+"$(OUTDIR)\libpq.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS)
+    $(LIB32) @<<
+  $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS)
+<<
+
+"$(OUTDIR)\libpq.dll" : "$(OUTDIR)" "$(OUTDIR)\libpqdll.obj" "$(INTDIR)\libpqdll.obj"
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+
+"$(OUTDIR)\dllist.obj" : ..\..\backend\lib\dllist.c
+    $(CPP) @<<
+    $(CPP_PROJ) ..\..\backend\lib\dllist.c
+<<
+    
+
+.c{$(CPP_OBJS)}.obj::
+   $(CPP) @<<
+   $(CPP_PROJ) $<
+<<
+
+.cpp{$(CPP_OBJS)}.obj::
+   $(CPP) @<<
+   $(CPP_PROJ) $< 
+<<
+
+.cxx{$(CPP_OBJS)}.obj::
+   $(CPP) @<<
+   $(CPP_PROJ) $< 
+<<
+
+.c{$(CPP_SBRS)}.sbr::
+   $(CPP) @<<
+   $(CPP_PROJ) $< 
+<<
+
+.cpp{$(CPP_SBRS)}.sbr::
+   $(CPP) @<<
+   $(CPP_PROJ) $< 
+<<
+
+.cxx{$(CPP_SBRS)}.sbr::
+   $(CPP) @<<
+   $(CPP_PROJ) $< 
+<<
diff --git a/src/win32.mak b/src/win32.mak
new file mode 100644 (file)
index 0000000..fbfc350
--- /dev/null
@@ -0,0 +1,17 @@
+# Makefile for Microsoft Visual C++ 5.0 (or compat)
+
+# Top-file makefile for Win32 parts of postgresql.
+
+# Note that most parts are not ported to Win32!
+
+!IF "$(OS)" == "Windows_NT"
+NULL=
+!ELSE 
+NULL=nul
+!ENDIF 
+
+ALL: 
+   cd interfaces\libpq
+   nmake /f win32.mak
+   cd ..\..
+   echo All Win32 parts have been built!