mirror of
https://github.com/mintty/wsltty.git
synced 2025-11-03 16:41:52 +00:00
Compare commits
22 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9469b2b5f5 | ||
|
|
5b27a3d3c8 | ||
|
|
ab46c2b1b0 | ||
|
|
2e56730282 | ||
|
|
d67ce45c3e | ||
|
|
6e74ab4d5b | ||
|
|
ee4e403f4c | ||
|
|
a332cf8eaa | ||
|
|
07aa6c692d | ||
|
|
74dad091ce | ||
|
|
8d896ceb36 | ||
|
|
90cf6f5d15 | ||
|
|
2cd6d190d6 | ||
|
|
38b8a5e93d | ||
|
|
105d0b4ec5 | ||
|
|
6c5a0f1fba | ||
|
|
f31eae1a41 | ||
|
|
600e6e69ba | ||
|
|
9c9b88d416 | ||
|
|
9feb6b7187 | ||
|
|
416fcd1d0d | ||
|
|
2457a1fb10 |
226
0001-notify-size-change-inband.patch
Normal file
226
0001-notify-size-change-inband.patch
Normal file
@@ -0,0 +1,226 @@
|
|||||||
|
diff --git a/src/wslbridge2-backend.cpp b/src/wslbridge2-backend.cpp
|
||||||
|
index 8b86cc6..63a19e5 100644
|
||||||
|
--- a/src/wslbridge2-backend.cpp
|
||||||
|
+++ b/src/wslbridge2-backend.cpp
|
||||||
|
@@ -17,6 +17,7 @@
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <wordexp.h>
|
||||||
|
+#include <limits.h> // PIPE_BUF
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
@@ -196,6 +197,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
|
ssize_t readRet = 0, writeRet = 0;
|
||||||
|
char data[1024]; /* Buffer to hold raw data from pty */
|
||||||
|
+ assert(sizeof data <= PIPE_BUF);
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
@@ -206,8 +208,85 @@ int main(int argc, char *argv[])
|
||||||
|
if (fds[0].revents & POLLIN)
|
||||||
|
{
|
||||||
|
readRet = recv(ioSockets.inputSock, data, sizeof data, 0);
|
||||||
|
- if (readRet > 0)
|
||||||
|
- writeRet = write(mfd_dp, data, readRet);
|
||||||
|
+ char * s = data;
|
||||||
|
+ int len = readRet;
|
||||||
|
+ writeRet = 1;
|
||||||
|
+ while (writeRet > 0 && len > 0)
|
||||||
|
+ {
|
||||||
|
+ if (!*s)
|
||||||
|
+ {
|
||||||
|
+ // dispatch NUL escaped inband information
|
||||||
|
+ s++;
|
||||||
|
+ len--;
|
||||||
|
+
|
||||||
|
+ if (len < 9 && s + 9 >= data + sizeof data)
|
||||||
|
+ {
|
||||||
|
+ // make room for additional loading
|
||||||
|
+ memcpy(data, s, len);
|
||||||
|
+ s = data;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ // ensure 1 more byte is loaded to dispatch on
|
||||||
|
+ if (!len)
|
||||||
|
+ {
|
||||||
|
+ readRet = recv(ioSockets.inputSock, s, 1, 0);
|
||||||
|
+ if (readRet > 0)
|
||||||
|
+ {
|
||||||
|
+ len += readRet;
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ writeRet = -1;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ if (*s == 2)
|
||||||
|
+ {
|
||||||
|
+ // STX: escaped NUL
|
||||||
|
+ s++;
|
||||||
|
+ len--;
|
||||||
|
+ writeRet = write(mfd_dp, "", 1);
|
||||||
|
+ }
|
||||||
|
+ else if (*s == 16)
|
||||||
|
+ {
|
||||||
|
+ // DLE: terminal window size change
|
||||||
|
+ s++;
|
||||||
|
+ len--;
|
||||||
|
+ // ensure 8 more bytes are loaded for winsize
|
||||||
|
+ while (readRet > 0 && len < 8)
|
||||||
|
+ {
|
||||||
|
+ readRet = recv(ioSockets.inputSock, s + len, 8 - len, 0);
|
||||||
|
+ if (readRet > 0)
|
||||||
|
+ {
|
||||||
|
+ len += readRet;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ if (readRet <= 0)
|
||||||
|
+ {
|
||||||
|
+ writeRet = -1;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ struct winsize * winsp = (struct winsize *)s;
|
||||||
|
+ s += 8;
|
||||||
|
+ len -= 8;
|
||||||
|
+ winsp->ws_xpixel = 0;
|
||||||
|
+ winsp->ws_ypixel = 0;
|
||||||
|
+ ret = ioctl(mfd, TIOCSWINSZ, winsp);
|
||||||
|
+ if (ret != 0)
|
||||||
|
+ perror("ioctl(TIOCSWINSZ)");
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ int n = strnlen(s, len);
|
||||||
|
+ writeRet = write(mfd_dp, s, n);
|
||||||
|
+ if (writeRet > 0)
|
||||||
|
+ {
|
||||||
|
+ s += writeRet;
|
||||||
|
+ len -= writeRet;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Resize window when buffer received in control socket */
|
||||||
|
diff --git a/src/wslbridge2.cpp b/src/wslbridge2.cpp
|
||||||
|
index 300ad57..3ba9096 100644
|
||||||
|
--- a/src/wslbridge2.cpp
|
||||||
|
+++ b/src/wslbridge2.cpp
|
||||||
|
@@ -43,19 +43,41 @@ union IoSockets
|
||||||
|
/* global variable */
|
||||||
|
static volatile union IoSockets g_ioSockets = { 0 };
|
||||||
|
|
||||||
|
+#define dont_debug_inband
|
||||||
|
+#define dont_use_controlsocket
|
||||||
|
+
|
||||||
|
static void resize_window(int signum)
|
||||||
|
{
|
||||||
|
+#ifdef use_controlsocket
|
||||||
|
+#warning this may crash for unknown reason, maybe terminate the backend
|
||||||
|
struct winsize winp;
|
||||||
|
+ ioctl(STDIN_FILENO, TIOCGWINSZ, &winp);
|
||||||
|
|
||||||
|
/* Send terminal window size to control socket */
|
||||||
|
- ioctl(STDIN_FILENO, TIOCGWINSZ, &winp);
|
||||||
|
send(g_ioSockets.controlSock, (char *)&winp, sizeof winp, 0);
|
||||||
|
+#else
|
||||||
|
+ static char wins[2 + sizeof(struct winsize)] = {0, 16};
|
||||||
|
+ static struct winsize * winsp = (struct winsize *)&wins[2];
|
||||||
|
+ ioctl(STDIN_FILENO, TIOCGWINSZ, winsp);
|
||||||
|
+
|
||||||
|
+#ifdef debug_inband
|
||||||
|
+ /* Send terminal window size inband, visualized as ESC sequence */
|
||||||
|
+ char resizesc[55];
|
||||||
|
+ //sprintf(resizesc, "\e_8;%u;%u\a", winsp->ws_row, winsp->ws_col);
|
||||||
|
+ sprintf(resizesc, "^[_8;%u;%u^G", winsp->ws_row, winsp->ws_col);
|
||||||
|
+ send(g_ioSockets.inputSock, resizesc, strlen(resizesc), 0);
|
||||||
|
+#else
|
||||||
|
+ /* Send terminal window size inband, with NUL escape */
|
||||||
|
+ send(g_ioSockets.inputSock, wins, sizeof wins, 0);
|
||||||
|
+#endif
|
||||||
|
+#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static void* send_buffer(void *param)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
char data[1024];
|
||||||
|
+ assert(sizeof data <= PIPE_BUF);
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
@@ -65,8 +87,33 @@ static void* send_buffer(void *param)
|
||||||
|
closesocket(g_ioSockets.inputSock);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
- if (!send(g_ioSockets.inputSock, data, ret, 0))
|
||||||
|
- break;
|
||||||
|
+ char * s = data;
|
||||||
|
+ int len = ret;
|
||||||
|
+ while (ret > 0 && len > 0)
|
||||||
|
+ {
|
||||||
|
+ if (!*s)
|
||||||
|
+ {
|
||||||
|
+ // send NUL STX
|
||||||
|
+#ifdef debug_inband
|
||||||
|
+ ret = send(g_ioSockets.inputSock, (void*)"nul", 3, 0);
|
||||||
|
+#else
|
||||||
|
+ static char NUL_STX[] = {0, 2};
|
||||||
|
+ ret = send(g_ioSockets.inputSock, NUL_STX, 2, 0);
|
||||||
|
+#endif
|
||||||
|
+ s++;
|
||||||
|
+ len--;
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ int n = strnlen(s, len);
|
||||||
|
+ ret = send(g_ioSockets.inputSock, s, n, 0);
|
||||||
|
+ if (ret > 0)
|
||||||
|
+ {
|
||||||
|
+ s += ret;
|
||||||
|
+ len -= ret;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_exit(&ret);
|
||||||
|
@@ -480,16 +527,6 @@ int main(int argc, char *argv[])
|
||||||
|
g_ioSockets.controlSock = win_local_accept(controlSock);
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* Capture window resize signal and send buffer to control socket */
|
||||||
|
- {
|
||||||
|
- struct sigaction act;
|
||||||
|
- memset(&act, 0, sizeof act);
|
||||||
|
- act.sa_handler = resize_window;
|
||||||
|
- act.sa_flags = SA_RESTART;
|
||||||
|
- ret = sigaction(SIGWINCH, &act, NULL);
|
||||||
|
- assert(ret == 0);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
/* Create thread to send input buffer to input socket */
|
||||||
|
pthread_t tidInput;
|
||||||
|
ret = pthread_create(&tidInput, nullptr, send_buffer, nullptr);
|
||||||
|
@@ -502,6 +539,17 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
|
termState.enterRawMode();
|
||||||
|
|
||||||
|
+ /* Create thread to send window size through control socket */
|
||||||
|
+ struct sigaction act = {};
|
||||||
|
+ act.sa_handler = resize_window;
|
||||||
|
+ act.sa_flags = SA_RESTART;
|
||||||
|
+ ret = sigaction(SIGWINCH, &act, NULL);
|
||||||
|
+ assert(ret == 0);
|
||||||
|
+
|
||||||
|
+ /* Notify initial size in case it's changed since starting */
|
||||||
|
+ //resize_window(0);
|
||||||
|
+ kill(getpid(), SIGWINCH);
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* wsltty#254: WORKAROUND: Terminates input thread forcefully
|
||||||
|
* when output thread exits. Need some inter-thread syncing.
|
||||||
12
README.md
12
README.md
@@ -35,17 +35,23 @@ You may need to open the Properties of the installer first, tab “General”
|
|||||||
section “Security” (if available) and select “Unblock”,
|
section “Security” (if available) and select “Unblock”,
|
||||||
to enable the “Run anyway” button.
|
to enable the “Run anyway” button.
|
||||||
|
|
||||||
|
#### Installation from archive ####
|
||||||
|
|
||||||
|
In case a local anti-virus guard barfs about the wsltty installer, the
|
||||||
|
release also contains a `.cab` file. Download it, open it, extract its files
|
||||||
|
to some temporary deployment directory, and invoke `install.bat` from there.
|
||||||
|
|
||||||
#### Installation from source repository ####
|
#### Installation from source repository ####
|
||||||
|
|
||||||
Checkout the wsltty repository, or download the source archive, unpack and rename the directory to `wsltty`.
|
Checkout the wsltty repository, or download the source archive, unpack and rename the directory to `wsltty`.
|
||||||
Invoke `make` (or `make pkg` if directory is called `wsltty-master`),
|
Install Alpine WSL from the Microsoft Store.
|
||||||
then `make install`.
|
Invoke `make build`, then `make install`.
|
||||||
|
|
||||||
Note this has to be done within a Cygwin environment. A minimal Cygwin
|
Note this has to be done within a Cygwin environment. A minimal Cygwin
|
||||||
environment for this purpose would be installed with the
|
environment for this purpose would be installed with the
|
||||||
[Cygwin installer](https://cygwin.com/setup-x86_64.exe)
|
[Cygwin installer](https://cygwin.com/setup-x86_64.exe)
|
||||||
from [cygwin.com](https://cygwin.com/),
|
from [cygwin.com](https://cygwin.com/),
|
||||||
with additional packages `make`, `gcc-g++ 9.3.0`, `unzip`, `zoo`.
|
with additional packages `make`, `gcc-g++`, `unzip`, `zoo`, `patch`, (`lcab`).
|
||||||
|
|
||||||
#### Installation to non-default locations ####
|
#### Installation to non-default locations ####
|
||||||
|
|
||||||
|
|||||||
@@ -14,10 +14,10 @@ copy () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
delete () {
|
delete () {
|
||||||
from=/F
|
from="$1"
|
||||||
to="$1"
|
to="$1" # same again, to fill parameter
|
||||||
export from to
|
export from to
|
||||||
cmd /c cmd2.bat del
|
cmd /c cmd2.bat del/F
|
||||||
}
|
}
|
||||||
|
|
||||||
compare () {
|
compare () {
|
||||||
@@ -291,7 +291,16 @@ config () {
|
|||||||
echoc "- root $root"
|
echoc "- root $root"
|
||||||
wdir=%USERPROFILE%
|
wdir=%USERPROFILE%
|
||||||
|
|
||||||
if $ok && [ -n "$distro" ]
|
case "$name" in
|
||||||
|
docker*) echo skipping docker system
|
||||||
|
return;;
|
||||||
|
esac
|
||||||
|
case "$root" in
|
||||||
|
*\\Docker*) echo skipping docker system
|
||||||
|
return;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if $ok && ! $remove && [ -n "$distro" ]
|
||||||
then # fix #163: backend missing +x with certain mount options
|
then # fix #163: backend missing +x with certain mount options
|
||||||
echo Setting +x wslbridge2 backends for distro "'$distro'"
|
echo Setting +x wslbridge2 backends for distro "'$distro'"
|
||||||
(cd "$INSTDIR"; cd bin; PATH="${WINDIR}/Sysnative:${PATH}" wsl.exe -d "$distro" chmod +x wslbridge2-backend)
|
(cd "$INSTDIR"; cd bin; PATH="${WINDIR}/Sysnative:${PATH}" wsl.exe -d "$distro" chmod +x wslbridge2-backend)
|
||||||
|
|||||||
85
makefile
85
makefile
@@ -4,20 +4,22 @@
|
|||||||
# make targets:
|
# make targets:
|
||||||
# make [all] build a distributable installer (default)
|
# make [all] build a distributable installer (default)
|
||||||
# make pkg build an installer, bypassing the system checks
|
# make pkg build an installer, bypassing the system checks
|
||||||
|
# make build build the software (no installer)
|
||||||
|
# make install install wsltty locally from build (no installer needed)
|
||||||
# make wsltty build the software, using the local copy of mintty
|
# make wsltty build the software, using the local copy of mintty
|
||||||
|
|
||||||
|
|
||||||
# wsltty release
|
# wsltty release
|
||||||
ver=3.4.1
|
ver=3.5.0.2
|
||||||
|
|
||||||
# wsltty appx release - must have 4 parts!
|
# wsltty appx release - must have 4 parts!
|
||||||
verx=3.4.1.0
|
verx=3.5.0.2
|
||||||
|
|
||||||
|
|
||||||
##############################
|
##############################
|
||||||
# mintty release version
|
# mintty release version
|
||||||
|
|
||||||
minttyver=3.4.1
|
minttyver=3.5.0
|
||||||
|
|
||||||
##############################
|
##############################
|
||||||
|
|
||||||
@@ -25,7 +27,7 @@ minttyver=3.4.1
|
|||||||
repo=Biswa96/wslbridge2
|
repo=Biswa96/wslbridge2
|
||||||
|
|
||||||
# wslbridge2 master release version
|
# wslbridge2 master release version
|
||||||
wslbridgever=0.6
|
wslbridgever=0.8
|
||||||
|
|
||||||
# wslbridge2 latest version
|
# wslbridge2 latest version
|
||||||
#archive=master
|
#archive=master
|
||||||
@@ -240,38 +242,48 @@ appx-bin:
|
|||||||
cp /bin/cygwin1.dll bin/
|
cp /bin/cygwin1.dll bin/
|
||||||
cp /bin/cygwin-console-helper.exe bin/
|
cp /bin/cygwin-console-helper.exe bin/
|
||||||
|
|
||||||
cop: ver
|
CAB=wsltty-$(ver)-$(arch)
|
||||||
mkdir -p rel
|
|
||||||
rm -f rel/wsltty-$(ver)-install-$(arch).exe
|
|
||||||
sed -e "s,%version%,$(ver)," -e "s,%arch%,$(arch)," makewinx.cfg > rel/wsltty.SED
|
|
||||||
cp bin/cygwin1.dll rel/
|
|
||||||
cp bin/cygwin-console-helper.exe rel/
|
|
||||||
cp bin/dash.exe rel/
|
|
||||||
cp bin/regtool.exe rel/
|
|
||||||
cp bin/mintty.exe rel/
|
|
||||||
cp bin/zoo.exe rel/
|
|
||||||
cp lang.zoo rel/
|
|
||||||
cp themes.zoo rel/
|
|
||||||
cp sounds.zoo rel/
|
|
||||||
cp charnames.txt rel/
|
|
||||||
cp bin/wslbridge2.exe rel/
|
|
||||||
cp bin/wslbridge2-backend rel/
|
|
||||||
cp mkshortcut.vbs rel/
|
|
||||||
#cp bin/mkshortcut.exe rel/
|
|
||||||
#cp bin/cygpopt-0.dll rel/
|
|
||||||
#cp bin/cygiconv-2.dll rel/
|
|
||||||
#cp bin/cygintl-8.dll rel/
|
|
||||||
cp LICENSE.* rel/
|
|
||||||
cp VERSION rel/
|
|
||||||
cp *.lnk rel/
|
|
||||||
cp *.ico rel/
|
|
||||||
cp *.url rel/
|
|
||||||
cp *.bat rel/
|
|
||||||
cp *.sh rel/
|
|
||||||
cp *.vbs rel/
|
|
||||||
|
|
||||||
cab: cop
|
copcab: ver
|
||||||
|
mkdir -p $(CAB)
|
||||||
|
cp bin/cygwin1.dll $(CAB)/
|
||||||
|
cp bin/cygwin-console-helper.exe $(CAB)/
|
||||||
|
cp bin/dash.exe $(CAB)/
|
||||||
|
cp bin/regtool.exe $(CAB)/
|
||||||
|
cp bin/mintty.exe $(CAB)/
|
||||||
|
cp bin/zoo.exe $(CAB)/
|
||||||
|
cp lang.zoo $(CAB)/
|
||||||
|
cp themes.zoo $(CAB)/
|
||||||
|
cp sounds.zoo $(CAB)/
|
||||||
|
cp charnames.txt $(CAB)/
|
||||||
|
cp bin/wslbridge2.exe $(CAB)/
|
||||||
|
cp bin/wslbridge2-backend $(CAB)/
|
||||||
|
cp mkshortcut.vbs $(CAB)/
|
||||||
|
#cp bin/mkshortcut.exe $(CAB)/
|
||||||
|
#cp bin/cygpopt-0.dll $(CAB)/
|
||||||
|
#cp bin/cygiconv-2.dll $(CAB)/
|
||||||
|
#cp bin/cygintl-8.dll $(CAB)/
|
||||||
|
cp LICENSE.* $(CAB)/
|
||||||
|
cp VERSION $(CAB)/
|
||||||
|
cp *.lnk $(CAB)/
|
||||||
|
cp *.ico $(CAB)/
|
||||||
|
cp *.url $(CAB)/
|
||||||
|
cp *.bat $(CAB)/
|
||||||
|
cp config-distros.sh $(CAB)/
|
||||||
|
cp mkshortcut.vbs $(CAB)/
|
||||||
|
|
||||||
|
cop: copcab
|
||||||
|
mkdir -p rel
|
||||||
|
cp -fl $(CAB)/* rel/
|
||||||
|
|
||||||
|
installer: cop
|
||||||
|
# prepare build of installer
|
||||||
|
rm -f rel/$(CAB)-install.exe
|
||||||
|
sed -e "s,%version%,$(ver)," -e "s,%arch%,$(arch)," makewinx.cfg > rel/wsltty.SED
|
||||||
|
# build installer
|
||||||
cd rel; iexpress /n wsltty.SED
|
cd rel; iexpress /n wsltty.SED
|
||||||
|
# build cab archive
|
||||||
|
lcab -r $(CAB) rel/$(CAB).cab
|
||||||
|
|
||||||
install: cop installbat
|
install: cop installbat
|
||||||
|
|
||||||
@@ -288,8 +300,11 @@ mintty-usr: mintty-get mintty-appx
|
|||||||
# local wsltty build target:
|
# local wsltty build target:
|
||||||
wsltty: wslbridge cygwin mintty-build mintty-pkg
|
wsltty: wslbridge cygwin mintty-build mintty-pkg
|
||||||
|
|
||||||
|
# build software without installer:
|
||||||
|
build: wslbridge cygwin mintty-get mintty-build mintty-pkg
|
||||||
|
|
||||||
# standalone wsltty package build target:
|
# standalone wsltty package build target:
|
||||||
pkg: wslbridge cygwin mintty-get mintty-build mintty-pkg cab
|
pkg: wslbridge cygwin mintty-get mintty-build mintty-pkg installer
|
||||||
|
|
||||||
# appx package contents target:
|
# appx package contents target:
|
||||||
wsltty-appx: wslbridge appx-bin mintty-get mintty-build-appx mintty-appx
|
wsltty-appx: wslbridge appx-bin mintty-get mintty-build-appx mintty-appx
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ SourceFiles=SourceFiles
|
|||||||
InstallPrompt=Install Mintty terminal for WSL (Windows Subsystem for Linux)?
|
InstallPrompt=Install Mintty terminal for WSL (Windows Subsystem for Linux)?
|
||||||
DisplayLicense=
|
DisplayLicense=
|
||||||
FinishMessage=Mintty for WSL installed - for documentation and configuration see https://github.com/mintty/wsltty
|
FinishMessage=Mintty for WSL installed - for documentation and configuration see https://github.com/mintty/wsltty
|
||||||
TargetName=wsltty-%version%-install-%arch%.exe
|
TargetName=wsltty-%version%-%arch%-install.exe
|
||||||
FriendlyName=wsltty
|
FriendlyName=wsltty
|
||||||
AppLaunched=cmd.exe /c install.bat
|
AppLaunched=cmd.exe /c install.bat
|
||||||
PostInstallCmd=<None>
|
PostInstallCmd=<None>
|
||||||
|
|||||||
Reference in New Issue
Block a user