]> sourceware.org Git - newlib-cygwin.git/commitdiff
Cygwin: pty: Disable FreeConsole() on close for non cygwin process.
authorTakashi Yano <takashi.yano@nifty.ne.jp>
Fri, 10 Jan 2020 11:46:26 +0000 (20:46 +0900)
committerCorinna Vinschen <corinna@vinschen.de>
Tue, 14 Jan 2020 16:19:19 +0000 (17:19 +0100)
- 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.

winsup/cygwin/fhandler.h
winsup/cygwin/fhandler_tty.cc
winsup/cygwin/spawn.cc

index 4a71c16285d86c2b2c3825a807061c89b1a683a9..c0d56b4dac45a52fd2a91e907e306500aede1330 100644 (file)
@@ -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))
index 042ffd19c3b10509b7176da89fa6d3ef3e713d16..983e058dc4791a5e10633193e8e4c1c20ec5228a 100644 (file)
@@ -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 ();
        }
     }
 
index 6a503421907f7ae3fab023665ec6daa9e240a2ee..08d52bb28850cc0c94346d9148fe096fe6207381 100644 (file)
@@ -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:
This page took 0.04367 seconds and 5 git commands to generate.