The following applied patch uses closesocket() for all socket closing
because Win32 requires it, and uses a #define to map that to close() on
Unix.
This patch removes several #ifdef WIN32 defines from libpq. Yea!
---------------------------------------------------------------------------
Bruce Momjian wrote:
> Looking at libpq, you can see Win32 requires closesocket() while Unix
> uses just uses close().
>
> I have to add this type of change to the backend for Win32, so I am
> inclined to make all the socket close calls closesocket() and #define
> that as close() on Unix? It would remove quite a few Win32 defs from
> libpq too.
>
> Comments?
>
> --
> Bruce Momjian | http://candle.pha.pa.us
> pgman@candle.pha.pa.us | (610) 359-1001
> + If your life is a hard drive, | 13 Roberts Road
> + Christ can be your backup. | Newtown Square, Pennsylvania 19073
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster
>
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073
Index: src/backend/libpq/hba.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/libpq/hba.c,v
retrieving revision 1.99
diff -c -c -r1.99 hba.c
*** src/backend/libpq/hba.c 17 Apr 2003 22:26:01 -0000 1.99
--- src/backend/libpq/hba.c 25 Apr 2003 01:16:51 -0000
***************
*** 1212,1218 ****
ident_user);
}
}
! close(sock_fd);
}
}
return ident_return;
--- 1212,1218 ----
ident_user);
}
}
! closesocket(sock_fd);
}
}
return ident_return;
Index: src/backend/libpq/pqcomm.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/libpq/pqcomm.c,v
retrieving revision 1.151
diff -c -c -r1.151 pqcomm.c
*** src/backend/libpq/pqcomm.c 22 Apr 2003 00:08:06 -0000 1.151
--- src/backend/libpq/pqcomm.c 25 Apr 2003 01:16:52 -0000
***************
*** 150,156 ****
if (MyProcPort != NULL)
{
secure_close(MyProcPort);
! close(MyProcPort->sock);
/* make sure any subsequent attempts to do I/O fail cleanly */
MyProcPort->sock = -1;
}
--- 150,156 ----
if (MyProcPort != NULL)
{
secure_close(MyProcPort);
! closesocket(MyProcPort->sock);
/* make sure any subsequent attempts to do I/O fail cleanly */
MyProcPort->sock = -1;
}
***************
*** 228,234 ****
snprintf(portNumberStr, sizeof(portNumberStr), "%d", portNumber);
service = portNumberStr;
}
!
ret = getaddrinfo2(hostName, service, &hint, &addrs);
if (ret || addrs == NULL)
{
--- 228,234 ----
snprintf(portNumberStr, sizeof(portNumberStr), "%d", portNumber);
service = portNumberStr;
}
!
ret = getaddrinfo2(hostName, service, &hint, &addrs);
if (ret || addrs == NULL)
{
***************
*** 470,476 ****
void
StreamClose(int sock)
{
! close(sock);
}
/*
--- 470,476 ----
void
StreamClose(int sock)
{
! closesocket(sock);
}
/*
Index: src/backend/postmaster/pgstat.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/postmaster/pgstat.c,v
retrieving revision 1.32
diff -c -c -r1.32 pgstat.c
*** src/backend/postmaster/pgstat.c 20 Mar 2003 03:34:56 -0000 1.32
--- src/backend/postmaster/pgstat.c 25 Apr 2003 01:16:53 -0000
***************
*** 235,241 ****
startup_failed:
if (pgStatSock >= 0)
! close(pgStatSock);
pgStatSock = -1;
/* Adjust GUC variables to suppress useless activity */
--- 235,241 ----
startup_failed:
if (pgStatSock >= 0)
! closesocket(pgStatSock);
pgStatSock = -1;
/* Adjust GUC variables to suppress useless activity */
***************
*** 359,368 ****
pgstat_close_sockets(void)
{
if (pgStatPmPipe[0] >= 0)
! close(pgStatPmPipe[0]);
pgStatPmPipe[0] = -1;
if (pgStatPmPipe[1] >= 0)
! close(pgStatPmPipe[1]);
pgStatPmPipe[1] = -1;
}
--- 359,368 ----
pgstat_close_sockets(void)
{
if (pgStatPmPipe[0] >= 0)
! closesocket(pgStatPmPipe[0]);
pgStatPmPipe[0] = -1;
if (pgStatPmPipe[1] >= 0)
! closesocket(pgStatPmPipe[1]);
pgStatPmPipe[1] = -1;
}
***************
*** 1120,1126 ****
* Close the writing end of the postmaster pipe, so we'll see it
* closing when the postmaster terminates and can terminate as well.
*/
! close(pgStatPmPipe[1]);
pgStatPmPipe[1] = -1;
/*
--- 1120,1126 ----
* Close the writing end of the postmaster pipe, so we'll see it
* closing when the postmaster terminates and can terminate as well.
*/
! closesocket(pgStatPmPipe[1]);
pgStatPmPipe[1] = -1;
/*
***************
*** 1167,1179 ****
case 0:
/* child becomes collector process */
! close(pgStatPipe[1]);
! close(pgStatSock);
break;
default:
/* parent becomes buffer process */
! close(pgStatPipe[0]);
pgstat_recvbuffer();
exit(0);
}
--- 1167,1179 ----
case 0:
/* child becomes collector process */
! closesocket(pgStatPipe[1]);
! closesocket(pgStatSock);
break;
default:
/* parent becomes buffer process */
! closesocket(pgStatPipe[0]);
pgstat_recvbuffer();
exit(0);
}
Index: src/include/c.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/c.h,v
retrieving revision 1.139
diff -c -c -r1.139 c.h
*** src/include/c.h 22 Apr 2003 02:18:09 -0000 1.139
--- src/include/c.h 25 Apr 2003 01:16:55 -0000
***************
*** 721,726 ****
--- 721,733 ----
#define unlink(from, to) pgunlink(from, to)
#endif
+ /*
+ * Win32 requires a special close for sockets and pipes, while on Unix
+ * close() does them all.
+ */
+ #ifndef WIN32
+ #define closesocket close
+ #endif
/* These are for things that are one way on Unix and another on NT */
#define NULL_DEV "/dev/null"
Index: src/interfaces/libpq/fe-connect.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/interfaces/libpq/fe-connect.c,v
retrieving revision 1.234
diff -c -c -r1.234 fe-connect.c
*** src/interfaces/libpq/fe-connect.c 22 Apr 2003 00:08:07 -0000 1.234
--- src/interfaces/libpq/fe-connect.c 25 Apr 2003 01:16:58 -0000
***************
*** 956,962 ****
/* ignore connect() failure if we have more addrs to try */
if (addr_cur->ai_next != NULL)
{
! close(conn->sock);
conn->sock = -1;
continue;
}
--- 956,962 ----
/* ignore connect() failure if we have more addrs to try */
if (addr_cur->ai_next != NULL)
{
! closesocket(conn->sock);
conn->sock = -1;
continue;
}
***************
*** 1015,1025 ****
if (conn->Pfdebug)
fprintf(conn->Pfdebug, "Postmaster reports error, attempting fallback to pre-7.0.\n");
pqsecure_close(conn);
- #ifdef WIN32
closesocket(conn->sock);
- #else
- close(conn->sock);
- #endif
conn->sock = -1;
conn->allow_ssl_try = FALSE;
return connectDBStart(conn);
--- 1015,1021 ----
***************
*** 1056,1066 ****
if (conn->sock >= 0)
{
pqsecure_close(conn);
- #ifdef WIN32
closesocket(conn->sock);
- #else
- close(conn->sock);
- #endif
conn->sock = -1;
}
conn->status = CONNECTION_BAD;
--- 1052,1058 ----
***************
*** 1935,1945 ****
if (conn->sock >= 0)
{
pqsecure_close(conn);
- #ifdef WIN32
closesocket(conn->sock);
- #else
- close(conn->sock);
- #endif
}
if (conn->pghost)
free(conn->pghost);
--- 1927,1933 ----
***************
*** 2010,2020 ****
if (conn->sock >= 0)
{
pqsecure_close(conn);
- #ifdef WIN32
closesocket(conn->sock);
- #else
- close(conn->sock);
- #endif
}
conn->sock = -1;
conn->status = CONNECTION_BAD; /* Well, not really _bad_ - just
--- 1998,2004 ----
***************
*** 2194,2204 ****
}
/* Sent it, done */
- #ifdef WIN32
closesocket(tmpsock);
WSASetLastError(save_errno);
#else
- close(tmpsock);
errno = save_errno;
#endif
--- 2178,2187 ----
}
/* Sent it, done */
closesocket(tmpsock);
+ #ifdef WIN32
WSASetLastError(save_errno);
#else
errno = save_errno;
#endif
***************
*** 2210,2220 ****
conn->errorMessage.len = strlen(conn->errorMessage.data);
if (tmpsock >= 0)
{
- #ifdef WIN32
closesocket(tmpsock);
WSASetLastError(save_errno);
#else
- close(tmpsock);
errno = save_errno;
#endif
}
--- 2193,2202 ----
conn->errorMessage.len = strlen(conn->errorMessage.data);
if (tmpsock >= 0)
{
closesocket(tmpsock);
+ #ifdef WIN32
WSASetLastError(save_errno);
#else
errno = save_errno;
#endif
}
Index: src/interfaces/libpq/fe-exec.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/interfaces/libpq/fe-exec.c,v
retrieving revision 1.130
diff -c -c -r1.130 fe-exec.c
*** src/interfaces/libpq/fe-exec.c 22 Apr 2003 00:08:07 -0000 1.130
--- src/interfaces/libpq/fe-exec.c 25 Apr 2003 01:17:00 -0000
***************
*** 1154,1164 ****
id, msgLength);
conn->status = CONNECTION_BAD; /* No more connection to backend */
pqsecure_close(conn);
- #ifdef WIN32
closesocket(conn->sock);
- #else
- close(conn->sock);
- #endif
conn->sock = -1;
}
--- 1154,1160 ----
Index: src/interfaces/libpq/fe-misc.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/interfaces/libpq/fe-misc.c,v
retrieving revision 1.90
diff -c -c -r1.90 fe-misc.c
*** src/interfaces/libpq/fe-misc.c 22 Apr 2003 00:08:07 -0000 1.90
--- src/interfaces/libpq/fe-misc.c 25 Apr 2003 01:17:01 -0000
***************
*** 681,691 ****
"\tbefore or while processing the request.\n"));
conn->status = CONNECTION_BAD; /* No more connection to backend */
pqsecure_close(conn);
- #ifdef WIN32
closesocket(conn->sock);
- #else
- close(conn->sock);
- #endif
conn->sock = -1;
return -1;
--- 681,687 ----
Index: src/interfaces/python/pgmodule.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/interfaces/python/pgmodule.c,v
retrieving revision 1.45
diff -c -c -r1.45 pgmodule.c
*** src/interfaces/python/pgmodule.c 25 Mar 2003 02:44:36 -0000 1.45
--- src/interfaces/python/pgmodule.c 25 Apr 2003 01:17:03 -0000
***************
*** 2405,2414 ****
n = j; /* never used before this assignment */
}
if (n)
! {
/* allocate buffer */
if (!(buffer = malloc(MAX_BUFFER_SIZE)))
! {
PyErr_SetString(PyExc_MemoryError,
"can't allocate insert buffer.");
return NULL;
--- 2405,2414 ----
n = j; /* never used before this assignment */
}
if (n)
! {
/* allocate buffer */
if (!(buffer = malloc(MAX_BUFFER_SIZE)))
! {
PyErr_SetString(PyExc_MemoryError,
"can't allocate insert buffer.");
return NULL;
***************
*** 2438,2444 ****
getsubitem = PyTuple_GetItem;
else
getsubitem = PyList_GetItem;
!
/* builds insert line */
bufpt=buffer;
bufsiz = MAX_BUFFER_SIZE - 1;
--- 2438,2444 ----
getsubitem = PyTuple_GetItem;
else
getsubitem = PyList_GetItem;
!
/* builds insert line */
bufpt=buffer;
bufsiz = MAX_BUFFER_SIZE - 1;
***************
*** 2527,2533 ****
{
*bufpt++ = '\t'; --bufsiz;
}
!
if (bufsiz <= 0)
{
free(buffer);
--- 2527,2533 ----
{
*bufpt++ = '\t'; --bufsiz;
}
!
if (bufsiz <= 0)
{
free(buffer);
***************
*** 2543,2549 ****
/* sends data */
PQputline(self->cnx, buffer);
}
!
/* ends query */
PQputline(self->cnx, "\\.\n");
PQendcopy(self->cnx);
--- 2543,2549 ----
/* sends data */
PQputline(self->cnx, buffer);
}
!
/* ends query */
PQputline(self->cnx, "\\.\n");
PQendcopy(self->cnx);