From c50d56bc43deb5299e5e0602a4500aa035d47427 Mon Sep 17 00:00:00 2001
From: Christopher Faylor <me@cgf.cx>
Date: Thu, 20 Sep 2001 20:58:29 +0000
Subject: [PATCH] * fhandler.cc (fhandler_base::set_inheritance): Just use
 DUPLICATE_CLOSE_SOURCE to change inheritance.  Eliminate all other logic
 dealing with closed handles. * fhandler.h (fhandler_base::set_inheritance):
 Reflect above change. * fhandler_tty.cc
 (fhandler_tty_common::set_close_on_exec): Ditto.

---
 winsup/cygwin/ChangeLog       |  8 ++++++
 winsup/cygwin/child_info.h    |  2 +-
 winsup/cygwin/fhandler.cc     | 46 ++++++++---------------------------
 winsup/cygwin/fhandler.h      |  3 +--
 winsup/cygwin/fhandler_tty.cc |  8 +++---
 5 files changed, 24 insertions(+), 43 deletions(-)

diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index ecf7b8af8..0935486f4 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,11 @@
+Thu Sep 20 16:48:44 2001  Christopher Faylor <cgf@cygnus.com>
+
+	* fhandler.cc (fhandler_base::set_inheritance): Just use
+	DUPLICATE_CLOSE_SOURCE to change inheritance.  Eliminate all other
+	logic dealing with closed handles.
+	* fhandler.h (fhandler_base::set_inheritance): Reflect above change.
+	* fhandler_tty.cc (fhandler_tty_common::set_close_on_exec): Ditto.
+
 Thu Sep 20 13:34:00 2001  Corinna Vinschen <corinna@vinschen.de>
 
 	* fhandler_socket.cc (fhandler_socket::fixup_after_exec): Close
diff --git a/winsup/cygwin/child_info.h b/winsup/cygwin/child_info.h
index 68d1751b0..983675877 100644
--- a/winsup/cygwin/child_info.h
+++ b/winsup/cygwin/child_info.h
@@ -29,7 +29,7 @@ enum
 class child_info
 {
 public:
-  DWORD zero[1];	// must be zeroed
+  DWORD zero[4];	// must be zeroed
   DWORD cb;		// size of this record
   DWORD type;		// type of record
   int cygpid;		// cygwin pid of child process
diff --git a/winsup/cygwin/fhandler.cc b/winsup/cygwin/fhandler.cc
index 0f38e0207..ff3946512 100644
--- a/winsup/cygwin/fhandler.cc
+++ b/winsup/cygwin/fhandler.cc
@@ -1510,44 +1510,18 @@ fhandler_pipe::lseek (off_t offset, int whence)
   return -1;
 }
 
-#ifdef DEBUGGING
-#define nameparm name
-#else
-#define nameparm
-#endif
-
 void
-fhandler_base::set_inheritance (HANDLE &h, int not_inheriting, const char *nameparm)
-#undef nameparm
+fhandler_base::set_inheritance (HANDLE &h, int not_inheriting)
 {
-  HANDLE newh;
-
-  if (wincap.has_set_handle_information () && (!is_console () ||
-      wincap.has_set_handle_information_on_console_handles ()))
-    (void) SetHandleInformation (h, HANDLE_FLAG_INHERIT,
-    				 not_inheriting ? 0 : HANDLE_FLAG_INHERIT);
-  else if (!DuplicateHandle (hMainProc, h, hMainProc, &newh, 0, !not_inheriting,
-			     DUPLICATE_SAME_ACCESS))
-    debug_printf ("DuplicateHandle %E");
-#ifndef DEBUGGING
-  else
-    {
-      hclose (h);
-      h = newh;
-    }
-#else
-  else if (!name)
-    {
-      hclose (h);
-      h = newh;
-    }
-  else
-  /* FIXME: This won't work with sockets */
-    {
-      ForceCloseHandle2 (h, name);
-      h = newh;
-      ProtectHandle2 (h, name);
-    }
+  /* Note that we could use SetHandleInformation here but it is not available
+     on all platforms.  Test cases seem to indicate that using DuplicateHandle
+     in this fashion does not actually close the original handle, which is
+     what we want.  If this changes in the future, we may be forced to use
+     SetHandleInformation on newer OS's */
+  if (!DuplicateHandle (hMainProc, h, hMainProc, &h, 0, !not_inheriting,
+			     DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE))
+    debug_printf ("DuplicateHandle failed, %E");
+#ifdef DEBUGGING
   setclexec_pid (h, not_inheriting);
 #endif
 }
diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h
index 1ab155743..94c623f8b 100644
--- a/winsup/cygwin/fhandler.h
+++ b/winsup/cygwin/fhandler.h
@@ -310,8 +310,7 @@ public:
   unsigned long get_namehash () { return namehash; }
 
   virtual void hclose (HANDLE h) {CloseHandle (h);}
-  virtual void set_inheritance (HANDLE &h, int not_inheriting,
-				const char *name = NULL);
+  virtual void set_inheritance (HANDLE &h, int not_inheriting);
 
   /* fixup fd possibly non-inherited handles after fork */
   void fork_fixup (HANDLE parent, HANDLE &h, const char *name);
diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
index b0ee336aa..4aa3b0572 100644
--- a/winsup/cygwin/fhandler_tty.cc
+++ b/winsup/cygwin/fhandler_tty.cc
@@ -1119,7 +1119,7 @@ fhandler_tty_common::set_close_on_exec (int val)
   /* FIXME: This is a duplication from fhandler_base::set_close_on_exec.
      It is here because we need to specify the "from_pty" stuff here or
      we'll get warnings from ForceCloseHandle when debugging. */
-  set_inheritance (get_io_handle (), val, "from_pty");
+  set_inheritance (get_io_handle (), val);
   set_close_on_exec_flag (val);
 #endif
   if (output_done_event)
@@ -1130,10 +1130,10 @@ fhandler_tty_common::set_close_on_exec (int val)
     set_inheritance (ioctl_done_event, val);
   if (inuse)
     set_inheritance (inuse, val);
-  set_inheritance (output_mutex, val, "output_mutex");
-  set_inheritance (input_mutex, val, "input_mutex");
+  set_inheritance (output_mutex, val);
+  set_inheritance (input_mutex, val);
   set_inheritance (input_available_event, val);
-  set_inheritance (output_handle, val, "to_pty");
+  set_inheritance (output_handle, val);
 }
 
 void