On Fri, Apr 11, 2014 at 08:28:55AM -0400, Bruce Momjian wrote:
> Once this is applied I will work on changing the libpq socket type to
> use portable pgsocket, but I am not planning to backpatch that unless we
> find a bug.
Attached is a follow up patch which stores socket values in libpq as
pgsocket, rather than int, and maps it to -1 only for the PQsocket()
external return value. In the interest of time, I will apply this later
today, and only to head as it does not fix a bug.
This is the last open item I was working on.
--
Bruce Momjian <[email protected]> http://momjian.us
EnterpriseDB http://enterprisedb.com
+ Everyone has their own god. +
diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
new file mode 100644
index 51d4de4..90b944a
*** a/src/interfaces/libpq/fe-connect.c
--- b/src/interfaces/libpq/fe-connect.c
*************** pqDropConnection(PGconn *conn)
*** 398,406 ****
/* Drop any SSL state */
pqsecure_close(conn);
/* Close the socket itself */
! if (conn->sock >= 0)
closesocket(conn->sock);
! conn->sock = -1;
/* Discard any unread/unsent data */
conn->inStart = conn->inCursor = conn->inEnd = 0;
conn->outCount = 0;
--- 398,406 ----
/* Drop any SSL state */
pqsecure_close(conn);
/* Close the socket itself */
! if (conn->sock != PGINVALID_SOCKET)
closesocket(conn->sock);
! conn->sock = PGINVALID_SOCKET;
/* Discard any unread/unsent data */
conn->inStart = conn->inCursor = conn->inEnd = 0;
conn->outCount = 0;
*************** keep_going: /* We will come back to
*** 1631,1654 ****
addr_cur->ai_addrlen);
conn->raddr.salen = addr_cur->ai_addrlen;
! /* Open a socket */
! {
! /*
! * While we use 'pgsocket' as the socket type in the
! * backend, we use 'int' for libpq socket values.
! * This requires us to map PGINVALID_SOCKET to -1
! * on Windows.
! * See http://msdn.microsoft.com/en-us/library/windows/desktop/ms740516%28v=vs.85%29.aspx
! */
! pgsocket sock = socket(addr_cur->ai_family, SOCK_STREAM, 0);
! #ifdef WIN32
! if (sock == PGINVALID_SOCKET)
! conn->sock = -1;
! else
! #endif
! conn->sock = sock;
! }
! if (conn->sock == -1)
{
/*
* ignore socket() failure if we have more addresses
--- 1631,1638 ----
addr_cur->ai_addrlen);
conn->raddr.salen = addr_cur->ai_addrlen;
! conn->sock = socket(addr_cur->ai_family, SOCK_STREAM, 0);
! if (conn->sock == PGINVALID_SOCKET)
{
/*
* ignore socket() failure if we have more addresses
*************** makeEmptyPGconn(void)
*** 2717,2723 ****
conn->client_encoding = PG_SQL_ASCII;
conn->std_strings = false; /* unless server says differently */
conn->verbosity = PQERRORS_DEFAULT;
! conn->sock = -1;
conn->auth_req_received = false;
conn->password_needed = false;
conn->dot_pgpass_used = false;
--- 2701,2707 ----
conn->client_encoding = PG_SQL_ASCII;
conn->std_strings = false; /* unless server says differently */
conn->verbosity = PQERRORS_DEFAULT;
! conn->sock = PGINVALID_SOCKET;
conn->auth_req_received = false;
conn->password_needed = false;
conn->dot_pgpass_used = false;
*************** closePGconn(PGconn *conn)
*** 2882,2888 ****
* Note that the protocol doesn't allow us to send Terminate messages
* during the startup phase.
*/
! if (conn->sock >= 0 && conn->status == CONNECTION_OK)
{
/*
* Try to send "close connection" message to backend. Ignore any
--- 2866,2872 ----
* Note that the protocol doesn't allow us to send Terminate messages
* during the startup phase.
*/
! if (conn->sock != PGINVALID_SOCKET && conn->status == CONNECTION_OK)
{
/*
* Try to send "close connection" message to backend. Ignore any
*************** PQgetCancel(PGconn *conn)
*** 3103,3109 ****
if (!conn)
return NULL;
! if (conn->sock < 0)
return NULL;
cancel = malloc(sizeof(PGcancel));
--- 3087,3093 ----
if (!conn)
return NULL;
! if (conn->sock == PGINVALID_SOCKET)
return NULL;
cancel = malloc(sizeof(PGcancel));
*************** PQrequestCancel(PGconn *conn)
*** 3284,3290 ****
if (!conn)
return FALSE;
! if (conn->sock < 0)
{
strlcpy(conn->errorMessage.data,
"PQrequestCancel() -- connection is not open\n",
--- 3268,3274 ----
if (!conn)
return FALSE;
! if (conn->sock == PGINVALID_SOCKET)
{
strlcpy(conn->errorMessage.data,
"PQrequestCancel() -- connection is not open\n",
*************** PQsocket(const PGconn *conn)
*** 5329,5335 ****
{
if (!conn)
return -1;
! return conn->sock;
}
int
--- 5313,5319 ----
{
if (!conn)
return -1;
! return (conn->sock != PGINVALID_SOCKET) ? conn->sock : -1;
}
int
diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c
new file mode 100644
index 8ccf6d3..50e4035
*** a/src/interfaces/libpq/fe-exec.c
--- b/src/interfaces/libpq/fe-exec.c
*************** PQfn(PGconn *conn,
*** 2549,2555 ****
/* clear the error string */
resetPQExpBuffer(&conn->errorMessage);
! if (conn->sock < 0 || conn->asyncStatus != PGASYNC_IDLE ||
conn->result != NULL)
{
printfPQExpBuffer(&conn->errorMessage,
--- 2549,2555 ----
/* clear the error string */
resetPQExpBuffer(&conn->errorMessage);
! if (conn->sock == PGINVALID_SOCKET || conn->asyncStatus != PGASYNC_IDLE ||
conn->result != NULL)
{
printfPQExpBuffer(&conn->errorMessage,
diff --git a/src/interfaces/libpq/fe-misc.c b/src/interfaces/libpq/fe-misc.c
new file mode 100644
index a7afd42..cc487b2
*** a/src/interfaces/libpq/fe-misc.c
--- b/src/interfaces/libpq/fe-misc.c
*************** pqReadData(PGconn *conn)
*** 604,610 ****
int someread = 0;
int nread;
! if (conn->sock < 0)
{
printfPQExpBuffer(&conn->errorMessage,
libpq_gettext("connection not open\n"));
--- 604,610 ----
int someread = 0;
int nread;
! if (conn->sock == PGINVALID_SOCKET)
{
printfPQExpBuffer(&conn->errorMessage,
libpq_gettext("connection not open\n"));
*************** pqSendSome(PGconn *conn, int len)
*** 800,806 ****
int remaining = conn->outCount;
int result = 0;
! if (conn->sock < 0)
{
printfPQExpBuffer(&conn->errorMessage,
libpq_gettext("connection not open\n"));
--- 800,806 ----
int remaining = conn->outCount;
int result = 0;
! if (conn->sock == PGINVALID_SOCKET)
{
printfPQExpBuffer(&conn->errorMessage,
libpq_gettext("connection not open\n"));
*************** pqSocketCheck(PGconn *conn, int forRead,
*** 1011,1017 ****
if (!conn)
return -1;
! if (conn->sock < 0)
{
printfPQExpBuffer(&conn->errorMessage,
libpq_gettext("socket not open\n"));
--- 1011,1017 ----
if (!conn)
return -1;
! if (conn->sock == PGINVALID_SOCKET)
{
printfPQExpBuffer(&conn->errorMessage,
libpq_gettext("socket not open\n"));
diff --git a/src/interfaces/libpq/fe-protocol2.c b/src/interfaces/libpq/fe-protocol2.c
new file mode 100644
index f3fddaa..10510b5
*** a/src/interfaces/libpq/fe-protocol2.c
--- b/src/interfaces/libpq/fe-protocol2.c
*************** pqGetline2(PGconn *conn, char *s, int ma
*** 1211,1217 ****
{
int result = 1; /* return value if buffer overflows */
! if (conn->sock < 0 ||
conn->asyncStatus != PGASYNC_COPY_OUT)
{
*s = '\0';
--- 1211,1217 ----
{
int result = 1; /* return value if buffer overflows */
! if (conn->sock == PGINVALID_SOCKET ||
conn->asyncStatus != PGASYNC_COPY_OUT)
{
*s = '\0';
diff --git a/src/interfaces/libpq/fe-protocol3.c b/src/interfaces/libpq/fe-protocol3.c
new file mode 100644
index 47cd7f4..d895589
*** a/src/interfaces/libpq/fe-protocol3.c
--- b/src/interfaces/libpq/fe-protocol3.c
*************** pqGetline3(PGconn *conn, char *s, int ma
*** 1568,1574 ****
{
int status;
! if (conn->sock < 0 ||
(conn->asyncStatus != PGASYNC_COPY_OUT &&
conn->asyncStatus != PGASYNC_COPY_BOTH) ||
conn->copy_is_binary)
--- 1568,1574 ----
{
int status;
! if (conn->sock == PGINVALID_SOCKET ||
(conn->asyncStatus != PGASYNC_COPY_OUT &&
conn->asyncStatus != PGASYNC_COPY_BOTH) ||
conn->copy_is_binary)
diff --git a/src/interfaces/libpq/libpq-int.h b/src/interfaces/libpq/libpq-int.h
new file mode 100644
index ee975d4..0725c17
*** a/src/interfaces/libpq/libpq-int.h
--- b/src/interfaces/libpq/libpq-int.h
*************** struct pg_conn
*** 365,371 ****
/* Connection data */
/* See PQconnectPoll() for how we use 'int' and not 'pgsocket'. */
! int sock; /* Unix FD for socket, -1 if not connected */
SockAddr laddr; /* Local address */
SockAddr raddr; /* Remote address */
ProtocolVersion pversion; /* FE/BE protocol version in use */
--- 365,371 ----
/* Connection data */
/* See PQconnectPoll() for how we use 'int' and not 'pgsocket'. */
! pgsocket sock; /* FD for socket, PGINVALID_SOCKET if unconnected */
SockAddr laddr; /* Local address */
SockAddr raddr; /* Remote address */
ProtocolVersion pversion; /* FE/BE protocol version in use */
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers