aboutsummaryrefslogtreecommitdiff
path: root/winsup
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2001-09-20 20:58:29 +0000
committerChristopher Faylor <me@cgf.cx>2001-09-20 20:58:29 +0000
commitc50d56bc43deb5299e5e0602a4500aa035d47427 (patch)
tree8cc975b67f9a1748b1780df461acdf146e90676c /winsup
parentb1711a1f96d2059216cedb9dadcb3d9479b4cb9d (diff)
downloadnewlib-c50d56bc43deb5299e5e0602a4500aa035d47427.zip
newlib-c50d56bc43deb5299e5e0602a4500aa035d47427.tar.gz
newlib-c50d56bc43deb5299e5e0602a4500aa035d47427.tar.bz2
* 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.
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/ChangeLog8
-rw-r--r--winsup/cygwin/child_info.h2
-rw-r--r--winsup/cygwin/fhandler.cc46
-rw-r--r--winsup/cygwin/fhandler.h3
-rw-r--r--winsup/cygwin/fhandler_tty.cc8
5 files changed, 24 insertions, 43 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index ecf7b8a..0935486 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 68d1751..9836758 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 0f38e02..ff39465 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 1ab1557..94c623f 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 b0ee336..4aa3b05 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