diff options
author | Christopher Faylor <me@cgf.cx> | 2001-09-20 20:58:29 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2001-09-20 20:58:29 +0000 |
commit | c50d56bc43deb5299e5e0602a4500aa035d47427 (patch) | |
tree | 8cc975b67f9a1748b1780df461acdf146e90676c /winsup | |
parent | b1711a1f96d2059216cedb9dadcb3d9479b4cb9d (diff) | |
download | newlib-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/ChangeLog | 8 | ||||
-rw-r--r-- | winsup/cygwin/child_info.h | 2 | ||||
-rw-r--r-- | winsup/cygwin/fhandler.cc | 46 | ||||
-rw-r--r-- | winsup/cygwin/fhandler.h | 3 | ||||
-rw-r--r-- | winsup/cygwin/fhandler_tty.cc | 8 |
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 |