diff options
author | Takashi Yano <takashi.yano@nifty.ne.jp> | 2024-07-08 23:09:12 +0900 |
---|---|---|
committer | Takashi Yano <takashi.yano@nifty.ne.jp> | 2024-07-09 00:04:41 +0900 |
commit | ce3889ad551503ddc511a7537360f93ba5ad2b25 (patch) | |
tree | 6b964208bfac4783b14d5be80b74a0a8ebbfca14 | |
parent | cc9dcdb11583f9625c2a5ef2f99b588976452f29 (diff) | |
download | newlib-ce3889ad551503ddc511a7537360f93ba5ad2b25.zip newlib-ce3889ad551503ddc511a7537360f93ba5ad2b25.tar.gz newlib-ce3889ad551503ddc511a7537360f93ba5ad2b25.tar.bz2 |
Cygwin: console: Fix for GNU screen/tmux in ConEmugithub/cygwin-3_5-branchcygwin-3_5-branch
If the master process of GNU screen or tmux is started in ConEmu
and ConEmu is closed, reattaching to the GNU screen/tmux in another
console will not work correctly. This is because the ConEmu master
process was already closed even though some console APIs are hooked
by ConEmuHk64.dll to communicate with ConEmu master process. With
this patch, to make them unhooked, DllMain() of ConEmuHk64.dll is
called with DLL_PROCESS_DETACH.
Fixes: 3721a756b0d8 ("Cygwin: console: Make the console accessible from other terminals.")
Signed-off-by: Takashi Yano <takashi.yano@nifty.ne.jp>
(cherry picked from commit ac7c0e23d85a638e6f930aa9a0582812e886a688)
-rw-r--r-- | winsup/cygwin/fhandler/console.cc | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/winsup/cygwin/fhandler/console.cc b/winsup/cygwin/fhandler/console.cc index 8c08a8a..d4c3f10 100644 --- a/winsup/cygwin/fhandler/console.cc +++ b/winsup/cygwin/fhandler/console.cc @@ -33,6 +33,7 @@ details. */ #include "child_info.h" #include "cygwait.h" #include "winf.h" +#include "psapi.h" /* Don't make this bigger than NT_MAX_PATH as long as the temporary buffer is allocated using tmp_pathbuf!!! */ @@ -1970,7 +1971,23 @@ fhandler_console::close () if (!have_execed && !invisible_console && (!CTTY_IS_VALID (myself->ctty) || get_device () == (dev_t) myself->ctty)) - free_console (); + { + /* ConEmu hack. Detach from ConEmu to unhook console APIs. */ + HMODULE h = GetModuleHandle ("ConEmuHk64.dll"); + if (h) + { + MODULEINFO mi; + if (GetModuleInformation (GetCurrentProcess (), h, &mi, sizeof (mi))) + { + BOOL (*DllMain)(HINSTANCE, DWORD, LPVOID) = + (BOOL (*)(HINSTANCE, DWORD, LPVOID)) mi.EntryPoint; + DllMain (h, DLL_PROCESS_DETACH, NULL); + } + } + + /* Freeing console to detach the process from the console. */ + free_console (); + } release_output_mutex (); |