diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index 07aaf5779..58fd4a19e 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -2206,6 +2206,7 @@ class fhandler_pty_slave: public fhandler_pty_common return get_ttyp ()->ti.c_lflag & ICANON; } void setup_locale (void); + void set_freeconsole_on_close (bool val); }; #define __ptsname(buf, unit) __small_sprintf ((buf), "/dev/pty%d", (unit)) diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc index 042ffd19c..983e058dc 100644 --- a/winsup/cygwin/fhandler_tty.cc +++ b/winsup/cygwin/fhandler_tty.cc @@ -66,6 +66,7 @@ struct pipe_reply { static int pcon_attached_to = -1; static bool isHybrid; static bool do_not_reset_switch_to_pcon; +static bool freeconsole_on_close = true; #if USE_API_HOOK static void @@ -725,7 +726,8 @@ fhandler_pty_slave::~fhandler_pty_slave () if (used == 0) { init_console_handler (false); - FreeConsole (); + if (freeconsole_on_close) + FreeConsole (); } } } @@ -2660,6 +2662,12 @@ fhandler_pty_slave::setup_locale (void) } } +void +fhandler_pty_slave::set_freeconsole_on_close (bool val) +{ + freeconsole_on_close = val; +} + void fhandler_pty_slave::fixup_after_attach (bool native_maybe, int fd_set) { @@ -2783,7 +2791,8 @@ fhandler_pty_slave::fixup_after_exec () if (used == 1 /* About to close this tty */) { init_console_handler (false); - FreeConsole (); + if (freeconsole_on_close) + FreeConsole (); } } diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index 6a5034219..08d52bb28 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -607,6 +607,8 @@ child_info_spawn::worker (const char *prog_arg, const char *const *argv, attach_to_console = true; } ptys->fixup_after_attach (!iscygwin (), fd); + if (mode == _P_OVERLAY) + ptys->set_freeconsole_on_close (iscygwin ()); } } else if (fh && fh->get_major () == DEV_CONS_MAJOR) @@ -809,6 +811,8 @@ child_info_spawn::worker (const char *prog_arg, const char *const *argv, NtClose (old_winpid_hdl); real_path.get_wide_win32_path (myself->progname); // FIXME: race? sigproc_printf ("new process name %W", myself->progname); + if (!iscygwin ()) + close_all_files (); } else { @@ -907,8 +911,6 @@ child_info_spawn::worker (const char *prog_arg, const char *const *argv, wait_for_myself (); } myself.exit (EXITCODE_NOSET); - if (!iscygwin ()) - close_all_files (); break; case _P_WAIT: case _P_SYSTEM: