From 2b769c82126eeb87eb02a6c1a301beb4edd14407 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 3 Aug 2001 22:11:39 +0000 Subject: [PATCH] Fix residual breakage from Windows socket-errno patch: the routines that should use regular errno, not WSAGetLastError(), now do so again. --- src/interfaces/libpq/fe-connect.c | 31 +++++++------------------------ src/interfaces/libpq/fe-exec.c | 14 +++++++++----- src/interfaces/libpq/fe-lobj.c | 7 ++++++- src/interfaces/libpq/win32.h | 18 ++++++++++-------- 4 files changed, 32 insertions(+), 38 deletions(-) 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 -- GitLab