From c0d730460fc93ae83a50a5375b843ccb9b020e66 Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Sat, 22 Aug 1998 04:34:22 +0000
Subject: [PATCH] The attached patch fixes a problem that I seem to have
 introduced with the new support for asynchronous NOTIFY in libpgtcl.  With
 the current sources, if the backend disconnects unexpectedly then the tcl/tk
 application coredumps when control next reaches the idle loop.  Oops.

			regards, tom lane
---
 src/interfaces/libpgtcl/pgtclId.c | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/src/interfaces/libpgtcl/pgtclId.c b/src/interfaces/libpgtcl/pgtclId.c
index 05dfb19b6de..1d3cd29709a 100644
--- a/src/interfaces/libpgtcl/pgtclId.c
+++ b/src/interfaces/libpgtcl/pgtclId.c
@@ -12,7 +12,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/interfaces/libpgtcl/Attic/pgtclId.c,v 1.12 1998/08/17 03:50:26 scrappy Exp $
+ *	  $Header: /cvsroot/pgsql/src/interfaces/libpgtcl/Attic/pgtclId.c,v 1.13 1998/08/22 04:34:22 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -475,6 +475,7 @@ static void Pg_Notify_SetupProc (ClientData clientData, int flags)
 {
     Pg_ConnectionId *connid = (Pg_ConnectionId *) clientData;
     Tcl_File handle;
+    int pqsock;
 
     /* We classify SQL notifies as Tcl file events. */
     if (!(flags & TCL_FILE_EVENTS)) {
@@ -482,7 +483,11 @@ static void Pg_Notify_SetupProc (ClientData clientData, int flags)
     }
 
     /* Set up to watch for asynchronous data arrival on backend channel */
-    handle = Tcl_GetFile((ClientData) PQsocket(connid->conn), TCL_UNIX_FD);
+    pqsock = PQsocket(connid->conn);
+    if (pqsock < 0)
+      return;
+
+    handle = Tcl_GetFile((ClientData) pqsock, TCL_UNIX_FD);
     Tcl_WatchFile(handle, TCL_READABLE);
 }
 
@@ -492,6 +497,7 @@ static void Pg_Notify_CheckProc (ClientData clientData, int flags)
 {
     Pg_ConnectionId *connid = (Pg_ConnectionId *) clientData;
     Tcl_File handle;
+    int pqsock;
 
     /* We classify SQL notifies as Tcl file events. */
     if (!(flags & TCL_FILE_EVENTS)) {
@@ -503,7 +509,11 @@ static void Pg_Notify_CheckProc (ClientData clientData, int flags)
      * We use Tcl_FileReady to avoid a useless kernel call
      * when no data is available.
      */
-    handle = Tcl_GetFile((ClientData) PQsocket(connid->conn), TCL_UNIX_FD);
+    pqsock = PQsocket(connid->conn);
+    if (pqsock < 0)
+      return;
+
+    handle = Tcl_GetFile((ClientData) pqsock, TCL_UNIX_FD);
     if (Tcl_FileReady(handle, TCL_READABLE) != 0) {
 	PQconsumeInput(connid->conn);
     }