Skip to content
Snippets Groups Projects
Commit c765b4b0 authored by Bruce Momjian's avatar Bruce Momjian
Browse files

Hello!

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
parent d5283ccd
No related branches found
No related tags found
No related merge requests found
......@@ -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"
......
......@@ -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:
......
......@@ -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 */
......
......@@ -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>
......
......@@ -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>
......
......@@ -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 $
*
*-------------------------------------------------------------------------
*/
......@@ -34,10 +34,14 @@
#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;
......
......@@ -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);
......
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason,
LPVOID lpReserved ){
return (TRUE);
}
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
#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"
# 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) $<
<<
# 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!
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment