diff options
Diffstat (limited to 'winsup/cygwin/fhandler.cc')
-rw-r--r-- | winsup/cygwin/fhandler.cc | 46 |
1 files changed, 10 insertions, 36 deletions
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 } |