diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
index 756af07b65..47f5d55c32 100644
--- a/src/interfaces/libpq/fe-connect.c
+++ b/src/interfaces/libpq/fe-connect.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.171 2001/07/31 02:14:49 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.172 2001/08/03 22:11:39 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -697,16 +697,16 @@ update_db_info(PGconn *conn)
 static int
 connectMakeNonblocking(PGconn *conn)
 {
-#ifdef WIN32
+#if defined(WIN32) || defined(__BEOS__)
 	int			on = 1;
+#endif
 
+#if defined(WIN32)
 	if (ioctlsocket(conn->sock, FIONBIO, &on) != 0)
 #elif defined(__BEOS__)
-		int			on = 1;
-
 	if (ioctl(conn->sock, FIONBIO, &on) != 0)
 #else
-	if			(fcntl(conn->sock, F_SETFL, O_NONBLOCK) < 0)
+	if (fcntl(conn->sock, F_SETFL, O_NONBLOCK) < 0)
 #endif
 	{
 		printfPQExpBuffer(&conn->errorMessage,
@@ -1194,6 +1194,8 @@ keep_going:						/* We will come back to here until there
 		case CONNECTION_STARTED:
 			{
 				ACCEPT_TYPE_ARG3 laddrlen;
+				int			optval;
+				ACCEPT_TYPE_ARG3 optlen = sizeof(optval);
 
 				/*
 				 * Write ready, since we've made it here, so the
@@ -1205,10 +1207,6 @@ keep_going:						/* We will come back to here until there
 				 * state waiting for us on the socket.
 				 */
 
-#ifndef WIN32
-				int   optval;
-				ACCEPT_TYPE_ARG3 optlen = sizeof(optval);
-
 				if (getsockopt(conn->sock, SOL_SOCKET, SO_ERROR,
 							   (char *) &optval, &optlen) == -1)
 				{
@@ -1217,23 +1215,8 @@ keep_going:						/* We will come back to here until there
 									  strerror(errno));
 					goto error_return;
 				}
-#else
-				char far  optval[8];
-				ACCEPT_TYPE_ARG3 optlen = sizeof(optval);
-			
-				int OptResult=getsockopt(conn->sock, SOL_SOCKET, SO_ERROR,optval, &optlen);
-				if (OptResult==SOCKET_ERROR)
-				{
-					printfPQExpBuffer(&conn->errorMessage,
-							"PQconnectPoll() -- getsockopt() failed: "
-							"errno=%i\n", errno);
-					connectFailureMessage(conn, OptResult);
-					goto error_return;
-				}
-#endif
 				else if (optval != 0)
 				{
-
 					/*
 					 * When using a nonblocking connect, we will typically
 					 * see connect failures at this point, so provide a
diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c
index 924da5fcf2..c512f6928c 100644
--- a/src/interfaces/libpq/fe-exec.c
+++ b/src/interfaces/libpq/fe-exec.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.104 2001/07/20 17:45:06 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.105 2001/08/03 22:11:39 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2037,6 +2037,10 @@ PQoidStatus(const PGresult *res)
 	return buf;
 }
 
+#ifdef WIN32					/* need to get at normal errno here */
+#undef errno
+#endif
+
 /*
   PQoidValue -
 		a perhaps preferable form of the above which just returns
@@ -2051,11 +2055,7 @@ PQoidValue(const PGresult *res)
 	if (!res || !res->cmdStatus || strncmp(res->cmdStatus, "INSERT ", 7) != 0)
 		return InvalidOid;
 
-#ifdef WIN32
-	WSASetLastError(0);
-#else
 	errno = 0;
-#endif
 	result = strtoul(res->cmdStatus + 7, &endptr, 10);
 
 	if (!endptr || (*endptr != ' ' && *endptr != '\0') || errno == ERANGE)
@@ -2064,6 +2064,10 @@ PQoidValue(const PGresult *res)
 		return (Oid) result;
 }
 
+#ifdef WIN32					/* back to socket errno */
+#define errno WSAGetLastError()
+#endif
+
 /*
    PQcmdTuples -
 	if the last command was an INSERT/UPDATE/DELETE, return number
diff --git a/src/interfaces/libpq/fe-lobj.c b/src/interfaces/libpq/fe-lobj.c
index 078184ceb0..f6761319dd 100644
--- a/src/interfaces/libpq/fe-lobj.c
+++ b/src/interfaces/libpq/fe-lobj.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-lobj.c,v 1.35 2001/07/15 13:45:04 petere Exp $
+ *	  $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-lobj.c,v 1.36 2001/08/03 22:11:39 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -31,6 +31,11 @@
 #include "libpq/libpq-fs.h"		/* must come after sys/stat.h */
 
 
+#ifdef WIN32					/* need to use normal errno in this file */
+#undef errno
+#endif
+
+
 #define LO_BUFSIZE		  8192
 
 static int	lo_initialize(PGconn *conn);
diff --git a/src/interfaces/libpq/win32.h b/src/interfaces/libpq/win32.h
index 988455a8ec..38099b079e 100644
--- a/src/interfaces/libpq/win32.h
+++ b/src/interfaces/libpq/win32.h
@@ -7,7 +7,7 @@
 #define strncasecmp(a,b,c) _strnicmp(a,b,c)
 
 /*
- * Some compat functions
+ * Some other compat functions
  */
 #define open(a,b,c) _open(a,b,c)
 #define close(a) _close(a)
@@ -21,18 +21,20 @@
 /*
  * crypt not available (yet)
  */
-#define crypt(a,b) a
+#define crypt(a,b) (a)
 
 /*
- * assumes that errno is used for sockets only
- *
+ * Most of libpq uses "errno" to access error conditions from socket calls,
+ * so on Windows we want to redirect those usages to WSAGetLastError().
+ * Rather than #ifdef'ing every single place that has "errno", hack it up
+ * with a macro instead.  But there are a few places that do need to touch
+ * the regular errno variable.  For them, we #undef and then redefine errno.
  */
 
-#undef errno
-#undef EINTR
-#undef EAGAIN	/* doesn't apply on sockets */
-
 #define errno WSAGetLastError()
+
+#undef EAGAIN	/* doesn't apply on sockets */
+#undef EINTR
 #define EINTR WSAEINTR
 #define EWOULDBLOCK WSAEWOULDBLOCK
 #define ECONNRESET WSAECONNRESET