summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/fhandler.h1
-rw-r--r--winsup/cygwin/fhandler_tty.cc13
-rw-r--r--winsup/cygwin/spawn.cc6
3 files changed, 16 insertions, 4 deletions
diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h
index 4a71c1628..c0d56b4da 100644
--- a/winsup/cygwin/fhandler.h
+++ b/winsup/cygwin/fhandler.h
@@ -2200,6 +2200,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 ();
}
}
}
@@ -2661,6 +2663,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)
{
if (fd < 0)
@@ -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: