* 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.
This commit is contained in:
Christopher Faylor 2001-09-20 20:58:29 +00:00
parent b1711a1f96
commit c50d56bc43
5 changed files with 24 additions and 43 deletions

View File

@ -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

View File

@ -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

View File

@ -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
}

View File

@ -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);

View File

@ -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