Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakashi Yano <takashi.yano@nifty.ne.jp>2020-01-10 14:46:26 +0300
committerCorinna Vinschen <corinna@vinschen.de>2020-01-14 19:19:19 +0300
commit2f415d5efae5a47906f0fdf5080c407b56b5ce20 (patch)
tree447b175f390fc24d7c635950da8b078095a704cd
parent783eaa888feaf4f76df3d3449e29aa20aa78c802 (diff)
Cygwin: pty: Disable FreeConsole() on close for non cygwin process.
- After commit e1a0775dc0545b5f9c81b09a327fc110c538b7b4, the problem reported in https://www.cygwin.com/ml/cygwin/2020-01/msg00093.html occurs. For Gnu scren and tmux, calling FreeConsole() on pty close is necessary. However, if FreeConsole() is called, cygwin setup with '-h' option does not work. Therefore, the commit e1a0775dc0545b5f9c81b09a327fc110c538b7b4 delayed closing pty. This is the cause of the problem above. Now, instead of delaying pty close, FreeConsole() is not called if the process is non cygwin processes such as cygwin setup.
-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: