1
0
mirror of https://github.com/mintty/wsltty.git synced 2025-11-05 01:21:53 +00:00

Compare commits

..

58 Commits
3.0.6 ... 3.5.1

Author SHA1 Message Date
mintty
76fad756e1 3.5.1 2021-09-03 22:37:00 +02:00
mintty
600df69bb8 3.5.1 2021-09-03 22:05:59 +02:00
mintty
97dc68d64a ensure wsltty-specific recompile for mintty -V message (#284) 2021-05-11 00:57:26 +02:00
mintty
9469b2b5f5 3.5.0.2 2021-05-01 19:16:58 +02:00
mintty
5b27a3d3c8 update to wslbridge 0.8, matching the updated patch 2021-04-27 21:46:31 +02:00
mintty
ab46c2b1b0 Merge pull request #282 from Biswa96/master
update wslbridge2 patch file, to catch up with wslbridge2 0.8, to fix #281
2021-04-27 21:44:37 +02:00
Biswapriyo Nath
2e56730282 update wslbridge2 patch file 2021-04-27 23:42:59 +05:30
mintty
d67ce45c3e 3.5.0 2021-04-15 18:07:12 +02:00
mintty
6e74ab4d5b filter out "docker" default distributions from configuration (#277) 2021-04-09 10:29:21 +02:00
mintty
ee4e403f4c filter out "docker" distributions from configuration (#277) 2021-04-07 14:30:15 +02:00
mintty
a332cf8eaa 3.4.7 2021-03-18 19:38:25 +01:00
mintty
07aa6c692d fix rebased patch; restore backend patch part 2021-03-18 19:38:07 +01:00
mintty
74dad091ce rebase patch; add setlocale patch (#273) 2021-03-16 12:07:18 +01:00
mintty
8d896ceb36 3.4.5 2021-02-17 14:29:07 +01:00
mintty
90cf6f5d15 align install file names for better sorting in release area (fixed) 2020-12-27 18:57:32 +01:00
mintty
2cd6d190d6 align install file names for better sorting in release area 2020-12-20 23:24:36 +01:00
mintty
38b8a5e93d 3.4.4 2020-12-20 23:12:13 +01:00
mintty
105d0b4ec5 uninstall: skip backend stuff, fix del parameters (~#263) 2020-11-13 12:35:13 +01:00
mintty
6c5a0f1fba support and describe local installation (from repository) without installer 2020-11-13 12:14:40 +01:00
mintty
f31eae1a41 add missing patch to repository 2020-11-12 14:33:51 +01:00
mintty
600e6e69ba instructions for installation from archive (#250) 2020-11-11 12:06:01 +01:00
mintty
9c9b88d416 3.4.3 2020-11-11 11:59:08 +01:00
mintty
9feb6b7187 build also cab file to circumvent anti-virus issues with installer (#250) 2020-11-11 11:49:57 +01:00
mintty
416fcd1d0d 3.4.2 2020-11-04 18:39:06 +01:00
mintty
2457a1fb10 doc build (#247) 2020-10-24 17:39:42 +02:00
mintty
8e09414b4b 3.4.1 2020-10-24 17:22:10 +02:00
mintty
4a0b7328da document uninstallation (#258) 2020-10-13 14:53:25 +02:00
mintty
afd3d6d9e8 hint to workaround for #197;
some minor tweaks
2020-09-04 11:58:28 +02:00
mintty
9c6d75b09e add details for installation cygwin for an installation from source 2020-08-27 14:59:12 +02:00
mintty
47ede36283 3.3.0 2020-08-06 20:50:20 +02:00
mintty
b488a82a52 3.3.0 2020-08-06 19:58:27 +02:00
mintty
cadefd0ec0 3.2.0 2020-06-20 19:51:21 +02:00
mintty
0b4418399b 3.1.8 2020-06-11 16:39:39 +02:00
mintty
1f4de96e01 notes on curing various WSL startup issues (#246, #248) 2020-06-02 22:45:05 +02:00
mintty
1d8c80a6d4 disclaimer for choco and scoop installation instructions (~240) 2020-04-29 17:49:49 +02:00
mintty
e85b7fbb6a add note about Windows Defender settings (#239) 2020-04-17 13:05:55 +02:00
mintty
ae9dff3427 3.1.4.2 2020-04-02 15:00:32 +02:00
mintty
b8ad6553c4 fix installer: invoke configuration (#232), shortcuts generation (#237, #162),
usernames with spaces (#230) and other chars (#213), #162 generate shortcuts
2020-04-02 14:44:32 +02:00
mintty
8964534a5c 2020-04-02 14:44:21 +02:00
mintty
70b6f4cc45 fix imported distros fix (#226) 2020-04-01 20:27:19 +02:00
mintty
223671ce0d Merge pull request #236 from Conduitry/fix-fallback-icon
fix fallback icon in generated shortcuts
2020-04-01 20:25:09 +02:00
Conduitry
37032d79fa fix fallback icon in generated shortcuts 2020-03-30 01:13:25 -04:00
mintty
bbee0d6339 3.1.4 2020-03-07 19:05:28 +01:00
Thomas Wolff
00c4c2f20b tweak removal of ALL previous shortcuts, also on reconfigure (#218) 2020-03-05 14:15:57 +01:00
Thomas Wolff
9ae697ac20 fix cd /D "%installdir%" for drive changing (#223) 2020-03-05 11:07:31 +01:00
mintty
6397307878 3.1.0.3; fix wsl invocation from cygwin32 2020-02-15 13:44:53 +01:00
Thomas Wolff
67b1596fd2 Merge branch 'master' of https://github.com/mintty/wsltty 2020-01-20 15:49:58 +01:00
Thomas Wolff
433b11c47b remove ALL shortcut lnk and bat files (#218) 2020-01-20 15:49:04 +01:00
Thomas Wolff
2aace74c9d additional quoting for CMD variables (#213) 2020-01-20 15:47:56 +01:00
mintty
afa230733a ConPTY support via bundling with cygwin 3.1.0 2019-12-17 01:04:08 +01:00
mintty
40fe1db02c 2019-12-02 22:10:53 +01:00
Thomas Wolff
b6800f7762 2019-12-02 16:39:56 +01:00
Thomas Wolff
8a3f7d19df adapt removal ref to previous installer (now arch-specific) 2019-12-02 15:48:08 +01:00
Thomas Wolff
4f6e12741a fix icon access 2019-12-02 15:18:13 +01:00
Thomas Wolff
bc7e612b0c login mode (#196, #191, #70, #56, #37) 2019-11-29 17:29:20 +01:00
Thomas Wolff
2aefc8ae13 3.1.0; support 32-bit build; propagate proxy to backend for package download 2019-11-25 16:35:07 +01:00
Thomas Wolff
83a9c12fc6 update to wslbridge2 release v0.5 2019-10-30 14:48:44 +01:00
Thomas Wolff
79d9ab6f70 ensure backend build dependencies 2019-10-14 17:42:13 +02:00
11 changed files with 633 additions and 245 deletions

View 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.

104
README.md
View File

@@ -35,11 +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`, then `make install`. Install Alpine WSL from the Microsoft Store.
Note this has to be done within a Cygwin environment. Invoke `make build`, then `make install`.
Note this has to be done within a Cygwin environment. A minimal Cygwin
environment for this purpose would be installed with the
[Cygwin installer](https://cygwin.com/setup-x86_64.exe)
from [cygwin.com](https://cygwin.com/),
with additional packages `make`, `gcc-g++`, `unzip`, `zoo`, `patch`, (`lcab`).
#### Installation to non-default locations #### #### Installation to non-default locations ####
@@ -50,6 +62,9 @@ the optional second parameter designates the configuration directory.
### Installation with other package management environments ### ### Installation with other package management environments ###
Note that these are 3rd-party contributions and do not necessarily
provide the latest version.
#### Chocolatey #### #### Chocolatey ####
If you use the [Chocolatey package manager](https://chocolatey.org/), If you use the [Chocolatey package manager](https://chocolatey.org/),
@@ -71,7 +86,12 @@ then, invoke one of
A Windows Appx package and certificate is available in the [wsltty.appx](https://github.com/mintty/wsltty.appx/) repository. A Windows Appx package and certificate is available in the [wsltty.appx](https://github.com/mintty/wsltty.appx/) repository.
<br clear=all> ### Uninstallation ###
To uninstall wsltty desktop, start menu, and context menu integration:
Open a Windows `cmd`, go into the wsltty installation folder:
`cd %LOCALAPPDATA%\wsltty` and run the `uninstall` script.
To uninstall wsltty software completely, remove the installation folder manually.
--- ---
@@ -85,10 +105,37 @@ WSLtty can be invoked with
Starting the mintty terminal directly from the WSLtty installation location Starting the mintty terminal directly from the WSLtty installation location
is discouraged because that would bypass essential options. is discouraged because that would bypass essential options.
#### WSL 2 #### #### WSL V2 ####
The new wslbridge2 gateway provides two versions, for WSL V1 and V2 mode, respectively. Terminal communication with WSL via its modes V1 or V2 is handled
Mintty automatically detects the WSL version and invokes the proper gateway. automatically by wsltty (mintty and the wslbridge2 gateway).
#### Starting issues ####
If wsltty fails with an
`Error: Could not fork child process: Resource temporarily unavailable`...,
its runtime may be affected by some over-ambitious virus defense strategy.
For example, with Windows Defender, option “Force randomization for images”
should be disabled.
If wsltty fails with an error message that mentions a disk mount path (e.g. `/mnt/c`),
workarounds may be the shutdown of the WSL V2 virtual machine (`wsl --shutdown` on the distro)
or turning off “fast startup” in the Windows power settings (#246, #248).
#### WSL shell starting issues ####
With WSL V2, an additional background shell is run which may cause trouble
for example when setting up automatic interaction between Windows side and
WSL side
(see https://github.com/mintty/wsltty/issues/197#issuecomment-687030527).
As a workaround, the following may be added to (the beginning of) the
WSL shell initialization script `.bashrc` (adapt for other shells):
```
# work around https://github.com/mintty/wsltty/issues/197
if [[ -n "$WSL_DISTRO_NAME" ]]; then
command -v cmd.exe > /dev/null || exit
fi
```
--- ---
@@ -97,7 +144,7 @@ Mintty automatically detects the WSL version and invokes the proper gateway.
#### Start Menu and Desktop shortcuts #### #### Start Menu and Desktop shortcuts ####
In the Start Menu, the following shortcuts are installed: In the Start Menu, the following shortcuts are installed:
* Shortcut <img align=absmiddle height=40 src=tux1.png>`WSL Terminal` to start the default WSL distribution (as configured with the Windows tool `wslconfig`) * Shortcut <img align=absmiddle height=40 src=tux1.png>`WSL Terminal` to start the default WSL distribution (as configured with the Windows tool `wslconfig` or `wsl -s`)
* For each installed WSL distribution, for example `Ubuntu`, a shortcut like <img align=absmiddle height=40 src=ubuntu1.png>`Ubuntu Terminal` to start in the WSL user home * For each installed WSL distribution, for example `Ubuntu`, a shortcut like <img align=absmiddle height=40 src=ubuntu1.png>`Ubuntu Terminal` to start in the WSL user home
In the Start Menu subfolder WSLtty, the following additional shortcuts are installed: In the Start Menu subfolder WSLtty, the following additional shortcuts are installed:
@@ -105,7 +152,7 @@ In the Start Menu subfolder WSLtty, the following additional shortcuts are insta
* For each installed WSL distribution, for example `Ubuntu`, a shortcut like <img align=absmiddle height=40 src=ubuntu1.png>`Ubuntu Terminal %` to start in the Windows %USERPROFILE% home * For each installed WSL distribution, for example `Ubuntu`, a shortcut like <img align=absmiddle height=40 src=ubuntu1.png>`Ubuntu Terminal %` to start in the Windows %USERPROFILE% home
One Desktop shortcut is installed: One Desktop shortcut is installed:
* Shortcut <img align=absmiddle height=40 src=tux1.png>`WSL Terminal` to start the default WSL distribution (as configured with the Windows tool `wslconfig`) * Shortcut <img align=absmiddle height=40 src=tux1.png>`WSL Terminal` to start the default WSL distribution (as configured with the Windows tool `wslconfig` or `wsl -s`)
Other, distribution-specific shortcuts can be copied to the desktop Other, distribution-specific shortcuts can be copied to the desktop
from the Start Menu if desired. from the Start Menu if desired.
@@ -158,14 +205,15 @@ Mintty can maintain its configuration file in various locations,
with the following precedence: with the following precedence:
* file given with mintty option `-c` (not used by wsltty default installation) * file given with mintty option `-c` (not used by wsltty default installation)
* file `config` in directory given with mintty option `--configdir` * file `config` in directory given with mintty option `--configdir`
* This is `%APPDATA%\wsltty\config` in the default wsltty installation. * **`%APPDATA%\wsltty\config`** in the default wsltty installation
* `%HOME%\.minttyrc` (usage deprecated with wsltty) * `%HOME%\.minttyrc` (usage deprecated with wsltty)
* `%HOME%\.config\mintty\config` (usage deprecated with wsltty) * `%HOME%\.config\mintty\config` (usage deprecated with wsltty)
* `%APPDATA%\mintty\config` * common config file for all mintty installation instances
* **`%APPDATA%\mintty\config`**
* `%LOCALAPPDATA%\wsltty\etc\minttyrc` (usage deprecated with wsltty) * `%LOCALAPPDATA%\wsltty\etc\minttyrc` (usage deprecated with wsltty)
Note: Note:
* `%APPDATA%\wsltty\config` is the new user configuration file location. * `%APPDATA%\wsltty\config` is the user configuration file location.
Further subdirectories of `%APPDATA%\wsltty` are used for language, Further subdirectories of `%APPDATA%\wsltty` are used for language,
themes, and sounds resource configuration. themes, and sounds resource configuration.
Note the distinction from `%LOCALAPPDATA%\wsltty` which is the default Note the distinction from `%LOCALAPPDATA%\wsltty` which is the default
@@ -177,19 +225,39 @@ Note:
root directory of the cygwin standalone installation hosting wsltty. root directory of the cygwin standalone installation hosting wsltty.
So `%HOME%` would mean `%LOCALAPPDATA%\wsltty\home\%USERNAME%`. So `%HOME%` would mean `%LOCALAPPDATA%\wsltty\home\%USERNAME%`.
If you define `HOME` at Windows level, this changes accordingly. If you define `HOME` at Windows level, this changes accordingly.
Note, however, that the WSL `HOME` is a completely different setting. Note, however, that the WSL `$HOME` is a completely different setting.
#### Shell selection and Login shell #### #### Shell selection and Login shell ####
The WSLtty deployment does not impose a shell preference. The WSLtty deployment does not impose a shell preference;
it invokes the users default shell in login mode by the final `-` parameter:
* `%LOCALAPPDATA%\wsltty\bin\mintty.exe --WSL= --configdir="%APPDATA%\wsltty" -`
To invoke your favourite shell or launch the shell in login mode, You may tweak shortcuts, scripts, or context menu entries as follows:
you may append a shell pathname and an optional `-l` parameter
to the mintty invocation (in shortcuts, scripts, or context menu entries): To launch a default shell in non-login mode, remove the final dash.
To invoke your preferred shell, replace the final dash with
a shell pathname and an optional `-l` parameter
* `%LOCALAPPDATA%\wsltty\bin\mintty.exe --WSL= --configdir="%APPDATA%\wsltty" /bin/bash -l` * `%LOCALAPPDATA%\wsltty\bin\mintty.exe --WSL= --configdir="%APPDATA%\wsltty" /bin/bash -l`
To just request login mode, a single `-` parameter also works: ---
* `%LOCALAPPDATA%\wsltty\bin\mintty.exe --WSL= --configdir="%APPDATA%\wsltty" -`
### WSL locale setup and character encoding ###
Character encoding setup by locale setting is propagated from the terminal
towards WSL. So you can select your favourite locale with configuration
options or with command-line options, for example in a copied dedicated
desktop shortcut.
If for example you wish to run WSL in GB18030 encoding, you may set options
`Locale=zh_CN` and `Charset=GB18030` and the WSL shell will adopt that
setting, provided that the selected locale is configured to be available
in the locale database of the WSL distribution.
This can be achieved in Ubuntu with the following commands:
* `sudo mkdir -p /var/lib/locales/supported.d`
* `sudo echo zh_CN.GB18030 GB18030 >> /var/lib/locales/supported.d/local`
* `sudo locale-gen`
--- ---

View File

@@ -1 +1 @@
3.0.6 3.5.1

1
cmd2.bat Executable file
View File

@@ -0,0 +1 @@
%1 "%from%" "%to%"

View File

@@ -1,15 +1,42 @@
#! /bin/sh #! /bin/sh
# set some paths; capital variables are for the mkshortcut.exe case, # dash built-in echo enforces interpretation of \t etc
# not for the mkshortcut.vbs case echoc () {
#cmd /c echo $*
printf '%s\n' "$*"
}
copy () {
from="$1"
to="$2"
export from to
cmd /c cmd2.bat copy
}
delete () {
from="$1"
to="$1" # same again, to fill parameter
export from to
cmd /c cmd2.bat del/F
}
compare () {
from="$1"
to="$2"
export from to
cmd /c cmd2.bat comp/M
}
case "$installdir" in case "$installdir" in
?*) custominst=true;; ?*) custominst=true;;
"") custominst=false;; "") custominst=false;;
esac esac
INSTDIR=${installdir:-$LOCALAPPDATA/wsltty} INSTDIR="${installdir:-$LOCALAPPDATA/wsltty}"
echoc "Installing wsltty into $INSTDIR"
INSTDIR=`cd "$INSTDIR"; pwd` INSTDIR=`cd "$INSTDIR"; pwd`
installcop=${installdir:-"$LOCALAPPDATA\\wsltty"}
installdir=${installdir:-'%LOCALAPPDATA%\wsltty'} installdir=${installdir:-'%LOCALAPPDATA%\wsltty'}
target="$installdir"'\bin\mintty.exe' target="$installdir"'\bin\mintty.exe'
@@ -18,7 +45,7 @@ case "$INSTDIR" in
*) TARGETPATH="$INSTDIR"/bin/mintty.exe;; *) TARGETPATH="$INSTDIR"/bin/mintty.exe;;
esac esac
CONFDIR=${configdir:-$APPDATA/wsltty} CONFDIR="${configdir:-$APPDATA/wsltty}"
configdir=${configdir:-'%APPDATA%\wsltty'} configdir=${configdir:-'%APPDATA%\wsltty'}
PATH=/bin:"$PATH":$SYSTEMROOT/System32 PATH=/bin:"$PATH":$SYSTEMROOT/System32
@@ -37,9 +64,14 @@ case "$1" in
-info) -info)
config=false config=false
shift;; shift;;
-shortcuts)
shift;;
-shortcuts-remove) -shortcuts-remove)
remove=true remove=true
shift;; shift;;
-default)
alldistros=false
shift;;
-contextmenu) -contextmenu)
contextmenu=true contextmenu=true
shift;; shift;;
@@ -77,6 +109,26 @@ case "$1" in
shift;; shift;;
esac esac
if $config && ! $contextmenu
then
# remove shortcut entries in Start menu and cmd-line bat shortcuts
(cd "$INSTDIR"
for lnk in *.lnk
do
if compare "$lnk" "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs\\$lnk"
then delete "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs\\$lnk"
fi
done
for bat in *.bat
do
if compare "$bat" "$LOCALAPPDATA\\Microsoft\\WindowsApps\\$bat"
then delete "$LOCALAPPDATA\\Microsoft\\WindowsApps\\$bat"
fi
done
)
fi
# test w/o WSL: call this script with REGTOOLFAKE=true dash config-distros.sh # test w/o WSL: call this script with REGTOOLFAKE=true dash config-distros.sh
if ${REGTOOLFAKE:-false} if ${REGTOOLFAKE:-false}
then then
@@ -103,10 +155,6 @@ regtool () {
} }
fi fi
# dash built-in echo enforces interpretation of \t etc
echoc () {
cmd /c echo $*
}
if $config if $config
then while read line; do echo "$line"; done <</EOB > mkbat.bat then while read line; do echo "$line"; done <</EOB > mkbat.bat
@@ -140,10 +188,10 @@ then
bridgeargs=-contextmenu-remove bridgeargs=-contextmenu-remove
cscript /nologo mkshortcut.vbs "/name:remove from context menu" "/min:true" cscript /nologo mkshortcut.vbs "/name:remove from context menu" "/min:true"
cmd /C copy "add to context menu.lnk" "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty" copy "add to context menu.lnk" "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty"
cmd /C copy "add default to context menu.lnk" "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty" copy "add default to context menu.lnk" "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty"
cmd /C copy "remove from context menu.lnk" "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty" copy "remove from context menu.lnk" "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty"
cmd /C copy "configure WSL shortcuts.lnk" "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty" copy "configure WSL shortcuts.lnk" "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty"
# restore target # restore target
target="$installdir"'\bin\mintty.exe' target="$installdir"'\bin\mintty.exe'
@@ -179,74 +227,85 @@ config () {
case "$distro" in case "$distro" in
Legacy) Legacy)
name="Bash on Windows" name="Bash on Windows"
launch=
launcher="$SYSTEMROOT/System32/bash.exe" launcher="$SYSTEMROOT/System32/bash.exe"
;; ;;
*) name="$distro" *) name="$distro"
launch="$distro"
launcher="$LOCALAPPDATA/Microsoft/WindowsApps/$distro.exe" launcher="$LOCALAPPDATA/Microsoft/WindowsApps/$distro.exe"
;; ;;
esac esac
basepath=`regtool get "$lxss/$guid/BasePath"` basepath=`regtool get "$lxss/$guid/BasePath"`
if package=`regtool -q get "$lxss/$guid/PackageFamilyName"` if package=`regtool -q get "$lxss/$guid/PackageFamilyName"`
then then
instdir=`regtool get "$schema/$package/Schemas/PackageFullName"` distrinst=`regtool get "$schema/$package/Schemas/PackageFullName"`
# get actual executable path (may not match $distro) from app manifest # get actual executable path (may not match $distro) from app manifest
manifest="$ProgramW6432/WindowsApps/$instdir/AppxManifest.xml" manifest="$ProgramW6432/WindowsApps/$distrinst/AppxManifest.xml"
psh_cmd='([xml]$(Get-Content '"\"$manifest\""')).Package.Applications.Application.Executable' psh_cmd='([xml]$(Get-Content '"\"$manifest\""')).Package.Applications.Application.Executable'
executable=`appex "$manifest"` executable=`appex "$manifest"`
if [ -r "$ProgramW6432/WindowsApps/$instdir/$executable" ] if [ -r "$ProgramW6432/WindowsApps/$distrinst/$executable" ]
then icon="%PROGRAMFILES%/WindowsApps/$instdir/$executable" then icon="$ProgramW6432/WindowsApps/$distrinst/$executable"
elif [ -r "$ProgramW6432/WindowsApps/$instdir/images/icon.ico" ] elif [ -r "$ProgramW6432/WindowsApps/$distrinst/images/icon.ico" ]
then icon="%PROGRAMFILES%/WindowsApps/$instdir/images/icon.ico" then icon="$ProgramW6432/WindowsApps/$distrinst/images/icon.ico"
else icon="$installdir"'\wsl.ico' else icon="$installcop"'\wsl.ico'
fi fi
root="$basepath/rootfs" root="$basepath/rootfs"
elif [ -f "$basepath/$distro.exe" ] elif [ -f "$basepath/$distro.exe" ]
then then
icon="$basepath/$distro.exe" icon="$basepath/$distro.exe"
root="$basepath/rootfs" root="$basepath/rootfs"
else elif [ -d "$LOCALAPPDATA/lxss" ]
icon="%LOCALAPPDATA%/lxss/bash.ico" then
# legacy "Bash on Windows"
icon="$LOCALAPPDATA/lxss/bash.ico"
root="$basepath" root="$basepath"
else
# imported distro? (#226, #236)
icon="$installcop"'\wsl.ico'
root="$basepath/rootfs"
fi fi
#minttyargs='--wsl --rootfs="'"$root"'" --configdir="'"$configdir"'" -o Locale=C -o Charset=UTF-8 /bin/wslbridge ' # invocation parameters for mintty
minttyargs='--WSL="'"$distro"'" --configdir="'"$configdir"'"' minttyargs='--WSL="'"$distro"'" --configdir="'"$configdir"'"'
# MINTARGS deprecated; used for mkshortcut.exe rather than mkshortcut.vbs
MINTARGS='--WSL="'"$distro"'" --configdir="'"$CONFDIR"'"' MINTARGS='--WSL="'"$distro"'" --configdir="'"$CONFDIR"'"'
#if [ -z "$launch" ] # invocation commands (deprecated for mintty, used for start menu scripts)
#then bridgeargs='-t /bin/bash' #bridgeargs='--distro-guid "'"$guid"'" -t'
#else bridgeargs='-l "'"$launch"'" -t /bin/bash'
#fi
bridgeargs='--distro-guid "'"$guid"'" -t /bin/bash'
bridgeargs='--distro-guid "'"$guid"'" -t'
ok=true;; ok=true;;
DefaultDistribution|"") # WSL default installation DefaultDistribution|"") # WSL default installation
distro= distro=
name=WSL name=WSL
icon="$installdir"'\wsl.ico' icon="$installcop"'\wsl.ico'
minttyargs='--WSL= --configdir="'"$configdir"'"' minttyargs='--WSL= --configdir="'"$configdir"'"'
MINTARGS='--WSL= --configdir="'"$CONFDIR"'"' MINTARGS='--WSL= --configdir="'"$CONFDIR"'"'
bridgeargs='-t' #bridgeargs='-t'
ok=true;; ok=true;;
esac esac
bridgeargs=" -" # now used to request login mode
echoc "distro '$distro'" echoc "distro '$distro'"
echoc "- name '$name'" echoc "- name '$name'"
echoc "- guid $guid" echoc "- guid $guid"
echoc "- (launcher $launcher)" echoc "- (launcher $launcher)"
echoc "- icon $icon" echoc "- icon $icon"
echoc "- root $root" echoc "- root $root"
bridgeargs=" " # deprecated
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; wsl.exe -d "$distro" chmod +x wslbridge2-backend hvpty-backend) (cd "$INSTDIR"; cd bin; PATH="${WINDIR}/Sysnative:${PATH}" wsl.exe -d "$distro" chmod +x wslbridge2-backend)
# (cd "$LOCALAPPDATA/wsltty/bin"; wsl.exe -d "$distro" chmod +x wslbridge2-backend hvpty-backend) # (cd "$LOCALAPPDATA/wsltty/bin"; wsl.exe -d "$distro" chmod +x wslbridge2-backend)
# (cd ... ; "$SYSTEMROOT/System32/bash.exe" "$guid" -c chmod +x wslbridge2-backend hvpty-backend) # (cd ... ; "$SYSTEMROOT/System32/bash.exe" "$guid" -c chmod +x wslbridge2-backend)
fi fi
if $ok && $config if $ok && $config
@@ -256,46 +315,66 @@ config () {
if $contextmenu if $contextmenu
then then
# context menu entries # context menu entries
#cmd /C mkcontext "$name"
direckey='HKEY_CURRENT_USER\Software\Classes\Directory' direckey='HKEY_CURRENT_USER\Software\Classes\Directory'
keyname="${name}_Terminal" keyname="${name}_Terminal"
if $remove if $remove
then then
# obsolete; handled above
reg delete "$direckey\\shell\\$keyname" /f reg delete "$direckey\\shell\\$keyname" /f
reg delete "$direckey\\Background\\shell\\$keyname" /f reg delete "$direckey\\Background\\shell\\$keyname" /f
else else
reg add "$direckey\\shell\\$keyname" /d "$name Terminal" /f direckey='/HKEY_CURRENT_USER/Software/Classes/Directory'
reg add "$direckey\\shell\\$keyname" /v Icon /d "$icon" /f echoc Registry setting "$direckey/[Background/]shell/$keyname"
cmd /C reg add "$direckey\\shell\\$keyname\\command" /d "\"$target\" -i \"$icon\" --dir \"%1\" $minttyargs $bridgeargs" /f target="$installcop"'\bin\mintty.exe'
reg add "$direckey\\Background\\shell\\$keyname" /d "$name Terminal" /f
reg add "$direckey\\Background\\shell\\$keyname" /v Icon /d "$icon" /f regtool add "$direckey/shell"
cmd /C reg add "$direckey\\Background\\shell\\$keyname\\command" /d "\"$target\" -i \"$icon\" $minttyargs $bridgeargs" /f regtool add "$direckey/shell/$keyname"
regtool set "$direckey/shell/$keyname/" -s "$name Terminal"
regtool set "$direckey/shell/$keyname/Icon" -s "$icon"
regtool add "$direckey/shell/$keyname/command"
regtool set "$direckey/shell/$keyname/command/" -s "\"$target\" -i \"$icon\" --dir \"%1\" $MINTARGS $bridgeargs"
regtool add "$direckey/Background/shell"
regtool add "$direckey/Background/shell/$keyname"
regtool set "$direckey/Background/shell/$keyname/" -s "$name Terminal"
regtool set "$direckey/Background/shell/$keyname/Icon" -s "$icon"
regtool add "$direckey/Background/shell/$keyname/command"
regtool set "$direckey/Background/shell/$keyname/command/" -s "\"$target\" -i \"$icon\" $MINTARGS $bridgeargs"
fi fi
else else
# invocation shortcuts and scripts # invocation shortcuts and scripts
if $remove if $remove
then then
cmd /C del "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\$name Terminal.lnk" delete "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs\\$name Terminal.lnk"
cmd /C del "%LOCALAPPDATA%\\Microsoft\\WindowsApps\\$name.bat" delete "$LOCALAPPDATA\\Microsoft\\WindowsApps\\$name.bat"
cmd /C del "%LOCALAPPDATA%\\Microsoft\\WindowsApps\\$name~.bat" delete "$LOCALAPPDATA\\Microsoft\\WindowsApps\\$name~.bat"
if [ "$name" = "WSL" ] if [ "$name" = "WSL" ]
then then
# determine actual Desktop folder # determine actual Desktop folder
desktopkey='\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Desktop' desktopkey='\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Desktop'
desktop=`regtool get "$desktopkey"` desktop=`regtool get "$desktopkey"`
cmd /C del "$desktop\\$name Terminal.lnk" case "$desktop" in
%USERPROFILE%*) desktop="$USERPROFILE${desktop#%USERPROFILE%}";;
esac
delete "$desktop\\$name Terminal.lnk"
fi fi
else else
# desktop shortcut in %USERPROFILE% -> Start Menu - WSLtty # desktop shortcut in %USERPROFILE% -> Start Menu - WSLtty
cscript /nologo mkshortcut.vbs "/name:$name Terminal %" cscript /nologo mkshortcut.vbs "/name:$name Terminal %"
#mkshortcut.exe -n "$name Terminal %" -i "$icon" "$TARGETPATH" -a "$MINTARGS" -d "" -w %USERPROFILE% #mkshortcut.exe -n "$name Terminal %" -i "$icon" "$TARGETPATH" -a "$MINTARGS" -d "" -w %USERPROFILE%
cmd /C copy "$name Terminal %.lnk" "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty" copy "$name Terminal %.lnk" "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty"
# launch script in . -> WSLtty home, WindowsApps launch folder # launch script in . -> WSLtty home, WindowsApps launch folder
cmd /C mkbat.bat "$name" cmd /C mkbat.bat "$name"
cmd /C copy "$name.bat" "$installdir" copy "$name.bat" "$LOCALAPPDATA\\Microsoft\\WindowsApps"
cmd /C copy "$name.bat" "%LOCALAPPDATA%\\Microsoft\\WindowsApps"
# store backup copies in installation dir
if [ "$PWD" != "$INSTDIR" ]
then
copy "$name Terminal %.lnk" "$installcop"
copy "$name.bat" "$installcop"
fi
# prepare versions to target WSL home directory # prepare versions to target WSL home directory
#bridgeargs="-C~ $bridgeargs" #bridgeargs="-C~ $bridgeargs"
@@ -305,24 +384,33 @@ config () {
# desktop shortcut in ~ -> Start Menu # desktop shortcut in ~ -> Start Menu
cscript /nologo mkshortcut.vbs "/name:$name Terminal" cscript /nologo mkshortcut.vbs "/name:$name Terminal"
#mkshortcut.exe -n "$name Terminal" -i "$icon" "$TARGETPATH" -a "$MINTARGS" -d "" -w %USERPROFILE% #mkshortcut.exe -n "$name Terminal" -i "$icon" "$TARGETPATH" -a "$MINTARGS" -d "" -w %USERPROFILE%
cmd /C copy "$name Terminal.lnk" "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs" copy "$name Terminal.lnk" "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs"
# default desktop shortcut in ~ -> Desktop # default desktop shortcut in ~ -> Desktop
if [ "$name" = "WSL" ] if [ "$name" = "WSL" ]
then then
#cmd /C copy "$name Terminal.lnk" "%USERPROFILE%\\Desktop" #copy "$name Terminal.lnk" "$USERPROFILE\\Desktop"
#cmd /C copy "$name Terminal.lnk" "%APPDATA%\\..\\Desktop\\" #copy "$name Terminal.lnk" "$APPDATA\\..\\Desktop\\"
# the above does not work reliably (see #166) # the above does not work reliably (see #166)
# determine actual Desktop folder # determine actual Desktop folder
desktopkey='\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Desktop' desktopkey='\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Desktop'
desktop=`regtool get "$desktopkey"` desktop=`regtool get "$desktopkey"`
cmd /C copy "$name Terminal.lnk" "$desktop\\" case "$desktop" in
%USERPROFILE%*) desktop="$USERPROFILE${desktop#%USERPROFILE%}";;
esac
copy "$name Terminal.lnk" "$desktop\\"
fi fi
# launch script in ~ -> WSLtty home, WindowsApps launch folder # launch script in ~ -> WSLtty home, WindowsApps launch folder
cmd /C mkbat.bat "$name~" cmd /C mkbat.bat "$name~"
cmd /C copy "$name~.bat" "$installdir" copy "$name~.bat" "$LOCALAPPDATA\\Microsoft\\WindowsApps"
cmd /C copy "$name~.bat" "%LOCALAPPDATA%\\Microsoft\\WindowsApps"
# store backup copies in installation dir
if [ "$PWD" != "$INSTDIR" ]
then
copy "$name Terminal.lnk" "$installcop"
copy "$name~.bat" "$installcop"
fi
fi fi
fi fi

3
dequote.bat Executable file
View File

@@ -0,0 +1,3 @@
@echo off
rem https://ss64.com/nt/syntax-dequote.html
for /f "delims=" %%A in ('echo %%%1%%') do set %1=%%~A

View File

@@ -1,19 +1,24 @@
@echo off @echo off
set refinstalldir=%%LOCALAPPDATA%%\wsltty set refinstalldir=%%LOCALAPPDATA%%\wsltty
set installdir=%LOCALAPPDATA%\wsltty set installdir="%LOCALAPPDATA%\wsltty"
set refconfigdir=%%APPDATA%%\wsltty set refconfigdir=%%APPDATA%%\wsltty
set configdir=%APPDATA%\wsltty set configdir="%APPDATA%\wsltty"
set oldroot=%installdir% call dequote installdir
set oldhomedir=%installdir%\home\%USERNAME% call dequote configdir
set oldconfigdir=%oldhomedir%\.config\mintty set oldroot="%installdir%"
set oldhomedir="%installdir%\home\%USERNAME%"
call dequote oldroot
call dequote oldhomedir
set oldconfigdir="%oldhomedir%\.config\mintty"
call dequote oldconfigdir
if not "%1" == "" set refinstalldir=%1 && set installdir=%1 if not "%1" == "" set refinstalldir=%1 && set installdir=%1
if not "%2" == "" set refconfigdir=%2 && set configdir=%2 if not "%2" == "" set refconfigdir=%2 && set configdir=%2
:deploy :deploy
mkdir "%installdir%" mkdir "%installdir%" 2> nul:
rem clean up previous installation artefacts rem clean up previous installation artefacts
del /Q "%installdir%\*.bat" del /Q "%installdir%\*.bat"
@@ -31,6 +36,8 @@ rem copy "WSL Terminal %%.lnk" "%installdir%"
copy config-distros.sh "%installdir%" copy config-distros.sh "%installdir%"
copy mkshortcut.vbs "%installdir%" copy mkshortcut.vbs "%installdir%"
copy cmd2.bat "%installdir%"
copy dequote.bat "%installdir%"
rem allow persistent customization of default icon: rem allow persistent customization of default icon:
if not exist "%installdir%\wsl.ico" copy tux.ico "%installdir%\wsl.ico" if not exist "%installdir%\wsl.ico" copy tux.ico "%installdir%\wsl.ico"
@@ -39,25 +46,21 @@ copy uninstall.bat "%installdir%"
if not exist "%installdir%\bin" goto instbin if not exist "%installdir%\bin" goto instbin
rem move previous programs possibly in use out of the way rem move previous programs possibly in use out of the way
del /Q "%installdir%\bin\*.old" del /Q "%installdir%\bin\*.old" 2> nul:
ren "%installdir%\bin\cygwin1.dll" cygwin1.dll.old ren "%installdir%\bin\cygwin1.dll" cygwin1.dll.old
ren "%installdir%\bin\cygwin-console-helper.exe" cygwin-console-helper.exe.old ren "%installdir%\bin\cygwin-console-helper.exe" cygwin-console-helper.exe.old
ren "%installdir%\bin\mintty.exe" mintty.exe.old ren "%installdir%\bin\mintty.exe" mintty.exe.old
ren "%installdir%\bin\wslbridge2.exe" wslbridge2.exe.old ren "%installdir%\bin\wslbridge2.exe" wslbridge2.exe.old
ren "%installdir%\bin\wslbridge2-backend" wslbridge2-backend.old ren "%installdir%\bin\wslbridge2-backend" wslbridge2-backend.old
ren "%installdir%\bin\hvpty.exe" hvpty.exe.old del /Q "%installdir%\bin\*.old" 2> nul:
ren "%installdir%\bin\hvpty-backend" hvpty-backend.old
del /Q "%installdir%\bin\*.old"
:instbin :instbin
mkdir "%installdir%\bin" mkdir "%installdir%\bin" 2> nul:
copy cygwin1.dll "%installdir%\bin" copy cygwin1.dll "%installdir%\bin"
copy cygwin-console-helper.exe "%installdir%\bin" copy cygwin-console-helper.exe "%installdir%\bin"
copy mintty.exe "%installdir%\bin" copy mintty.exe "%installdir%\bin"
copy wslbridge2.exe "%installdir%\bin" copy wslbridge2.exe "%installdir%\bin"
copy wslbridge2-backend "%installdir%\bin" copy wslbridge2-backend "%installdir%\bin"
copy hvpty.exe "%installdir%\bin"
copy hvpty-backend "%installdir%\bin"
copy dash.exe "%installdir%\bin" copy dash.exe "%installdir%\bin"
copy regtool.exe "%installdir%\bin" copy regtool.exe "%installdir%\bin"
@@ -69,22 +72,23 @@ rem copy cygiconv-2.dll "%installdir%"\bin
rem copy cygintl-8.dll "%installdir%"\bin rem copy cygintl-8.dll "%installdir%"\bin
rem create system config directory and copy config archive rem create system config directory and copy config archive
mkdir "%installdir%\usr\share\mintty\lang" mkdir "%installdir%\usr\share\mintty\lang" 2> nul:
copy lang.zoo "%installdir%\usr\share\mintty\lang" copy lang.zoo "%installdir%\usr\share\mintty\lang"
mkdir "%installdir%\usr\share\mintty\themes" mkdir "%installdir%\usr\share\mintty\themes" 2> nul:
copy themes.zoo "%installdir%\usr\share\mintty\themes" copy themes.zoo "%installdir%\usr\share\mintty\themes"
mkdir "%installdir%\usr\share\mintty\sounds" mkdir "%installdir%\usr\share\mintty\sounds" 2> nul:
copy sounds.zoo "%installdir%\usr\share\mintty\sounds" copy sounds.zoo "%installdir%\usr\share\mintty\sounds"
mkdir "%installdir%\usr\share\mintty\info" mkdir "%installdir%\usr\share\mintty\info" 2> nul:
copy charnames.txt "%installdir%\usr\share\mintty\info" copy charnames.txt "%installdir%\usr\share\mintty\info"
mkdir "%installdir%\usr\share\mintty\icon" mkdir "%installdir%\usr\share\mintty\icon" 2> nul:
copy tux.ico "%installdir%\usr\share\mintty\icon" copy tux.ico "%installdir%\usr\share\mintty\icon"
copy mintty.ico "%installdir%\usr\share\mintty\icon" copy mintty.ico "%installdir%\usr\share\mintty\icon"
rem create Start Menu Folder rem create Start Menu Folder
set smf=%APPDATA%\Microsoft\Windows\Start Menu\Programs\WSLtty set smf="%APPDATA%\Microsoft\Windows\Start Menu\Programs\WSLtty"
mkdir "%smf%" call dequote smf
mkdir "%smf%" 2> nul:
rem clean up previous installation rem clean up previous installation
del /Q "%smf%\*.lnk" del /Q "%smf%\*.lnk"
@@ -97,7 +101,7 @@ copy "configure WSL shortcuts.lnk" "%smf%"
rem copy "WSL Terminal.lnk" "%smf%" rem copy "WSL Terminal.lnk" "%smf%"
rem copy "WSL Terminal %%.lnk" "%smf%" rem copy "WSL Terminal %%.lnk" "%smf%"
rem clean up previous installation rem clean up previous installation
rmdir /S /Q "%smf%\context menu shortcuts" rmdir /S /Q "%smf%\context menu shortcuts" 2> nul:
rem unpack config files in system config directory rem unpack config files in system config directory
cd /D "%installdir%\usr\share\mintty\lang" cd /D "%installdir%\usr\share\mintty\lang"
@@ -106,6 +110,7 @@ cd /D "%installdir%\usr\share\mintty\themes"
"%installdir%\bin\zoo" xO themes "%installdir%\bin\zoo" xO themes
cd /D "%installdir%\usr\share\mintty\sounds" cd /D "%installdir%\usr\share\mintty\sounds"
"%installdir%\bin\zoo" xO sounds "%installdir%\bin\zoo" xO sounds
cd /D "%installdir%"
:migrate configuration :migrate configuration
@@ -120,24 +125,28 @@ rmdir "%oldhomedir%\.config"
if exist "%configdir%\config" goto deloldhome if exist "%configdir%\config" goto deloldhome
if exist "%oldhomedir%\.minttyrc" copy "%oldhomedir%\.minttyrc" "%configdir%\config" && del "%oldhomedir%\.minttyrc" if exist "%oldhomedir%\.minttyrc" copy "%oldhomedir%\.minttyrc" "%configdir%\config" && del "%oldhomedir%\.minttyrc"
:deloldhome :deloldhome
rmdir "%oldhomedir%" rmdir "%oldhomedir%" 2> nul:
rmdir "%oldroot%\home" rmdir "%oldroot%\home" 2> nul:
:userconfig :userconfig
rem create user config directory and subfolders rem create user config directory and subfolders
mkdir "%configdir%\lang" mkdir "%configdir%\lang" 2> nul:
mkdir "%configdir%\themes" mkdir "%configdir%\themes" 2> nul:
mkdir "%configdir%\sounds" mkdir "%configdir%\sounds" 2> nul:
rem create config file if it does not yet exist rem create config file if it does not yet exist
if not exist "%configdir%\config" echo # To use common configuration in %%APPDATA%%\mintty, simply remove this file>"%configdir%\config" if not exist "%configdir%\config" echo # To use common configuration in %%APPDATA%%\mintty, simply remove this file>"%configdir%\config"
:appconfig
rem distro-specific stuff: shortcuts and launch scripts rem distro-specific stuff: shortcuts and launch scripts
cd "%installdir%" cd /D "%installdir%"
bin\dash.exe "%installdir%\config-distros.sh" echo Configuring for WSL distributions
rem bin\dash.exe "%installdir%\config-distros.sh" -contextmenu bin\dash.exe "config-distros.sh"
rem rem bin\dash.exe "config-distros.sh" -contextmenu
:end :end

175
makefile
View File

@@ -4,20 +4,51 @@
# 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.0.6 ver=3.5.1
# wsltty appx release - must have 4 parts! # wsltty appx release - must have 4 parts!
verx=3.0.6.0 verx=3.5.1.1
##############################
# mintty release version # mintty release version
minttyver=3.0.6
# wslbridge release version minttyver=3.5.1
wslbridgever=0.4
##############################
# wslbridge2 repository
repo=Biswa96/wslbridge2
# wslbridge2 master release version
wslbridgever=0.8
# wslbridge2 latest version
#archive=master
#wslbridgedir=wslbridge2-$(archive)
# wslbridge2 branch or commit version (from fix-window-resize branch) and dir
#commit=70e0dcea1db122d076ce1578f2a45280cc92d09f
#commit=8b6dd7ee2b3102d72248990c21764c5cf86c6612
#archive=$(commit)
#wslbridgedir=wslbridge2-$(archive)
# wslbridge2 fork repository and version
#repo=mintty/wslbridge2
#wslbridgever=0.5.1
# wslbridge2 release or fork archive and dir
archive=v$(wslbridgever)
wslbridgedir=wslbridge2-$(wslbridgever)
############################## ##############################
@@ -27,6 +58,11 @@ wslbridgever=0.4
# wslbridge branch or commit to build from source; # wslbridge branch or commit to build from source;
wslbridge=wslbridge-frontend wslbridge-backend wslbridge=wslbridge-frontend wslbridge-backend
##############################
# build backend on a musl-libc-based distribution
# (reportedly not needed anymore but untested)
BuildDistr=-d Alpine
############################## ##############################
# Windows SDK version for appx # Windows SDK version for appx
WINSDKKEY=/HKEY_LOCAL_MACHINE/SOFTWARE/WOW6432Node/Microsoft/.NET Framework Platform/Setup/Multi-Targeting Pack WINSDKKEY=/HKEY_LOCAL_MACHINE/SOFTWARE/WOW6432Node/Microsoft/.NET Framework Platform/Setup/Multi-Targeting Pack
@@ -66,14 +102,20 @@ wgeto=curl -R -L --connect-timeout 55
# - ensure the path name drag-and-drop adaptation works (-> Cygwin, not MSYS) # - ensure the path name drag-and-drop adaptation works (-> Cygwin, not MSYS)
# - 64 Bit (x86_64) for more stable invocation (avoid fork issues) # - 64 Bit (x86_64) for more stable invocation (avoid fork issues)
check: arch:=$(shell uname -m)
check: # checkarch
echo Building for:
echo $(arch) | grep .
# checking suitable host environment; run `make pkg` to bypass # checking suitable host environment; run `make pkg` to bypass
# check cygwin (vs msys) for proper drag-and-drop paths: # check cygwin (vs msys) for proper drag-and-drop paths:
uname | grep CYGWIN uname | grep CYGWIN
checkarch:
# check 32 bit to ensure 32-Bit Windows support, just in case: # check 32 bit to ensure 32-Bit Windows support, just in case:
#uname -m | grep i686 #uname -m | grep i686
# check 64 bit to provide 64-Bit stability support: # check 64 bit to provide 64-Bit stability support:
uname -m | grep x86_64 #uname -m | grep x86_64
############################################################################# #############################################################################
# patch version information for appx package configuration # patch version information for appx package configuration
@@ -88,34 +130,47 @@ fix-verx:
sed -i~ -e '/<Identity / s,Version="[.0-9]*",Version="$(verx)",' AppxManifest.xml sed -i~ -e '/<Identity / s,Version="[.0-9]*",Version="$(verx)",' AppxManifest.xml
echo patched AppxManifest.xml echo patched AppxManifest.xml
#############################################################################
# clear binaries
clean:
rm -fr $(wslbridgedir)/bin
rm -fr bin
############################################################################# #############################################################################
# generation # generation
wslbridge: $(wslbridge) wslbridge: $(wslbridge)
wslbridge2-$(wslbridgever).zip: $(wslbridgedir).zip:
$(wgeto) https://github.com/Biswa96/wslbridge2/archive/v$(wslbridgever).zip -o wslbridge2-$(wslbridgever).zip $(wgeto) https://github.com/$(repo)/archive/$(archive).zip -o $(wslbridgedir).zip
wslbridge-source: wslbridge2-$(wslbridgever).zip wslbridge-source: $(wslbridgedir).zip
unzip -ou wslbridge2-$(wslbridgever).zip unzip -o $(wslbridgedir).zip
cp wslbridge2-$(wslbridgever)/LICENSE LICENSE.wslbridge2 cp $(wslbridgedir)/LICENSE LICENSE.wslbridge2
# patch
cd $(wslbridgedir); patch -p1 < ../0001-notify-size-change-inband.patch
wslbridge-frontend: wslbridge-source wslbridge-frontend: wslbridge-source
echo ------------- Compiling wslbridge2 frontend echo ------------- Compiling wslbridge2 frontend
mkdir -p bin mkdir -p bin
rm -f bin/wslbridge2.exe bin/hvpty.exe # frontend build
cd wslbridge2-$(wslbridgever); make RELEASE=1 cd $(wslbridgedir)/src; make -f Makefile.frontend RELEASE=1
cp wslbridge2-$(wslbridgever)/bin/wslbridge2.exe bin/ # extract binaries
cp wslbridge2-$(wslbridgever)/bin/hvpty.exe bin/ cp $(wslbridgedir)/bin/wslbridge2.exe bin/
windir=$(shell cd "${WINDIR}"; pwd)
wslbridge-backend: wslbridge-source wslbridge-backend: wslbridge-source
echo ------------- Compiling wslbridge2 backend echo ------------- Compiling wslbridge2 backend
uname -m | grep x86_64 #uname -m | grep x86_64
mkdir -p bin mkdir -p bin
rm -f bin/wslbridge2-backend bin/hvpty-backend # provide dependencies for backend build
cd wslbridge2-$(wslbridgever); cmd /C wsl -d Alpine make RELEASE=1 < /dev/null PATH="$(windir)/Sysnative:${PATH}" cmd /C wsl.exe -u root $(BuildDistr) $(shell env | grep http_proxy=) apk add make g++ linux-headers < /dev/null
cp wslbridge2-$(wslbridgever)/bin/wslbridge2-backend bin/ # invoke backend build
cp wslbridge2-$(wslbridgever)/bin/hvpty-backend bin/ cd $(wslbridgedir)/src; PATH="$(windir)/Sysnative:${PATH}" cmd /C wsl.exe $(BuildDistr) make -f Makefile.backend RELEASE=1 < /dev/null
# extract binaries
cp $(wslbridgedir)/bin/wslbridge2-backend bin/
mintty-get: mintty-get:
$(wgeto) https://github.com/mintty/mintty/archive/$(minttyver).zip -o mintty-$(minttyver).zip $(wgeto) https://github.com/mintty/mintty/archive/$(minttyver).zip -o mintty-$(minttyver).zip
@@ -130,6 +185,7 @@ appxversion=VERSION_SUFFIX=" wsltty appx $(verx)" WSLTTY_VERSION="$(verx)"
mintty-build: mintty-build:
# ensure rebuild of version-specific check and message # ensure rebuild of version-specific check and message
rm -f mintty-$(minttyver)/bin/*/windialog.o rm -f mintty-$(minttyver)/bin/*/windialog.o
rm -f mintty-$(minttyver)/bin/*/winmain.o
# build mintty # build mintty
cd mintty-$(minttyver)/src; make $(wslbuild) $(wslversion) cd mintty-$(minttyver)/src; make $(wslbuild) $(wslversion)
mkdir -p bin mkdir -p bin
@@ -187,40 +243,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 -fr rel/wsltty-$(ver)-install.exe
sed -e "s,%version%,$(ver)," 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 bin/hvpty.exe rel/
cp bin/hvpty-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
@@ -237,8 +301,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

View File

@@ -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.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>
@@ -37,8 +37,8 @@ FILE1="cygwin-console-helper.exe"
FILE2="mintty.exe" FILE2="mintty.exe"
FILE3="wslbridge2.exe" FILE3="wslbridge2.exe"
FILE4="wslbridge2-backend" FILE4="wslbridge2-backend"
FILE5="hvpty.exe" FILE5="LICENSE.mintty"
FILE6="hvpty-backend" FILE6="LICENSE.wslbridge2"
FILE7="config-distros.sh" FILE7="config-distros.sh"
FILE8="configure WSL shortcuts.lnk" FILE8="configure WSL shortcuts.lnk"
FILE9="charnames.txt" FILE9="charnames.txt"
@@ -58,8 +58,8 @@ FILE22="themes.zoo"
FILE23="sounds.zoo" FILE23="sounds.zoo"
FILE24="mintty.ico" FILE24="mintty.ico"
FILE25="mkshortcut.vbs" FILE25="mkshortcut.vbs"
FILE26="LICENSE.mintty" FILE26="dequote.bat"
FILE27="LICENSE.wslbridge2" FILE27="cmd2.bat"
[SourceFiles] [SourceFiles]
SourceFiles0=. SourceFiles0=.

View File

@@ -1,30 +1,32 @@
@echo off @echo off
if "%installdir%" == "" set installdir=%LOCALAPPDATA%\wsltty if "%installdir%" == "" set installdir="%LOCALAPPDATA%\wsltty"
call dequote installdir
:shortcuts :shortcuts
rem delete Start Menu Folder rem delete Start Menu Folder
set smf=%APPDATA%\Microsoft\Windows\Start Menu\Programs\WSLtty set smf="%APPDATA%\Microsoft\Windows\Start Menu\Programs\WSLtty"
call dequote smf
rmdir /S /Q "%smf%" rmdir /S /Q "%smf%"
:start menu :start menu
cd %installdir% cd /D "%installdir%"
bin\dash.exe config-distros.sh -shortcuts-remove bin\dash.exe config-distros.sh -shortcuts-remove
:explorer context menu :explorer context menu
cd %installdir% cd /D "%installdir%"
bin\dash.exe config-distros.sh -contextmenu-remove bin\dash.exe config-distros.sh -contextmenu-remove
:undeploy :undeploy
cd %installdir% cd /D "%installdir%"
rem currently not removing software rem currently not removing software

View File

@@ -1,76 +0,0 @@
diff -rup old/Makefile new/Makefile
--- old/Makefile 2018-05-06 01:12:36.000000000 +0200
+++ new/Makefile 2019-07-24 22:29:12.874257700 +0200
@@ -8,7 +8,9 @@ all : ../out/wslbridge-backend
-static-libgcc -static-libstdc++ \
-D_GNU_SOURCE \
-DWSLBRIDGE_VERSION=$(shell cat ../VERSION.txt) \
- -Wall -O2 $< ../common/SocketIo.cc -o $@ -lutil -pthread
+ -Wall -O2 $< ../common/SocketIo.cc -o $@ \
+ -ldl -lutil -static -pthread \
+ -Wl,--whole-archive -lpthread -Wl,--no-whole-archive
$(STRIP) $@
clean:
diff -rup old/wslbridge-backend.cc new/wslbridge-backend.cc
--- old/wslbridge-backend.cc 2018-05-06 01:12:36.000000000 +0200
+++ new/wslbridge-backend.cc 2019-07-24 22:55:25.324307400 +0200
@@ -494,6 +494,58 @@ static void frontendVersionCheck(const c
} // namespace
+#define getpwuid _getpwuid
+
+#include <dlfcn.h>
+typedef struct passwd * (*__getpwuid_t)(int uid);
+
+struct passwd * getpwuid(int uid)
+{
+ void * dl = dlopen(0, 0);
+printf("dlopen %p\n", dl);
+ if (dl) {
+ struct passwd * (*__getpwuid)(int uid) =
+ (__getpwuid_t)dlsym(dl, "getpwuid");
+printf("dlsym %p\n", __getpwuid);
+ if (__getpwuid)
+ return __getpwuid(uid);
+ }
+
+ FILE * pwd = fopen("/etc/passwd", "r");
+ if (pwd) {
+ char pwbuf[222];
+ static struct passwd pw;
+ pw.pw_shell = 0;
+ while (fgets(pwbuf, sizeof pwbuf, pwd)) {
+ char * sep = strchr(pwbuf, ':');
+ if (!sep) continue;
+ sep = strchr(++sep, ':');
+ if (!sep) continue;
+ int pwuid;
+ if (sscanf(sep, ":%d:", &pwuid) == 1 && pwuid == uid) {
+ // pw_name:pw_passwd:pw_uid:pw_gid:pw_gecos:pw_dir:pw_shell
+ // ^
+ sep = strchr(++sep, ':');
+ if (!sep) continue;
+ sep = strchr(++sep, ':');
+ if (!sep) continue;
+ sep = strchr(++sep, ':');
+ if (!sep) continue;
+ sep = strchr(++sep, ':');
+ if (!sep) continue;
+ pw.pw_shell = ++sep;
+ sep = strchr(++sep, '\n');
+ if (sep)
+ *sep = 0;
+ break;
+ }
+ }
+ fclose(pwd);
+ return &pw;
+ }
+ return 0;
+}
+
int main(int argc, char *argv[]) {
// If the backend crashes, it prints a message to its stderr, which is a