mirror of
https://github.com/mintty/wsltty.git
synced 2025-11-07 10:31:51 +00:00
Compare commits
91 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
24c450ea82 | ||
|
|
639ed3da8f | ||
|
|
7940883bd6 | ||
|
|
b60bcc15da | ||
|
|
0a38ed1126 | ||
|
|
5136d7e878 | ||
|
|
0d39faaaf6 | ||
|
|
d61e551236 | ||
|
|
3f60e3f48c | ||
|
|
a207cae3a8 | ||
|
|
79c3f9e450 | ||
|
|
75c67869bf | ||
|
|
7776748081 | ||
|
|
bac370cfce | ||
|
|
975dbb9398 | ||
|
|
432b71d2fd | ||
|
|
1b41dfa1e0 | ||
|
|
336db2f19b | ||
|
|
1f67e41333 | ||
|
|
0520b71e1f | ||
|
|
92b982690e | ||
|
|
f0a3449ada | ||
|
|
3d4055a63b | ||
|
|
2fb994604a | ||
|
|
5da3a053a9 | ||
|
|
ad65aa9931 | ||
|
|
c9acce8d76 | ||
|
|
1533c27b36 | ||
|
|
3e3eaf6e31 | ||
|
|
482df018c9 | ||
|
|
23fc790c26 | ||
|
|
e5c67ecc7c | ||
|
|
20075c6378 | ||
|
|
05ce002fc6 | ||
|
|
cc37c6c2d5 | ||
|
|
5ef4879be2 | ||
|
|
97699c2010 | ||
|
|
4316b754da | ||
|
|
b8171d61a6 | ||
|
|
d7f14146fd | ||
|
|
46ee1b4c1c | ||
|
|
27a9ce6f42 | ||
|
|
e88e60a786 | ||
|
|
dfeaf49ae9 | ||
|
|
fd81d580d6 | ||
|
|
3281c12216 | ||
|
|
46ab74d6b4 | ||
|
|
a5b546ee4a | ||
|
|
fc8e7cda45 | ||
|
|
b23a0a4b3d | ||
|
|
a2414e0dc7 | ||
|
|
963a40d919 | ||
|
|
017b05c48c | ||
|
|
52b03a43d9 | ||
|
|
26a1abb148 | ||
|
|
e7709798c5 | ||
|
|
37c5e0dc40 | ||
|
|
55c034ec66 | ||
|
|
df054073ef | ||
|
|
ace39cbd03 | ||
|
|
e9b2e108f7 | ||
|
|
f66c87cc62 | ||
|
|
36e0d9c58a | ||
|
|
5db1916332 | ||
|
|
8911503a87 | ||
|
|
55792acd8d | ||
|
|
b8330e46d8 | ||
|
|
65553b90ef | ||
|
|
2fb7d02091 | ||
|
|
4c7eb01b93 | ||
|
|
0fd1dd9077 | ||
|
|
64c2d04b56 | ||
|
|
e283f413ba | ||
|
|
4ce4b11094 | ||
|
|
84c16fb927 | ||
|
|
65bf9273ad | ||
|
|
36a39d99de | ||
|
|
be761f3aab | ||
|
|
c3b062c00b | ||
|
|
149b1a6f1a | ||
|
|
9fd7a1135b | ||
|
|
92a7cceae2 | ||
|
|
1ef83d72e1 | ||
|
|
9be0b3ec10 | ||
|
|
276fb6ae88 | ||
|
|
288c56a3d2 | ||
|
|
082eb760eb | ||
|
|
d5cc2bfe77 | ||
|
|
1e453b05e9 | ||
|
|
ee8d3b0678 | ||
|
|
2f69d2740d |
@@ -1,4 +1,4 @@
|
||||
mintty is copyright 2008-13 Andy Koppe, 2015-16 Thomas Wolff.
|
||||
mintty is copyright 2008-13 Andy Koppe, 2015-18 Thomas Wolff.
|
||||
|
||||
Licensed under the terms of the GNU General Public License version 3 or later,
|
||||
amended with the bundling clause to clarify ambiguous interpretation.
|
||||
@@ -17,6 +17,8 @@ See LICENSE.PuTTY for PuTTY's copyright notice, contributors, and license.
|
||||
The sources of PuTTY 0.60 can be downloaded from
|
||||
ftp://ftp.chiark.greenend.org.uk/users/sgtatham/putty-0.60.
|
||||
|
||||
The minibidi algorithm is under MIT license as quoted in the source file.
|
||||
|
||||
Sixel code (sixel.c) is relicensed under GPL like mintty with the
|
||||
permission of its author (kmiya@culti); Sixel colour conversion code
|
||||
(sixel_hls.c) is licensed by its author Ross Combs under the license
|
||||
@@ -26,3 +28,12 @@ The program icon is the apps/utilities-terminal icon from KDE's Oxygen theme,
|
||||
retrieved from http://websvn.kde.org/trunk/KDE/kdebase/runtime/pics/oxygen.
|
||||
Thanks to the KDE artists for their sleek design. The Oxygen icons are licensed
|
||||
under the terms of the LGPLv3; see LICENSE.Oxygen for details.
|
||||
|
||||
The colour schemes / theme files bundled with mintty are included
|
||||
under various licenses. The source and license or permission are
|
||||
quoted in the respective theme files.
|
||||
|
||||
Bell sounds files are included, mostly under the creative commons license
|
||||
(https://creativecommons.org/publicdomain/zero/1.0/), see also the README
|
||||
in the sounds subdirectory.
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2016 Ryan Prichard
|
||||
Copyright (c) 2017-2018 Google LLC
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to
|
||||
|
||||
140
README.md
140
README.md
@@ -10,15 +10,16 @@ WSLtty components
|
||||
* a wsltty configuration directory in the user’s application folder `%APPDATA%`
|
||||
(“home”-located configuration files from a previously installed version
|
||||
will be migrated to the new default location)
|
||||
* Start Menu shortcuts to start a WSL shell (with some variations, see below)
|
||||
* `*.bat` scripts to invoke WSL from the command line (see below)
|
||||
* optional context menu entries for Windows Explorer to start a WSL shell in the respective folder
|
||||
* Start Menu shortcuts to start WSL terminals
|
||||
* `*.bat` scripts to invoke WSL terminals from the command line
|
||||
* optional context menu entries for Windows Explorer to start WSL terminals in the respective folder
|
||||
* install/uninstall context menu items from Start Menu subfolder `WSLtty`
|
||||
* an uninstall script that can be invoked manually to remove shortcuts and context menu entries
|
||||
|
||||
### Installation ###
|
||||
---
|
||||
|
||||
#### WSLtty installer ####
|
||||
### Installation from this repository ###
|
||||
|
||||
#### WSLtty installer ([Download](https://github.com/mintty/wsltty/releases) standalone installation) ####
|
||||
|
||||
Run the [installer](https://github.com/mintty/wsltty/releases) to install
|
||||
the components listed above.
|
||||
@@ -41,18 +42,76 @@ Within the installation process, provide parameters to the script `install.bat`.
|
||||
The optional first parameter designates the installation target,
|
||||
the optional second parameter designates the configuration directory.
|
||||
|
||||
### Installation with other package management environments ###
|
||||
|
||||
#### Chocolatey ####
|
||||
|
||||
If you use the [Chocolatey package manager](https://chocolatey.org/),
|
||||
invoke one of
|
||||
<img height=222 align=right src=https://github.com/mintty/wsltty.appx/raw/master/wsltty.appx.png>
|
||||
* `choco install wsltty`
|
||||
* `choco upgrade wsltty`
|
||||
|
||||
#### Scoop ####
|
||||
|
||||
If you use the [Scoop package manager](https://scoop.sh/),
|
||||
* `scoop bucket add extras`
|
||||
|
||||
then, invoke one of
|
||||
* `scoop install wsltty`
|
||||
* `scoop update wsltty`
|
||||
|
||||
#### Windows Appx package ####
|
||||
|
||||
A Windows Appx package and certificate is available in the [wsltty.appx](https://github.com/mintty/wsltty.appx/) repository.
|
||||
|
||||
<br clear=all>
|
||||
|
||||
---
|
||||
|
||||
### Invocation ###
|
||||
|
||||
WSLtty can be invoked with
|
||||
* installed Start Menu shortcuts (or Desktop shortcuts if copied there)
|
||||
* *.bat scripts
|
||||
* *.bat scripts (optionally with WSL command as parameters)
|
||||
* Explorer context menu (if installed from the Start Menu `WSLtty` subfolder)
|
||||
|
||||
Starting the mintty terminal directly from the WSLtty installation location
|
||||
is discouraged because that would bypass some essential options.
|
||||
is discouraged because that would bypass essential options.
|
||||
|
||||
#### WSL 2 ####
|
||||
|
||||
Due to some incompatible changes by Microsoft, wslbridge cannot connect
|
||||
in WSL 2 mode at this time.
|
||||
Workaround:
|
||||
* `wsl --set-default-version 1`
|
||||
|
||||
---
|
||||
|
||||
### Configuration ###
|
||||
|
||||
#### Start Menu and Desktop shortcuts ####
|
||||
|
||||
In the Start Menu, the following shortcuts are installed:
|
||||
* For each installed WSL distribution D, D` Terminal` to start in the WSL user home
|
||||
* `WSL Terminal` to start the default WSL distribution (as configured with the Windows tool `wslconfig`)
|
||||
|
||||
In the Start Menu subfolder WSLtty, the following shortcuts are installed:
|
||||
* For each installed WSL distribution D, D` Terminal %` to start in the Windows %USERPROFILE% home
|
||||
* `WSL Terminal %` to start the default WSL distribution in the Windows %USERPROFILE% home
|
||||
|
||||
One Desktop shortcut is installed:
|
||||
* `WSL Terminal` to start the default WSL distribution (as configured with the Windows tool `wslconfig`)
|
||||
|
||||
Other, distribution-specific shortcuts can be copied to the desktop
|
||||
from the Start Menu if desired.
|
||||
|
||||
The Start menu folder WSLtty contains the link
|
||||
<img align=absmiddle height=25 src=https://user-images.githubusercontent.com/12740416/57078483-a7846a00-6cee-11e9-9c5e-8c2e9e56cae4.png>`configure WSL shortcuts`.
|
||||
This function is initially run when wsltty is installed.
|
||||
If should be rerun after adding or removing WSL distributions,
|
||||
in order to create the respective set of shortcuts in the Start menu.
|
||||
|
||||
#### Command line scripts `wsl*.bat` ####
|
||||
|
||||
WSLtty installs the following scripts into `%LOCALAPPDATA%\Microsoft\WindowsApps`
|
||||
@@ -60,38 +119,34 @@ WSLtty installs the following scripts into `%LOCALAPPDATA%\Microsoft\WindowsApps
|
||||
|
||||
* For each installed WSL distribution D, D`.bat` to start in the current folder/directory
|
||||
* For each installed WSL distribution D, D`~.bat` to start in the WSL user home
|
||||
* `wsl.bat` to start the default WSL installation in the current folder/directory
|
||||
* `wsl~.bat` to start the default WSL installation in the WSL user home
|
||||
* `wsl-l.bat` to start the default WSL installation with a login shell
|
||||
* `WSL.bat` and `WSL~.bat` to start the default WSL distribution
|
||||
|
||||
Given that `%LOCALAPPDATA%\Microsoft\WindowsApps` is in your PATH,
|
||||
the scripts can be invoked from cmd.exe, PowerShell, or via WIN+R.
|
||||
|
||||
#### Start Menu and Desktop shortcuts ####
|
||||
|
||||
In the Start Menu, the following shortcuts are installed:
|
||||
* For each installed WSL distribution D, D` in Mintty` to start in the WSL user home
|
||||
|
||||
In the Start Menu subfolder WSLtty, the following shortcuts are installed:
|
||||
* For each installed WSL distribution D, D` in Mintty` to start in the Windows %USERPROFILE% home
|
||||
* For each installed WSL distribution D, D` ~ in Mintty` to start in the WSL user home
|
||||
* `WSL % in Mintty` to start the default WSL installation in the Windows %USERPROFILE% home
|
||||
* `WSL ~ in Mintty` to start the default WSL installation in the WSL user home
|
||||
* `WSL -l in Mintty` to start the default WSL installation with a login shell
|
||||
|
||||
WSLtty does not install Desktop shortcuts. If you want them, copy the
|
||||
desired ones from the Start Menu subfolder `WSLtty`.
|
||||
|
||||
To ensure a login shell to start in your Linux home directory,
|
||||
add a `cd` command to your `$HOME/.profile` on Linux side.
|
||||
|
||||
#### Context menu entries ####
|
||||
|
||||
WSLtty provides context menu entries for all installed WSL distributions,
|
||||
to start a respective WSL shell in a specific folder from an Explorer window.
|
||||
WSLtty provides context menu entries for all installed WSL distributions
|
||||
and one for the configured default distribution,
|
||||
to start a respective WSL terminal in a specific folder from an Explorer window.
|
||||
They are not installed by default.
|
||||
To add or remove context menu entries, run the respective script from the
|
||||
Start Menu subfolder `WSLtty`.
|
||||
|
||||
To add launch entries for the default or all WSL distributions to the
|
||||
Explorer context menu, or remove them, run the respective script from the
|
||||
Start Menu subfolder `WSLtty`:
|
||||
* <img align=absmiddle height=25 src=https://user-images.githubusercontent.com/12740416/57078483-a7846a00-6cee-11e9-9c5e-8c2e9e56cae4.png>`add default to context menu`
|
||||
adds context menu entries for the default WSL distribution
|
||||
* <img align=absmiddle height=25 src=https://user-images.githubusercontent.com/12740416/57078483-a7846a00-6cee-11e9-9c5e-8c2e9e56cae4.png>`add to context menu`
|
||||
adds context menu entries for all WSL distributions
|
||||
* <img align=absmiddle height=25 src=https://user-images.githubusercontent.com/12740416/57078483-a7846a00-6cee-11e9-9c5e-8c2e9e56cae4.png>`remove from context menu`
|
||||
removes context menu entries for WSL distributions
|
||||
|
||||
#### Icon ####
|
||||
|
||||
Wsltty installation and the mintty terminal try to use the icon of the
|
||||
respective WSL distribution. If it cannot be determined, a penguin icon
|
||||
is used as a default. You can replace it with your preferred fallback icon
|
||||
by replacing the icon file `%LOCALAPPDATA%\wsltty\wsl.ico`.
|
||||
|
||||
#### Mintty settings ####
|
||||
|
||||
@@ -120,13 +175,20 @@ Note:
|
||||
If you define `HOME` at Windows level, this changes accordingly.
|
||||
Note, however, that the WSL `HOME` is a completely different setting.
|
||||
|
||||
#### Shell selection ####
|
||||
#### Shell selection and Login shell ####
|
||||
|
||||
To invoke your favourite shell, replace `/bin/bash` with its pathname
|
||||
in the Desktop or Start Menu shortcuts and `*.bat` launch scripts,
|
||||
or Explorer context menu commands.
|
||||
The WSLtty deployment does not impose a shell preference anymore.
|
||||
However, the intermediate gateways (`wslbridge` and its backend and the `bash.exe` Windows launcher)
|
||||
are also involved.
|
||||
|
||||
### Components ###
|
||||
To invoke your favourite shell or launch the shell in login mode,
|
||||
you may append a shell pathname and an optional `-l` parameter
|
||||
to the mintty invocation (in shortcuts, scripts, or context menu entries):
|
||||
* `%LOCALAPPDATA%\wsltty\bin\mintty.exe --WSL= --configdir="%APPDATA%\wsltty" /bin/bash -l`
|
||||
|
||||
---
|
||||
|
||||
### Components and Credits ###
|
||||
|
||||
For mintty, see the [Mintty homepage](http://mintty.github.io/)
|
||||
(with further screenshots),
|
||||
@@ -138,4 +200,4 @@ It is based on [Cygwin](http://cygwin.com)
|
||||
and includes its runtime library ([sources](http://mirrors.dotsrc.org/cygwin/x86/release/cygwin)).
|
||||
|
||||
For interacting with WSL, it uses [wslbridge](https://github.com/rprichard/wslbridge).
|
||||
|
||||
Many thanks for this enabling gateway go especially to Ryan Prichard.
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
add default to context menu.lnk
Executable file
BIN
add default to context menu.lnk
Executable file
Binary file not shown.
@@ -1,159 +1,317 @@
|
||||
#! /bin/sh
|
||||
|
||||
# set some paths; capital variables are for the mkshortcut.exe case,
|
||||
# not for the (deprecated) mkshortcut.vbs case
|
||||
|
||||
case "$installdir" in
|
||||
?*) custominst=true;;
|
||||
"") custominst=false;;
|
||||
esac
|
||||
|
||||
INSTDIR=${installdir:-$LOCALAPPDATA/wsltty}
|
||||
INSTDIR=`cd "$INSTDIR"; pwd`
|
||||
installdir=${installdir:-'%LOCALAPPDATA%\wsltty'}
|
||||
|
||||
target="$installdir"'\bin\mintty.exe'
|
||||
case "$INSTDIR" in
|
||||
*/) TARGETPATH="$INSTDIR"bin/mintty.exe;;
|
||||
*) TARGETPATH="$INSTDIR"/bin/mintty.exe;;
|
||||
esac
|
||||
|
||||
CONFDIR=${configdir:-$APPDATA/wsltty}
|
||||
configdir=${configdir:-'%APPDATA%\wsltty'}
|
||||
|
||||
PATH=/bin:"$PATH":$SYSTEMROOT/System32
|
||||
|
||||
contextmenu=false
|
||||
remove=false
|
||||
alldistros=true
|
||||
config=true
|
||||
|
||||
case "/$0" in
|
||||
*/wsl*)
|
||||
config=false;;
|
||||
esac
|
||||
|
||||
case "$1" in
|
||||
-contextmenu) contextmenu=true
|
||||
shift;;
|
||||
-contextmenu-remove)
|
||||
contextmenu=true
|
||||
remove=true
|
||||
shift;;
|
||||
-info)
|
||||
config=false
|
||||
shift;;
|
||||
-shortcuts-remove)
|
||||
remove=true
|
||||
shift;;
|
||||
remove=true
|
||||
shift;;
|
||||
-contextmenu)
|
||||
contextmenu=true
|
||||
shift;;
|
||||
-contextmenu-default)
|
||||
contextmenu=true
|
||||
alldistros=false
|
||||
shift;;
|
||||
-contextmenu-remove)
|
||||
contextmenu=true
|
||||
remove=true
|
||||
direckey='/HKEY_CURRENT_USER/Software/Classes/Directory'
|
||||
|
||||
regtool list "$direckey/shell" 2>/dev/null |
|
||||
while read name
|
||||
do
|
||||
case `regtool get "$direckey/shell/$name/command/"` in
|
||||
*bin\\mintty.exe*/bin/wslbridge*|*bin\\mintty.exe*--WSL*)
|
||||
regtool remove "$direckey/shell/$name/command"
|
||||
regtool remove "$direckey/shell/$name"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
regtool list "$direckey/Background/shell" 2>/dev/null |
|
||||
while read name
|
||||
do
|
||||
case `regtool get "$direckey/Background/shell/$name/command/"` in
|
||||
*bin\\mintty.exe*/bin/wslbridge*|*bin\\mintty.exe*--WSL*)
|
||||
regtool remove "$direckey/Background/shell/$name/command"
|
||||
regtool remove "$direckey/Background/shell/$name"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
exit
|
||||
shift;;
|
||||
esac
|
||||
|
||||
# test w/o WSL: call this script with REGTOOLFAKE=true dash config-distros.sh
|
||||
if ${REGTOOLFAKE:-false}
|
||||
then
|
||||
regtool () {
|
||||
case "$1" in
|
||||
-*) shift;;
|
||||
esac
|
||||
key=`echo $2 | sed -e 's,.*{\(.*\)}.*,\1,' -e t -e d`
|
||||
case "$1.$2" in
|
||||
list.*) if $contextmenu
|
||||
then echo "{0}"
|
||||
else echo "{1}"; echo "{2}"
|
||||
fi;;
|
||||
get.*/DistributionName) echo "distro$key";;
|
||||
get.*/BasePath) echo "C:\\Program\\{$key}\\State";;
|
||||
get.*/PackageFamilyName) echo "distro{$key}";;
|
||||
get.*/PackageFullName) echo "C:\\Program\\{$key}";;
|
||||
esac
|
||||
case "$1" in
|
||||
-*) shift;;
|
||||
esac
|
||||
key=`echo $2 | sed -e 's,.*{\(.*\)}.*,\1,' -e t -e d`
|
||||
case "$1.$2" in
|
||||
list.*)
|
||||
if $contextmenu
|
||||
then echo "{0}"
|
||||
else echo "{1}"; echo "{2}"
|
||||
fi;;
|
||||
get.*/DistributionName)
|
||||
echo "distro$key";;
|
||||
get.*/BasePath)
|
||||
echo "C:\\Program\\{$key}\\State";;
|
||||
get.*/PackageFamilyName)
|
||||
echo "distro{$key}";;
|
||||
get.*/PackageFullName)
|
||||
echo "C:\\Program\\{$key}";;
|
||||
esac
|
||||
}
|
||||
fi
|
||||
|
||||
# dash built-in echo enforces interpretation of \t etc
|
||||
echoc () {
|
||||
cmd /c echo $*
|
||||
cmd /c echo $*
|
||||
}
|
||||
|
||||
while read line; do echo "$line"; done <</EOB > mkbat.bat
|
||||
if $config
|
||||
then while read line; do echo "$line"; done <</EOB > mkbat.bat
|
||||
@echo off
|
||||
echo Creating %1.bat
|
||||
|
||||
echo @echo off> %1.bat
|
||||
echo rem Start mintty terminal for WSL package %distro% in current directory>> %1.bat
|
||||
echo %target% -i "%icon%" %minttyargs% %bridgeargs%>> %1.bat
|
||||
|
||||
echo Created %1.bat
|
||||
echo rem Start mintty terminal for WSL package %name% in current directory>> %1.bat
|
||||
echo %target% -i "%icon%" %minttyargs% %bridgeargs% %%*>> %1.bat
|
||||
/EOB
|
||||
fi
|
||||
|
||||
PATH=/bin:$PATH
|
||||
if $custominst && $config && ! $remove
|
||||
then
|
||||
mkshortcut.exe -n "add to context menu" -a "$installdir/config-distros.sh -contextmenu" "$installdir/bin/dash.exe" -i '%SystemRoot%\System32\filemgmt.dll' -s min -d "" -w "$installdir"
|
||||
mkshortcut.exe -n "add default to context menu" -a "$installdir/config-distros.sh -contextmenu-default" "$installdir/bin/dash.exe" -i '%SystemRoot%\System32\filemgmt.dll' -s min -d "" -w "$installdir"
|
||||
mkshortcut.exe -n "remove from context menu" -a "$installdir/config-distros.sh -contextmenu-remove" "$installdir/bin/dash.exe" -i '%SystemRoot%\System32\filemgmt.dll' -s min -d "" -w "$installdir"
|
||||
mkshortcut.exe -n "configure WSL shortcuts" -a "$installdir/config-distros.sh" "$installdir/bin/dash.exe" -i '%SystemRoot%\System32\filemgmt.dll' -s min -d "" -w "$installdir"
|
||||
cmd /C 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"
|
||||
cmd /C 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"
|
||||
fi
|
||||
|
||||
lxss="/HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Lxss"
|
||||
schema="/HKEY_CURRENT_USER/Software/Classes/Local Settings/Software/Microsoft/Windows/CurrentVersion/AppModel/SystemAppData"
|
||||
|
||||
(regtool list "$lxss" 2>/dev/null || echo "No WSL packages registered" >&2) |
|
||||
while read guid
|
||||
do
|
||||
appex () {
|
||||
while read line
|
||||
do
|
||||
case "$line" in
|
||||
*Application*Executable*)
|
||||
for item in $line
|
||||
do case "$item" in
|
||||
Executable=*)
|
||||
eval $item
|
||||
echo "$Executable"
|
||||
break;;
|
||||
esac
|
||||
done
|
||||
break;;
|
||||
esac
|
||||
done < $*
|
||||
}
|
||||
|
||||
config () {
|
||||
guid="$1"
|
||||
ok=false
|
||||
case $guid in
|
||||
{*)
|
||||
distro=`regtool get "$lxss/$guid/DistributionName"`
|
||||
case "$distro" in
|
||||
Legacy) name="Bash on Windows"
|
||||
launch=
|
||||
launcher="$SYSTEMROOT/System32/bash.exe"
|
||||
;;
|
||||
*) name="$distro"
|
||||
launch="$distro"
|
||||
launcher="$LOCALAPPDATA/Microsoft/WindowsApps/$distro.exe"
|
||||
;;
|
||||
esac
|
||||
basepath=`regtool get "$lxss/$guid/BasePath"`
|
||||
if package=`regtool -q get "$lxss/$guid/PackageFamilyName"`
|
||||
then instdir=`regtool get "$schema/$package/Schemas/PackageFullName"`
|
||||
if [ -r "$PROGRAMFILES/WindowsApps/$instdir/images/icon.ico" ]
|
||||
then icon="%PROGRAMFILES%/WindowsApps/$instdir/images/icon.ico"
|
||||
else icon="%LOCALAPPDATA%/wsltty/wsl.ico"
|
||||
fi
|
||||
root="$basepath/rootfs"
|
||||
else icon="%LOCALAPPDATA%/lxss/bash.ico"
|
||||
root="$basepath"
|
||||
fi
|
||||
echoc "distro $distro"
|
||||
echoc "- guid $guid"
|
||||
echoc "- (launcher $launcher)"
|
||||
echoc "- icon $icon"
|
||||
echoc "- root $root"
|
||||
distro=`regtool get "$lxss/$guid/DistributionName"`
|
||||
case "$distro" in
|
||||
Legacy)
|
||||
name="Bash on Windows"
|
||||
launch=
|
||||
launcher="$SYSTEMROOT/System32/bash.exe"
|
||||
;;
|
||||
*) name="$distro"
|
||||
launch="$distro"
|
||||
launcher="$LOCALAPPDATA/Microsoft/WindowsApps/$distro.exe"
|
||||
;;
|
||||
esac
|
||||
basepath=`regtool get "$lxss/$guid/BasePath"`
|
||||
if package=`regtool -q get "$lxss/$guid/PackageFamilyName"`
|
||||
then
|
||||
instdir=`regtool get "$schema/$package/Schemas/PackageFullName"`
|
||||
# get actual executable path (may not match $distro) from app manifest
|
||||
manifest="$ProgramW6432/WindowsApps/$instdir/AppxManifest.xml"
|
||||
psh_cmd='([xml]$(Get-Content '"\"$manifest\""')).Package.Applications.Application.Executable'
|
||||
executable=`appex "$manifest"`
|
||||
if [ -r "$ProgramW6432/WindowsApps/$instdir/$executable" ]
|
||||
then icon="%PROGRAMFILES%/WindowsApps/$instdir/$executable"
|
||||
elif [ -r "$ProgramW6432/WindowsApps/$instdir/images/icon.ico" ]
|
||||
then icon="%PROGRAMFILES%/WindowsApps/$instdir/images/icon.ico"
|
||||
else icon="$installdir"'\wsl.ico'
|
||||
fi
|
||||
root="$basepath/rootfs"
|
||||
elif [ -f "$basepath/$distro.exe" ]
|
||||
then
|
||||
icon="$basepath/$distro.exe"
|
||||
root="$basepath/rootfs"
|
||||
else
|
||||
icon="%LOCALAPPDATA%/lxss/bash.ico"
|
||||
root="$basepath"
|
||||
fi
|
||||
|
||||
target='%LOCALAPPDATA%\wsltty\bin\mintty.exe'
|
||||
minttyargs='--wsl --rootfs="'"$root"'" -h err --configdir="%APPDATA%\wsltty" -o Locale=C -o Charset=UTF-8 /bin/wslbridge '
|
||||
#if [ -z "$launch" ]
|
||||
#then bridgeargs='-t /bin/bash'
|
||||
#else bridgeargs='-l "'"$launch"'" -t /bin/bash'
|
||||
#fi
|
||||
bridgeargs='--distro-guid "'"$guid"'" -t /bin/bash'
|
||||
#minttyargs='--wsl --rootfs="'"$root"'" --configdir="'"$configdir"'" -o Locale=C -o Charset=UTF-8 /bin/wslbridge '
|
||||
minttyargs='--WSL="'"$distro"'" --configdir="'"$configdir"'"'
|
||||
MINTARGS='--WSL="'"$distro"'" --configdir="'"$CONFDIR"'"'
|
||||
#if [ -z "$launch" ]
|
||||
#then bridgeargs='-t /bin/bash'
|
||||
#else bridgeargs='-l "'"$launch"'" -t /bin/bash'
|
||||
#fi
|
||||
bridgeargs='--distro-guid "'"$guid"'" -t /bin/bash'
|
||||
bridgeargs='--distro-guid "'"$guid"'" -t'
|
||||
|
||||
export target minttyargs bridgeargs icon
|
||||
export distro
|
||||
ok=true;;
|
||||
DefaultDistribution|"") # WSL default installation
|
||||
distro=
|
||||
name=WSL
|
||||
icon="$installdir"'\wsl.ico'
|
||||
minttyargs='--WSL= --configdir="'"$configdir"'"'
|
||||
MINTARGS='--WSL= --configdir="'"$CONFDIR"'"'
|
||||
bridgeargs='-t'
|
||||
|
||||
ok=true;;
|
||||
esac
|
||||
echoc "distro '$distro'"
|
||||
echoc "- name '$name'"
|
||||
echoc "- guid $guid"
|
||||
echoc "- (launcher $launcher)"
|
||||
echoc "- icon $icon"
|
||||
echoc "- root $root"
|
||||
bridgeargs=" " # deprecated
|
||||
|
||||
if $ok && [ -n "$distro" ]
|
||||
then # fix #163: backend missing +x with certain mount options
|
||||
echo Setting +x wslbridge-backend for distro "'$distro'"
|
||||
(cd "$INSTDIR"; cd bin; wsl.exe -d "$distro" chmod +x wslbridge-backend)
|
||||
# (cd "$LOCALAPPDATA/wsltty/bin"; wsl.exe -d "$distro" chmod +x wslbridge-backend)
|
||||
# (cd ... ; "$SYSTEMROOT/System32/bash.exe" "$guid" -c chmod +x wslbridge-backend)
|
||||
fi
|
||||
|
||||
if $ok && $config
|
||||
then
|
||||
export name target minttyargs bridgeargs icon
|
||||
|
||||
if $contextmenu
|
||||
then
|
||||
# create context menu entry
|
||||
# context menu entries
|
||||
#cmd /C mkcontext "$name"
|
||||
direckey='HKEY_CURRENT_USER\Software\Classes\Directory'
|
||||
keyname="${name}_Terminal"
|
||||
if $remove
|
||||
then
|
||||
reg delete "$direckey\\shell\\$name" /f
|
||||
reg delete "$direckey\\Background\\shell\\$name" /f
|
||||
reg delete "$direckey\\shell\\$keyname" /f
|
||||
reg delete "$direckey\\Background\\shell\\$keyname" /f
|
||||
else
|
||||
reg add "$direckey\\shell\\$name" /d "$name in Mintty Here" /f
|
||||
reg add "$direckey\\shell\\$name" /v Icon /d "$icon" /f
|
||||
cmd /C reg add "$direckey\\shell\\$name\\command" /d "\"$target\" -i \"$icon\" --dir \"%1\" $minttyargs $brigdeargs" /f
|
||||
reg add "$direckey\\Background\\shell\\$name" /d "$name in Mintty Here" /f
|
||||
reg add "$direckey\\Background\\shell\\$name" /v Icon /d "$icon" /f
|
||||
cmd /C reg add "$direckey\\Background\\shell\\$name\\command" /d "\"$target\" -i \"$icon\" $minttyargs $brigdeargs" /f
|
||||
reg add "$direckey\\shell\\$keyname" /d "$name Terminal" /f
|
||||
reg add "$direckey\\shell\\$keyname" /v Icon /d "$icon" /f
|
||||
cmd /C reg add "$direckey\\shell\\$keyname\\command" /d "\"$target\" -i \"$icon\" --dir \"%1\" $minttyargs $bridgeargs" /f
|
||||
reg add "$direckey\\Background\\shell\\$keyname" /d "$name Terminal" /f
|
||||
reg add "$direckey\\Background\\shell\\$keyname" /v Icon /d "$icon" /f
|
||||
cmd /C reg add "$direckey\\Background\\shell\\$keyname\\command" /d "\"$target\" -i \"$icon\" $minttyargs $bridgeargs" /f
|
||||
fi
|
||||
else
|
||||
|
||||
# invocation shortcuts and scripts
|
||||
if $remove
|
||||
then
|
||||
cmd /C del "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\$name ~ in Mintty.lnk"
|
||||
cmd /C del "%LOCALAPPDATA%\\Microsoft\\WindowsApps\\$name.bat"
|
||||
cmd /C del "%LOCALAPPDATA%\\Microsoft\\WindowsApps\\$name~.bat"
|
||||
cmd /C del "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\$name Terminal.lnk"
|
||||
cmd /C del "%LOCALAPPDATA%\\Microsoft\\WindowsApps\\$name.bat"
|
||||
cmd /C del "%LOCALAPPDATA%\\Microsoft\\WindowsApps\\$name~.bat"
|
||||
else
|
||||
# create desktop/start menu shortcut
|
||||
cscript /nologo mkshortcut.vbs "/name:$name in Mintty"
|
||||
# copy to Start Menu WSLtty subfolder
|
||||
rem cmd /C mkdir "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty\\WinUser"
|
||||
cmd /C copy "$name in Mintty.lnk" "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty"
|
||||
# desktop shortcut in %USERPROFILE% -> Start Menu - WSLtty
|
||||
##cscript /nologo mkshortcut.vbs "/name:$name Terminal %"
|
||||
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"
|
||||
|
||||
# create command-line launch script
|
||||
cmd /C mkbat.bat "$name"
|
||||
#cmd /C mkbat.bat "$name in Mintty"
|
||||
# copy to WSLtty home and to WindowsApps launch folder
|
||||
cmd /C copy "$name.bat" "%LOCALAPPDATA%\\wsltty\\$name.bat"
|
||||
cmd /C copy "$name.bat" "%LOCALAPPDATA%\\Microsoft\\WindowsApps\\$name.bat"
|
||||
# launch script in . -> WSLtty home, WindowsApps launch folder
|
||||
cmd /C mkbat.bat "$name"
|
||||
cmd /C copy "$name.bat" "$installdir"
|
||||
cmd /C copy "$name.bat" "%LOCALAPPDATA%\\Microsoft\\WindowsApps"
|
||||
|
||||
# prepare versions to target WSL home directory
|
||||
bridgeargs="-C~ $bridgeargs"
|
||||
# prepare versions to target WSL home directory
|
||||
#bridgeargs="-C~ $bridgeargs"
|
||||
minttyargs="$minttyargs -~"
|
||||
MINTARGS="$MINTARGS -~"
|
||||
|
||||
# create optional addition desktop shortcut
|
||||
cscript /nologo mkshortcut.vbs "/name:$name ~ in Mintty"
|
||||
# copy to Start Menu
|
||||
cmd /C copy "$name ~ in Mintty.lnk" "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs"
|
||||
# desktop shortcut in ~ -> Start Menu
|
||||
##cscript /nologo mkshortcut.vbs "/name:$name Terminal"
|
||||
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"
|
||||
|
||||
# create command-line launch script
|
||||
cmd /C mkbat.bat "$name~"
|
||||
#cmd /C mkbat.bat "$name~ in Mintty"
|
||||
# copy to WSLtty home and to WindowsApps launch folder
|
||||
cmd /C copy "$name~.bat" "%LOCALAPPDATA%\\wsltty\\$name~.bat"
|
||||
cmd /C copy "$name~.bat" "%LOCALAPPDATA%\\Microsoft\\WindowsApps\\$name~.bat"
|
||||
# default desktop shortcut in ~ -> Desktop
|
||||
if [ "$name" = "WSL" ]
|
||||
then
|
||||
#cmd /C copy "$name Terminal.lnk" "%USERPROFILE%\\Desktop"
|
||||
#cmd /C copy "$name Terminal.lnk" "%APPDATA%\\..\\Desktop\\"
|
||||
# the above does not work reliably (see #166)
|
||||
# determine actual Desktop folder
|
||||
desktopkey='\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Desktop'
|
||||
desktop=`regtool get "$desktopkey"`
|
||||
cmd /C copy "$name Terminal.lnk" "$desktop\\"
|
||||
fi
|
||||
|
||||
# launch script in ~ -> WSLtty home, WindowsApps launch folder
|
||||
cmd /C mkbat.bat "$name~"
|
||||
cmd /C copy "$name~.bat" "$installdir"
|
||||
cmd /C copy "$name~.bat" "%LOCALAPPDATA%\\Microsoft\\WindowsApps"
|
||||
fi
|
||||
|
||||
fi;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# ensure proper parameter passing to cmd /C
|
||||
chcp.com 65001 # just in case; seems to work without as well
|
||||
|
||||
# configure for all distros, plus default distro
|
||||
for guid in `
|
||||
if $alldistros
|
||||
then regtool list "$lxss" 2>/dev/null
|
||||
else echo DefaultDistribution
|
||||
fi || echo "No WSL packages registered" >&2
|
||||
`
|
||||
do config $guid
|
||||
done
|
||||
|
||||
|
||||
125
install.bat
125
install.bat
@@ -14,101 +14,94 @@ if not "%2" == "" set refconfigdir=%2 && set configdir=%2
|
||||
:deploy
|
||||
|
||||
mkdir "%installdir%"
|
||||
|
||||
rem clean up previous installation artefacts
|
||||
del /Q "%installdir%\*.bat"
|
||||
del /Q "%installdir%\*.lnk"
|
||||
|
||||
copy LICENSE.mintty "%installdir%"
|
||||
copy LICENSE.wslbridge "%installdir%"
|
||||
|
||||
echo @echo off> setdirs.bat
|
||||
echo set refinstalldir=%refinstalldir%>> setdirs.bat
|
||||
echo set installdir=%installdir%>> setdirs.bat
|
||||
echo set refconfigdir=%refconfigdir%>> setdirs.bat
|
||||
echo set configdir=%configdir%>> setdirs.bat
|
||||
copy setdirs.bat + uninstall.bat "%installdir%\uninstall.bat"
|
||||
|
||||
copy setdirs.bat + wsl.bat "%installdir%\wsl.bat"
|
||||
copy setdirs.bat + wsl.bat "%LOCALAPPDATA%\Microsoft\WindowsApps\wsl.bat"
|
||||
copy setdirs.bat + wsl~.bat "%installdir%\wsl~.bat"
|
||||
copy setdirs.bat + wsl~.bat "%LOCALAPPDATA%\Microsoft\WindowsApps\wsl~.bat"
|
||||
copy setdirs.bat + wsl-l.bat "%installdir%\wsl-l.bat"
|
||||
copy setdirs.bat + wsl-l.bat "%LOCALAPPDATA%\Microsoft\WindowsApps\wsl-l.bat"
|
||||
|
||||
copy "add to context menu.lnk" "%installdir%"
|
||||
copy "add default to context menu.lnk" "%installdir%"
|
||||
copy "remove from context menu.lnk" "%installdir%"
|
||||
copy "configure WSL shortcuts.lnk" "%installdir%"
|
||||
copy wsl.ico "%installdir%"
|
||||
rem copy "WSL Terminal.lnk" "%installdir%"
|
||||
rem copy "WSL Terminal %%.lnk" "%installdir%"
|
||||
copy config-distros.sh "%installdir%"
|
||||
copy mkshortcut.vbs "%installdir%"
|
||||
rem clean up previous installation
|
||||
del "%installdir%\config-context-menu.bat"
|
||||
|
||||
rem copy mkshortcut.vbs "%installdir%"
|
||||
|
||||
rem allow persistent customization of default icon:
|
||||
if not exist "%installdir%\wsl.ico" copy tux.ico "%installdir%\wsl.ico"
|
||||
|
||||
copy uninstall.bat "%installdir%"
|
||||
|
||||
if not exist "%installdir%\bin" goto instbin
|
||||
rem move previous programs possibly in use out of the way
|
||||
del /Q "%installdir%\bin\*.old"
|
||||
ren "%installdir%\bin\cygwin1.dll" cygwin1.dll.old
|
||||
ren "%installdir%\bin\cygwin-console-helper.exe" cygwin-console-helper.exe.old
|
||||
ren "%installdir%\bin\mintty.exe" mintty.exe.old
|
||||
ren "%installdir%\bin\wslbridge.exe" wslbridge.exe.old
|
||||
ren "%installdir%\bin\wslbridge-backend" wslbridge-backend.old
|
||||
del /Q "%installdir%\bin\*.old"
|
||||
|
||||
:instbin
|
||||
mkdir "%installdir%\bin"
|
||||
copy cygwin1.dll "%installdir%\bin"
|
||||
copy cygwin-console-helper.exe "%installdir%\bin"
|
||||
copy dash.exe "%installdir%\bin"
|
||||
copy regtool.exe "%installdir%\bin"
|
||||
copy mintty.exe "%installdir%\bin"
|
||||
copy zoo.exe "%installdir%\bin"
|
||||
copy wslbridge.exe "%installdir%\bin"
|
||||
copy wslbridge-backend "%installdir%\bin"
|
||||
|
||||
copy dash.exe "%installdir%\bin"
|
||||
copy regtool.exe "%installdir%\bin"
|
||||
copy zoo.exe "%installdir%\bin"
|
||||
|
||||
copy mkshortcut.exe "%installdir%"\bin
|
||||
copy cygpopt-0.dll "%installdir%"\bin
|
||||
copy cygiconv-2.dll "%installdir%"\bin
|
||||
copy cygintl-8.dll "%installdir%"\bin
|
||||
|
||||
rem create system config directory and copy config archive
|
||||
mkdir "%installdir%\usr\share\mintty\lang"
|
||||
copy po.zoo "%installdir%\usr\share\mintty\lang"
|
||||
copy lang.zoo "%installdir%\usr\share\mintty\lang"
|
||||
mkdir "%installdir%\usr\share\mintty\themes"
|
||||
copy themes.zoo "%installdir%\usr\share\mintty\themes"
|
||||
mkdir "%installdir%\usr\share\mintty\sounds"
|
||||
copy sounds.zoo "%installdir%\usr\share\mintty\sounds"
|
||||
mkdir "%installdir%\usr\share\mintty\info"
|
||||
copy charnames.txt "%installdir%\usr\share\mintty\info"
|
||||
mkdir "%installdir%\usr\share\mintty\icon"
|
||||
copy tux.ico "%installdir%\usr\share\mintty\icon"
|
||||
copy mintty.ico "%installdir%\usr\share\mintty\icon"
|
||||
|
||||
|
||||
:shortcuts
|
||||
|
||||
rem generate shortcuts
|
||||
|
||||
rem set icon=%%LOCALAPPDATA%%\lxss\bash.ico
|
||||
set lxicon=%%LOCALAPPDATA%%\lxss\bash.ico
|
||||
set icon=%%LOCALAPPDATA%%\wsltty\wsl.ico
|
||||
if exist "%installdir%\wsl.ico" goto iconok
|
||||
if exist "%lxicon" copy "%lxicon" "%installdir%\wsl.ico"
|
||||
:iconok
|
||||
|
||||
set target=%refinstalldir%\bin\mintty.exe
|
||||
set minttyargs=--wsl -h err --configdir="%refconfigdir%" -o Locale=C -o Charset=UTF-8 /bin/wslbridge
|
||||
set bridgeargs=-t /bin/bash
|
||||
cscript mkshortcut.vbs "/name:WSL %% in Mintty"
|
||||
set bridgeargs=-C~ -t /bin/bash
|
||||
cscript mkshortcut.vbs "/name:WSL ~ in Mintty"
|
||||
set bridgeargs=-t /bin/bash -l
|
||||
cscript mkshortcut.vbs "/name:WSL -l in Mintty"
|
||||
|
||||
rem create Start Menu Folder
|
||||
set smf=%APPDATA%\Microsoft\Windows\Start Menu\Programs\WSLtty
|
||||
mkdir "%smf%"
|
||||
|
||||
rem clean up previous installation
|
||||
del /Q "%smf%\*.lnk"
|
||||
|
||||
copy "wsltty home & help.url" "%smf%"
|
||||
copy "add to context menu.lnk" "%smf%"
|
||||
copy "add default to context menu.lnk" "%smf%"
|
||||
copy "remove from context menu.lnk" "%smf%"
|
||||
copy "configure WSL shortcuts.lnk" "%smf%"
|
||||
rem copy "WSL Terminal.lnk" "%smf%"
|
||||
rem copy "WSL Terminal %%.lnk" "%smf%"
|
||||
rem clean up previous installation
|
||||
rmdir /S /Q "%smf%\context menu shortcuts"
|
||||
|
||||
rem create launch shortcuts for default WSL distro
|
||||
copy "WSL %% in Mintty.lnk" "%installdir%"
|
||||
copy "WSL %% in Mintty.lnk" "%smf%"
|
||||
copy "WSL ~ in Mintty.lnk" "%installdir%"
|
||||
copy "WSL ~ in Mintty.lnk" "%smf%"
|
||||
copy "WSL -l in Mintty.lnk" "%installdir%"
|
||||
copy "WSL -l in Mintty.lnk" "%smf%"
|
||||
rem clean up previous installation
|
||||
del "%smf%\WSL Bash %% in Mintty.lnk"
|
||||
del "%smf%\WSL Bash ~ in Mintty.lnk"
|
||||
del "%smf%\WSL Bash -l in Mintty.lnk"
|
||||
|
||||
goto sysconfig
|
||||
|
||||
rem create Desktop Shorcuts
|
||||
copy "WSL %% in Mintty.lnk" "%USERPROFILE%\Desktop"
|
||||
copy "WSL ~ in Mintty.lnk" "%USERPROFILE%\Desktop"
|
||||
|
||||
|
||||
:sysconfig
|
||||
|
||||
rem unpack config files in system config directory
|
||||
cd /D "%installdir%\usr\share\mintty\lang"
|
||||
"%installdir%\bin\zoo" xO po
|
||||
"%installdir%\bin\zoo" xO lang
|
||||
cd /D "%installdir%\usr\share\mintty\themes"
|
||||
"%installdir%\bin\zoo" xO themes
|
||||
cd /D "%installdir%\usr\share\mintty\sounds"
|
||||
"%installdir%\bin\zoo" xO sounds
|
||||
|
||||
|
||||
:migrate configuration
|
||||
@@ -131,8 +124,8 @@ rmdir "%oldroot%\home"
|
||||
|
||||
rem create user config directory and subfolders
|
||||
mkdir "%configdir%\lang"
|
||||
mkdir "%configdir%\sounds"
|
||||
mkdir "%configdir%\themes"
|
||||
mkdir "%configdir%\sounds"
|
||||
|
||||
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"
|
||||
@@ -140,7 +133,7 @@ if not exist "%configdir%\config" echo # To use common configuration in %%APPDAT
|
||||
rem distro-specific stuff: shortcuts and launch scripts
|
||||
cd "%installdir%"
|
||||
bin\dash.exe "%installdir%\config-distros.sh"
|
||||
bin\dash.exe "%installdir%\config-distros.sh" -contextmenu
|
||||
rem bin\dash.exe "%installdir%\config-distros.sh" -contextmenu
|
||||
|
||||
|
||||
:end
|
||||
|
||||
201
makefile
201
makefile
@@ -2,32 +2,63 @@
|
||||
# build a wsltty installer package:
|
||||
# configure ver=... and minttyver= in this makefile
|
||||
# make targets:
|
||||
# make [all] to build a distributable installer (default)
|
||||
# make pkg to build an installer, bypassing the system checks
|
||||
# make wsltty to build an installer using the local copy of mintty
|
||||
# make [all] build a distributable installer (default)
|
||||
# make pkg build an installer, bypassing the system checks
|
||||
# make wsltty build the software, using the local copy of mintty
|
||||
|
||||
all: check pkg
|
||||
|
||||
# wsltty release
|
||||
ver=1.7.9
|
||||
ver=3.0.2.3
|
||||
|
||||
# wsltty appx release - must have 4 parts!
|
||||
verx=3.0.2.3
|
||||
|
||||
# Windows SDK version for appx
|
||||
WINSDKKEY=/HKEY_LOCAL_MACHINE/SOFTWARE/WOW6432Node/Microsoft/.NET Framework Platform/Setup/Multi-Targeting Pack
|
||||
WINSDKVER=`regtool list '$(WINSDKKEY)' | sed -e '$$ q' -e d`
|
||||
|
||||
##############################
|
||||
# mintty release version
|
||||
minttyver=2.7.9
|
||||
minttyver=3.0.2
|
||||
|
||||
# or mintty branch or commit version
|
||||
#minttyver=master
|
||||
|
||||
# wslbridge backend version
|
||||
wslbridgever=0.2.3
|
||||
##############################
|
||||
# wslbridge binary package; may be overridden below
|
||||
wslbridge=wslbridge-package
|
||||
wslbridgever=0.2.4
|
||||
|
||||
# wslbridge frontend version
|
||||
# release 0.2.0 does not have cygwin_internal(CW_SYNC_WINENV) yet;
|
||||
# therefore using "master" below
|
||||
#wslbridge-frontend=wslbridge-frontend
|
||||
# release 0.2.1 is updated and complete, no separate frontend build needed:
|
||||
#wslbridge-frontend=
|
||||
# or wslbridge branch or commit to build from source;
|
||||
# also set wslbridge-commit
|
||||
wslbridge=wslbridge-frontend wslbridge-backend
|
||||
|
||||
# release 0.2.0 does not have cygwin_internal(CW_SYNC_WINENV) yet:
|
||||
#wslbridge-commit=master
|
||||
# use --distro-guid option:
|
||||
wslbridge-frontend=wslbridge-frontend
|
||||
wslbridge-commit=cb22e3f6f989cefe5b6599d3c04422ded74db664
|
||||
|
||||
# use --distro-guid option (merged into 0.2.4):
|
||||
#wslbridge-commit=cb22e3f6f989cefe5b6599d3c04422ded74db664
|
||||
|
||||
# after 0.2.4, from branch login-mode:
|
||||
wslbridge-commit=04a060505860915c99bc336dbeb80269771a80b7
|
||||
|
||||
# after 0.2.4, from branch wslpath:
|
||||
wslbridge-commit=29df86d87135caec8424c08f031ce121a3a39ae1
|
||||
|
||||
# after 0.2.4, merged wslpath branch:
|
||||
wslbridge-commit=06fb7acba28d7f37611f3911685af214739895a0
|
||||
|
||||
# after 0.2.4, with --backend option:
|
||||
wslbridge-commit=47b41bec6c32da58ab01de9345087b1a4fd836e3
|
||||
|
||||
#############################################################################
|
||||
# default target
|
||||
|
||||
all: all-$(notdir $(CURDIR))
|
||||
|
||||
all-wsltty: check pkg
|
||||
|
||||
all-wsltty.appx: appx
|
||||
|
||||
#############################################################################
|
||||
# target checking and some defs
|
||||
@@ -50,55 +81,119 @@ wget=curl -R -L --connect-timeout 55 -O
|
||||
wgeto=curl -R -L --connect-timeout 55
|
||||
|
||||
#############################################################################
|
||||
# system check;
|
||||
# for now, let's enforce Cygwin 32-Bit as the container for wsltty
|
||||
# just in case there is a 32-Bit WSL released (-> 32 bit), and to ensure
|
||||
# the path name drag-and-drop adaptation works (-> cygwin, not msys)
|
||||
# system check:
|
||||
# - ensure the path name drag-and-drop adaptation works (-> Cygwin, not MSYS)
|
||||
# - 64 Bit (x86_64) for more stable invocation (avoid fork issues)
|
||||
|
||||
check:
|
||||
# checking suitable host environment; run `make pkg` to bypass
|
||||
# check cygwin (vs msys) for proper drag-and-drop paths:
|
||||
uname | grep CYGWIN
|
||||
# check 32 bit (vs 64 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
|
||||
# check 64 bit (vs 32 bit) to provide 64-Bit stability support:
|
||||
# check 64 bit to provide 64-Bit stability support:
|
||||
uname -m | grep x86_64
|
||||
|
||||
#############################################################################
|
||||
# patch version information for appx package configuration
|
||||
|
||||
fix-verx:
|
||||
echo patching $(WINSDKVER) into Launcher config
|
||||
cd Launcher; sed -i~ -e "/<supportedRuntime / s,Version=v[.0-9]*,Version=$(WINSDKVER)," app.config
|
||||
echo patched app.config
|
||||
cd Launcher; sed -i~ -e "/<TargetFrameworkVersion>/ s,v[.0-9]*,$(WINSDKVER)," Launcher.csproj
|
||||
echo patched Launcher.csproj
|
||||
echo patching $(verx) into app config
|
||||
sed -i~ -e '/<Identity / s,Version="[.0-9]*",Version="$(verx)",' AppxManifest.xml
|
||||
echo patched AppxManifest.xml
|
||||
|
||||
#############################################################################
|
||||
# generation
|
||||
|
||||
wslbridge: wslbridge-backend $(wslbridge-frontend)
|
||||
wslbridge: $(wslbridge)
|
||||
|
||||
wslbridge-backend:
|
||||
wslbridge-package:
|
||||
$(wget) https://github.com/rprichard/wslbridge/releases/download/$(wslbridgever)/wslbridge-$(wslbridgever)-$(sys).tar.gz
|
||||
tar xvzf wslbridge-$(wslbridgever)-$(sys).tar.gz
|
||||
mkdir -p bin
|
||||
cp wslbridge-$(wslbridgever)-$(sys)/wslbridge* bin/
|
||||
tr -d '\015' < wslbridge-$(wslbridgever)-$(sys)/LICENSE.txt > LICENSE.wslbridge
|
||||
|
||||
wslbridge-frontend:
|
||||
$(wgeto) https://github.com/rprichard/wslbridge/archive/$(wslbridge-commit).zip -o wslbridge-$(wslbridge-commit).zip
|
||||
wslbridge-source: wslbridge-$(wslbridge-commit).zip
|
||||
unzip -o wslbridge-$(wslbridge-commit).zip
|
||||
cd wslbridge-$(wslbridge-commit)/backend; patch -T -p1 < ../../wslbridge-backend-static.patch
|
||||
tr -d '\015' < wslbridge-$(wslbridge-commit)/LICENSE.txt > LICENSE.wslbridge
|
||||
|
||||
wslbridge-$(wslbridge-commit).zip:
|
||||
$(wgeto) https://github.com/rprichard/wslbridge/archive/$(wslbridge-commit).zip -o wslbridge-$(wslbridge-commit).zip
|
||||
|
||||
wslbridge-frontend: wslbridge-source
|
||||
echo ------------- Compiling wslbridge frontend
|
||||
cd wslbridge-$(wslbridge-commit)/frontend; make
|
||||
strip wslbridge-$(wslbridge-commit)/out/wslbridge.exe
|
||||
mkdir -p bin
|
||||
cp wslbridge-$(wslbridge-commit)/out/wslbridge.exe bin/
|
||||
tr -d '\015' < wslbridge-$(wslbridge-commit)/LICENSE.txt > LICENSE.wslbridge
|
||||
|
||||
mintty: mintty-get mintty-build
|
||||
#wslbridge-backend: wslbridge-source
|
||||
# tweak dependency to support build testing on non-Windows 10:
|
||||
backend-bin=wslbridge-$(wslbridge-commit)/out/wslbridge-backend
|
||||
backend-src=wslbridge-$(wslbridge-commit)/backend/wslbridge-backend.cc
|
||||
wslbridge-backend: $(backend-bin) wslbridge-source
|
||||
$(backend-bin): $(backend-src)
|
||||
echo ------------- Compiling wslbridge backend
|
||||
cd wslbridge-$(wslbridge-commit)/backend; if uname -m | grep x86_64; then cmd /C wsl make; else wslbridge make; fi
|
||||
mkdir -p bin
|
||||
cp wslbridge-$(wslbridge-commit)/out/wslbridge-backend bin/
|
||||
|
||||
mintty-get:
|
||||
$(wgeto) https://github.com/mintty/mintty/archive/$(minttyver).zip -o mintty-$(minttyver).zip
|
||||
unzip -o mintty-$(minttyver).zip
|
||||
cp mintty-$(minttyver)/icon/terminal.ico mintty.ico
|
||||
|
||||
wslbuild=LDFLAGS="-static -static-libgcc -s"
|
||||
appxbuild=$(wslbuild) CCOPT=-DWSLTTY_APPX
|
||||
wslversion=VERSION_SUFFIX="– wsltty $(ver)" WSLTTY_VERSION="$(ver)"
|
||||
appxversion=VERSION_SUFFIX="– wsltty appx $(verx)" WSLTTY_VERSION="$(verx)"
|
||||
|
||||
mintty-build:
|
||||
cd mintty-$(minttyver)/src; make LDFLAGS="-static -static-libgcc -s" VERSION_SUFFIX="– wsltty $(ver)"
|
||||
# ensure rebuild of version-specific check and message
|
||||
rm -f mintty-$(minttyver)/bin/*/windialog.o
|
||||
# build mintty
|
||||
cd mintty-$(minttyver)/src; make $(wslbuild) $(wslversion)
|
||||
mkdir -p bin
|
||||
cp mintty-$(minttyver)/bin/mintty.exe bin/
|
||||
cp mintty-$(minttyver)/LICENSE LICENSE.mintty
|
||||
cd mintty-$(minttyver)/lang; zoo a po *.po; mv po.zoo ../../
|
||||
strip bin/mintty.exe
|
||||
|
||||
cygwin:
|
||||
mintty-build-appx:
|
||||
# ensure rebuild of version-specific check and message
|
||||
rm -f mintty-$(minttyver)/bin/*/windialog.o
|
||||
# build mintty
|
||||
cd mintty-$(minttyver)/src; make $(appxbuild) $(appxversion)
|
||||
mkdir -p bin
|
||||
cp mintty-$(minttyver)/bin/mintty.exe bin/
|
||||
strip bin/mintty.exe
|
||||
|
||||
mintty-pkg:
|
||||
cp mintty-$(minttyver)/LICENSE LICENSE.mintty
|
||||
cd mintty-$(minttyver)/lang; zoo a lang *.po; mv lang.zoo ../../
|
||||
cd mintty-$(minttyver)/themes; zoo a themes *[!~]; mv themes.zoo ../../
|
||||
cd mintty-$(minttyver)/sounds; zoo a sounds *.wav *.WAV *.md; mv sounds.zoo ../../
|
||||
# add charnames.txt to support "Character Info"
|
||||
cd mintty-$(minttyver)/src; sh ./mknames
|
||||
cp mintty-$(minttyver)/src/charnames.txt .
|
||||
|
||||
mintty-appx:
|
||||
mkdir -p usr/share/mintty
|
||||
cd usr/share/mintty; mkdir -p lang themes sounds info
|
||||
cp mintty-$(minttyver)/lang/*.po usr/share/mintty/lang/
|
||||
cp mintty-$(minttyver)/themes/*[!~] usr/share/mintty/themes/
|
||||
cp mintty-$(minttyver)/sounds/*.wav usr/share/mintty/sounds/
|
||||
cp mintty-$(minttyver)/sounds/*.WAV usr/share/mintty/sounds/
|
||||
# add charnames.txt to support "Character Info"
|
||||
cd mintty-$(minttyver)/src; sh ./mknames
|
||||
cp mintty-$(minttyver)/src/charnames.txt usr/share/mintty/info/
|
||||
|
||||
cygwin: mkshortcutexe
|
||||
mkdir -p bin
|
||||
cp /bin/cygwin1.dll bin/
|
||||
cp /bin/cygwin-console-helper.exe bin/
|
||||
@@ -106,6 +201,20 @@ cygwin:
|
||||
cp /bin/regtool.exe bin/
|
||||
cp /bin/zoo.exe bin/
|
||||
|
||||
mkshortcutexe: bin/mkshortcut.exe
|
||||
|
||||
bin/mkshortcut.exe: mkshortcut.c
|
||||
echo mksh
|
||||
gcc -o bin/mkshortcut mkshortcut.c -lpopt -lole32 /usr/lib/w32api/libuuid.a
|
||||
cp /bin/cygpopt-0.dll bin/
|
||||
cp /bin/cygiconv-2.dll bin/
|
||||
cp /bin/cygintl-8.dll bin/
|
||||
|
||||
appx-bin:
|
||||
mkdir -p bin
|
||||
cp /bin/cygwin1.dll bin/
|
||||
cp /bin/cygwin-console-helper.exe bin/
|
||||
|
||||
cop: ver
|
||||
mkdir -p rel
|
||||
rm -fr rel/wsltty-$(ver)-install.exe
|
||||
@@ -116,9 +225,16 @@ cop: ver
|
||||
cp bin/regtool.exe rel/
|
||||
cp bin/mintty.exe rel/
|
||||
cp bin/zoo.exe rel/
|
||||
cp po.zoo rel/
|
||||
cp lang.zoo rel/
|
||||
cp themes.zoo rel/
|
||||
cp sounds.zoo rel/
|
||||
cp charnames.txt rel/
|
||||
cp bin/wslbridge.exe rel/
|
||||
cp bin/wslbridge-backend 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/
|
||||
@@ -139,9 +255,22 @@ installbat:
|
||||
ver:
|
||||
echo $(ver) > VERSION
|
||||
|
||||
pkg: wslbridge cygwin mintty cab
|
||||
mintty: mintty-get mintty-build
|
||||
|
||||
wsltty: wslbridge cygwin mintty-build cab
|
||||
mintty-usr: mintty-get mintty-appx
|
||||
|
||||
# local wsltty build target:
|
||||
wsltty: wslbridge cygwin mintty-build mintty-pkg
|
||||
|
||||
# standalone wsltty package build target:
|
||||
pkg: wslbridge cygwin mintty-get mintty-build mintty-pkg cab
|
||||
|
||||
# appx package contents target:
|
||||
wsltty-appx: wslbridge appx-bin mintty-get mintty-build-appx mintty-appx
|
||||
|
||||
# appx package target:
|
||||
appx: wsltty-appx fix-verx
|
||||
sh ./build.sh
|
||||
|
||||
#############################################################################
|
||||
# end
|
||||
|
||||
40
makewinx.cfg
40
makewinx.cfg
@@ -25,7 +25,7 @@ SourceFiles=SourceFiles
|
||||
[Strings]
|
||||
InstallPrompt=Install Mintty terminal for WSL (Windows Subsystem for Linux)?
|
||||
DisplayLicense=
|
||||
FinishMessage=Mintty for WSL installed - for documentation 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
|
||||
FriendlyName=wsltty
|
||||
AppLaunched=cmd.exe /c install.bat
|
||||
@@ -39,26 +39,28 @@ FILE3="wslbridge.exe"
|
||||
FILE4="wslbridge-backend"
|
||||
FILE5="LICENSE.mintty"
|
||||
FILE6="LICENSE.wslbridge"
|
||||
FILE7="WSL % in Mintty.lnk"
|
||||
FILE8="WSL ~ in Mintty.lnk"
|
||||
FILE9="WSL -l in Mintty.lnk"
|
||||
FILE10="wsl.bat"
|
||||
FILE11="wsl~.bat"
|
||||
FILE12="wsl-l.bat"
|
||||
FILE7="config-distros.sh"
|
||||
FILE8="configure WSL shortcuts.lnk"
|
||||
FILE9="charnames.txt"
|
||||
FILE10="VERSION"
|
||||
FILE11="dash.exe"
|
||||
FILE12="regtool.exe"
|
||||
FILE13="install.bat"
|
||||
FILE14="uninstall.bat"
|
||||
FILE15="wsl.ico"
|
||||
FILE15="tux.ico"
|
||||
FILE16="add to context menu.lnk"
|
||||
FILE17="remove from context menu.lnk"
|
||||
FILE18="wsltty home & help.url"
|
||||
FILE19="zoo.exe"
|
||||
FILE20="po.zoo"
|
||||
FILE21="dash.exe"
|
||||
FILE22="regtool.exe"
|
||||
FILE23="config-distros.sh"
|
||||
FILE24="configure WSL shortcuts.lnk"
|
||||
FILE25="mkshortcut.vbs"
|
||||
FILE26="VERSION"
|
||||
FILE17="add default to context menu.lnk"
|
||||
FILE18="remove from context menu.lnk"
|
||||
FILE19="wsltty home & help.url"
|
||||
FILE20="zoo.exe"
|
||||
FILE21="lang.zoo"
|
||||
FILE22="themes.zoo"
|
||||
FILE23="sounds.zoo"
|
||||
FILE24="mintty.ico"
|
||||
FILE25="mkshortcut.exe"
|
||||
FILE26="cygpopt-0.dll"
|
||||
FILE27="cygiconv-2.dll"
|
||||
FILE28="cygintl-8.dll"
|
||||
|
||||
[SourceFiles]
|
||||
SourceFiles0=.
|
||||
@@ -91,4 +93,6 @@ SourceFiles0=.
|
||||
%FILE24%=
|
||||
%FILE25%=
|
||||
%FILE26%=
|
||||
%FILE27%=
|
||||
%FILE28%=
|
||||
|
||||
|
||||
814
mkshortcut.c
Normal file
814
mkshortcut.c
Normal file
@@ -0,0 +1,814 @@
|
||||
/* This is a tweaked version of mkshortcut.c -- create a Windows shortcut
|
||||
Changes:
|
||||
* Facilitate path entries starting with Windows environment variables.
|
||||
(works for working directory and icon location but not for target path)
|
||||
* Do not barf on Windows path syntax.
|
||||
*/
|
||||
|
||||
#include <sys/cygwin.h>
|
||||
#include <string.h>
|
||||
#include <wchar.h>
|
||||
|
||||
#define dont_debug_cygwin_create_path
|
||||
|
||||
/* Preserve leading Windows environment variable for shortcut entries.
|
||||
So e.g. %USERPROFILE% is not pseudo-resolved to some subdirectory
|
||||
but can be used as working directory.
|
||||
NOTE:
|
||||
This works for working directory and icon location but not for the
|
||||
target path which is still polluted with a drive prefix by Windows.
|
||||
*/
|
||||
void * _cygwin_create_path (int line, cygwin_conv_path_t what, const void *from)
|
||||
{
|
||||
what &= CCP_CONVTYPE_MASK;
|
||||
void * to = cygwin_create_path(what, from);
|
||||
if (what == CCP_WIN_W_TO_POSIX ? *(wchar_t*)from == '%' : *(char*)from == '%') {
|
||||
if (what == CCP_POSIX_TO_WIN_W) {
|
||||
to = wcschr(to, '%') ?: to;
|
||||
} else {
|
||||
to = strchr(to, '%') ?: to;
|
||||
}
|
||||
}
|
||||
#ifdef debug_cygwin_create_path
|
||||
switch (what) {
|
||||
case CCP_POSIX_TO_WIN_A:
|
||||
printf("[%d] %s -> %s\n", line, from, to);
|
||||
break;
|
||||
case CCP_POSIX_TO_WIN_W:
|
||||
printf("[%d] %s -> %ls\n", line, from, to);
|
||||
break;
|
||||
case CCP_WIN_A_TO_POSIX:
|
||||
printf("[%d] %s -> %s\n", line, from, to);
|
||||
break;
|
||||
case CCP_WIN_W_TO_POSIX:
|
||||
printf("[%d] %ls -> %s\n", line, from, to);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
return to;
|
||||
}
|
||||
|
||||
#define cygwin_create_path(what, from) _cygwin_create_path(__LINE__, what, from)
|
||||
|
||||
|
||||
/* mkshortcut.c -- create a Windows shortcut
|
||||
*
|
||||
* Copyright (c) 2002 Joshua Daniel Franklin
|
||||
*
|
||||
* Unicode-enabled by (C) 2015 Thomas Wolff
|
||||
* semantic changes:
|
||||
Allow dir to be empty (legal in shortcut)
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* See the COPYING file for full license information.
|
||||
*
|
||||
* Exit values
|
||||
* 1: user error (syntax error)
|
||||
* 2: system error (out of memory, etc.)
|
||||
* 3: windows error (interface failed)
|
||||
*
|
||||
* Compile with: gcc -o mkshortcut mkshortcut.c -lpopt -lole32 /usr/lib/w32api/libuuid.a
|
||||
* (You'd need to uncomment the moved to common.h lines.)
|
||||
*
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
//#include "common.h"
|
||||
#include <stdio.h>
|
||||
#include <popt.h>
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
#define PACKAGE_VERSION "*"
|
||||
|
||||
#include <locale.h>
|
||||
|
||||
#include <wchar.h>
|
||||
|
||||
#define NOCOMATTRIBUTE
|
||||
|
||||
#include <shlobj.h>
|
||||
#include <olectl.h>
|
||||
/* moved to common.h */
|
||||
/*
|
||||
#include <stdio.h>
|
||||
#include <popt.h>
|
||||
*/
|
||||
#include <sys/cygwin.h>
|
||||
#include <string.h> // strlen
|
||||
|
||||
|
||||
static const char versionID[] = PACKAGE_VERSION;
|
||||
static const char revID[] =
|
||||
"$Id$";
|
||||
static const char copyrightID[] =
|
||||
"Copyright (c) 2002\nJoshua Daniel Franklin. All rights reserved.\nLicensed under GPL v2.0\n";
|
||||
|
||||
typedef struct optvals_s
|
||||
{
|
||||
int icon_flag;
|
||||
int unix_flag;
|
||||
int windows_flag;
|
||||
int allusers_flag;
|
||||
int desktop_flag;
|
||||
int smprograms_flag;
|
||||
int show_flag;
|
||||
int offset;
|
||||
char *name_arg;
|
||||
char *desc_arg;
|
||||
char *dir_name_arg;
|
||||
char *argument_arg;
|
||||
char *target_arg;
|
||||
char *icon_name_arg;
|
||||
} optvals;
|
||||
|
||||
static int mkshortcut (optvals opts);
|
||||
static void printTopDescription (FILE * f, char *name);
|
||||
static void printBottomDescription (FILE * f, char *name);
|
||||
static const char *getVersion ();
|
||||
static void usage (FILE * f, char *name);
|
||||
static void help (FILE * f, char *name);
|
||||
static void version (FILE * f, char *name);
|
||||
static void license (FILE * f, char *name);
|
||||
|
||||
static char *program_name;
|
||||
static poptContext optCon;
|
||||
|
||||
static WCHAR *
|
||||
towcs (const char * s)
|
||||
{
|
||||
int sizew = (strlen (s) * 2 + 1); // worst case: surrogates
|
||||
WCHAR * ws = malloc (sizew * sizeof (WCHAR));
|
||||
mbstowcs (ws, s, sizew);
|
||||
return ws;
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, const char **argv)
|
||||
{
|
||||
const char **rest;
|
||||
int rc;
|
||||
int ec = 0;
|
||||
optvals opts;
|
||||
|
||||
const char *tmp_str;
|
||||
int icon_offset_flag;
|
||||
const char *arg;
|
||||
|
||||
struct poptOption helpOptionsTable[] = {
|
||||
{"help", 'h', POPT_ARG_NONE, NULL, '?',
|
||||
"Show this help message", NULL},
|
||||
{"usage", '\0', POPT_ARG_NONE, NULL, 'u',
|
||||
"Display brief usage message", NULL},
|
||||
{"version", 'v', POPT_ARG_NONE, NULL, 'v',
|
||||
"Display version information", NULL},
|
||||
{"license", '\0', POPT_ARG_NONE, NULL, 'l',
|
||||
"Display licensing information", NULL},
|
||||
{NULL, '\0', 0, NULL, 0, NULL, NULL}
|
||||
};
|
||||
|
||||
struct poptOption generalOptionsTable[] = {
|
||||
{"arguments", 'a', POPT_ARG_STRING, NULL, 'a',
|
||||
"Use arguments ARGS", "ARGS"},
|
||||
{"desc", 'd', POPT_ARG_STRING, NULL, 'd',
|
||||
"Text for description/tooltip (defaults to POSIX path of TARGET)",
|
||||
"DESC"},
|
||||
{"icon", 'i', POPT_ARG_STRING, NULL, 'i',
|
||||
"Icon file for link to use", "ICONFILE"},
|
||||
{"iconoffset", 'j', POPT_ARG_INT, &(opts.offset), 'j',
|
||||
"Offset of icon in icon file (default is 0)", NULL},
|
||||
{"name", 'n', POPT_ARG_STRING, NULL, 'n',
|
||||
"Name for link (defaults to TARGET)", "NAME"},
|
||||
{"show", 's', POPT_ARG_STRING, NULL, 's',
|
||||
"Window to show: normal, minimized, maximized", "norm|min|max"},
|
||||
{"workingdir", 'w', POPT_ARG_STRING, NULL, 'w',
|
||||
"Set working directory (defaults to directory path of TARGET)", "PATH"},
|
||||
{"allusers", 'A', POPT_ARG_VAL, &(opts.allusers_flag), 1,
|
||||
"Use 'All Users' instead of current user for -D,-P", NULL},
|
||||
{"desktop", 'D', POPT_ARG_VAL, &(opts.desktop_flag), 1,
|
||||
"Create link relative to 'Desktop' directory", NULL},
|
||||
{"smprograms", 'P', POPT_ARG_VAL, &(opts.smprograms_flag), 1,
|
||||
"Create link relative to Start Menu 'Programs' directory", NULL},
|
||||
{NULL, '\0', 0, NULL, 0, NULL, NULL}
|
||||
};
|
||||
|
||||
struct poptOption opt[] = {
|
||||
{NULL, '\0', POPT_ARG_INCLUDE_TABLE, generalOptionsTable, 0,
|
||||
"General options", NULL},
|
||||
{NULL, '\0', POPT_ARG_INCLUDE_TABLE, helpOptionsTable, 0,
|
||||
"Help options", NULL},
|
||||
{NULL, '\0', 0, NULL, 0, NULL, NULL}
|
||||
};
|
||||
|
||||
setlocale (LC_CTYPE, "");
|
||||
|
||||
tmp_str = strrchr (argv[0], '/');
|
||||
if (tmp_str == NULL)
|
||||
{
|
||||
tmp_str = strrchr (argv[0], '\\');
|
||||
}
|
||||
if (tmp_str == NULL)
|
||||
{
|
||||
tmp_str = argv[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
tmp_str++;
|
||||
}
|
||||
if ((program_name = strdup (tmp_str)) == NULL)
|
||||
{
|
||||
fprintf (stderr, "%s: memory allocation error\n", argv[0]);
|
||||
exit (2);
|
||||
}
|
||||
|
||||
icon_offset_flag = 0;
|
||||
|
||||
opts.offset = 0;
|
||||
opts.icon_flag = 0;
|
||||
opts.unix_flag = 0;
|
||||
opts.windows_flag = 0;
|
||||
opts.allusers_flag = 0;
|
||||
opts.desktop_flag = 0;
|
||||
opts.smprograms_flag = 0;
|
||||
opts.show_flag = SW_SHOWNORMAL;
|
||||
opts.target_arg = NULL;
|
||||
opts.argument_arg = NULL;
|
||||
opts.name_arg = NULL;
|
||||
opts.desc_arg = NULL;
|
||||
opts.dir_name_arg = NULL;
|
||||
opts.icon_name_arg = NULL;
|
||||
|
||||
/* Parse options */
|
||||
optCon = poptGetContext (NULL, argc, argv, opt, 0);
|
||||
poptSetOtherOptionHelp (optCon, "[OPTION]* TARGET");
|
||||
while ((rc = poptGetNextOpt (optCon)) > 0)
|
||||
{
|
||||
switch (rc)
|
||||
{
|
||||
case '?':
|
||||
help (stdout, program_name);
|
||||
goto exit;
|
||||
case 'u':
|
||||
usage (stdout, program_name);
|
||||
goto exit;
|
||||
case 'v':
|
||||
version (stdout, program_name);
|
||||
goto exit;
|
||||
case 'l':
|
||||
license (stdout, program_name);
|
||||
goto exit;
|
||||
case 'd':
|
||||
if (arg = poptGetOptArg (optCon))
|
||||
{
|
||||
if ((opts.desc_arg = strdup (arg)) == NULL)
|
||||
{
|
||||
fprintf (stderr, "%s: memory allocation error\n",
|
||||
program_name);
|
||||
ec = 2;
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'i':
|
||||
opts.icon_flag = 1;
|
||||
if (arg = poptGetOptArg (optCon))
|
||||
{
|
||||
opts.icon_name_arg = (char *) cygwin_create_path (
|
||||
CCP_POSIX_TO_WIN_A, arg);
|
||||
if (opts.icon_name_arg == NULL)
|
||||
{
|
||||
fprintf (stderr, "%s: error converting posix path to win32 (%s)\n",
|
||||
program_name, strerror (errno));
|
||||
ec = 2;
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'j':
|
||||
icon_offset_flag = 1;
|
||||
break;
|
||||
case 'n':
|
||||
if (arg = poptGetOptArg (optCon))
|
||||
{
|
||||
if ((opts.name_arg = strdup (arg)) == NULL)
|
||||
{
|
||||
fprintf (stderr, "%s: memory allocation error\n",
|
||||
program_name);
|
||||
ec = 2;
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 's':
|
||||
if (arg = poptGetOptArg (optCon))
|
||||
{
|
||||
if (strcmp (arg, "min") == 0)
|
||||
{
|
||||
opts.show_flag = SW_SHOWMINNOACTIVE;
|
||||
}
|
||||
else if (strcmp (arg, "max") == 0)
|
||||
{
|
||||
opts.show_flag = SW_SHOWMAXIMIZED;
|
||||
}
|
||||
else if (strcmp (arg, "norm") == 0)
|
||||
{
|
||||
opts.show_flag = SW_SHOWNORMAL;
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf (stderr, "%s: %s not valid for show window\n",
|
||||
program_name, arg);
|
||||
ec = 2;
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'w':
|
||||
if (arg = poptGetOptArg (optCon))
|
||||
{
|
||||
if ((opts.dir_name_arg = strdup (arg)) == NULL)
|
||||
{
|
||||
fprintf (stderr, "%s: memory allocation error\n",
|
||||
program_name);
|
||||
ec = 2;
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'a':
|
||||
if (arg = poptGetOptArg (optCon))
|
||||
{
|
||||
if ((opts.argument_arg = strdup (arg)) == NULL)
|
||||
{
|
||||
fprintf (stderr, "%s: memory allocation error\n",
|
||||
program_name);
|
||||
ec = 2;
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
break;
|
||||
// case 'A'
|
||||
// case 'D'
|
||||
// case 'P' all handled by popt itself
|
||||
}
|
||||
}
|
||||
|
||||
if (icon_offset_flag & !opts.icon_flag)
|
||||
{
|
||||
fprintf (stderr,
|
||||
"%s: --iconoffset|-j only valid in conjuction with --icon|-i\n",
|
||||
program_name);
|
||||
usage (stderr, program_name);
|
||||
ec = 1;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (opts.smprograms_flag && opts.desktop_flag)
|
||||
{
|
||||
fprintf (stderr,
|
||||
"%s: --smprograms|-P not valid in conjuction with --desktop|-D\n",
|
||||
program_name);
|
||||
usage (stderr, program_name);
|
||||
ec = 1;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (rc < -1)
|
||||
{
|
||||
fprintf (stderr, "%s: bad argument %s: %s\n",
|
||||
program_name, poptBadOption (optCon, POPT_BADOPTION_NOALIAS),
|
||||
poptStrerror (rc));
|
||||
ec = 1;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
rest = poptGetArgs (optCon);
|
||||
|
||||
if (rest && *rest)
|
||||
{
|
||||
if ((opts.target_arg = strdup (*rest)) == NULL)
|
||||
{
|
||||
fprintf (stderr, "%s: memory allocation error\n", program_name);
|
||||
ec = 2;
|
||||
goto exit;
|
||||
}
|
||||
rest++;
|
||||
if (rest && *rest)
|
||||
{
|
||||
fprintf (stderr, "%s: Too many arguments: ", program_name);
|
||||
while (*rest)
|
||||
fprintf (stderr, "%s ", *rest++);
|
||||
fprintf (stderr, "\n");
|
||||
usage (stderr, program_name);
|
||||
ec = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// THE MEAT GOES HERE
|
||||
ec = mkshortcut (opts);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf (stderr, "%s: TARGET not specified\n", program_name);
|
||||
usage (stderr, program_name);
|
||||
ec = 1;
|
||||
}
|
||||
|
||||
exit:
|
||||
return ec;
|
||||
}
|
||||
|
||||
static char *
|
||||
xstrncat (char **dest, const char *add)
|
||||
{
|
||||
size_t n = strlen (add);
|
||||
size_t len = strlen (*dest) + n + 1;
|
||||
char *s = (char *) realloc (*dest, len * sizeof (char));
|
||||
if (!s)
|
||||
{
|
||||
fprintf (stderr, "%s: out of memory\n", program_name);
|
||||
exit (2);
|
||||
}
|
||||
*dest = s;
|
||||
return strncat (*dest, add, n);
|
||||
}
|
||||
|
||||
int
|
||||
mkshortcut (optvals opts)
|
||||
{
|
||||
char * link_name = NULL;
|
||||
WCHAR * exe_name = NULL;
|
||||
WCHAR * dir_name = NULL;
|
||||
WCHAR * desc = NULL;
|
||||
char * buf_str;
|
||||
char * tmp_str;
|
||||
char * base_str;
|
||||
int tmp;
|
||||
|
||||
/* For OLE interface */
|
||||
LPITEMIDLIST id;
|
||||
HRESULT hres;
|
||||
IShellLinkW * shell_link;
|
||||
IPersistFile * persist_file;
|
||||
|
||||
exe_name = (WCHAR *) cygwin_create_path (CCP_POSIX_TO_WIN_W, opts.target_arg);
|
||||
if (!exe_name)
|
||||
{
|
||||
fprintf (stderr, "%s: error converting posix path to win32 (%s)\n",
|
||||
program_name, strerror (errno));
|
||||
return 2;
|
||||
}
|
||||
|
||||
#ifdef colon_stuff
|
||||
/* If there's a colon in the TARGET, it should be a URL */
|
||||
if (strchr (opts.target_arg, ':') != NULL)
|
||||
{
|
||||
/* Nope, somebody's trying a W32 path */
|
||||
if (opts.target_arg[1] == ':')
|
||||
{
|
||||
fprintf (stderr, "%s: all paths must be in POSIX format\n",
|
||||
program_name);
|
||||
usage (stderr, program_name);
|
||||
return 1;
|
||||
}
|
||||
dir_name = L"";
|
||||
}
|
||||
/* Convert TARGET to win32 path */
|
||||
else
|
||||
#endif
|
||||
{
|
||||
buf_str = strdup (opts.target_arg);
|
||||
|
||||
if (opts.dir_name_arg != NULL)
|
||||
/* Get a working dir from 'w' option */
|
||||
{
|
||||
#ifdef colon_stuff
|
||||
if (strchr (opts.dir_name_arg, ':') != NULL)
|
||||
{
|
||||
fprintf (stderr, "%s: all paths must be in POSIX format\n",
|
||||
program_name);
|
||||
usage (stderr, program_name);
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
dir_name = (WCHAR *) cygwin_create_path (CCP_POSIX_TO_WIN_W,
|
||||
opts.dir_name_arg);
|
||||
if (!dir_name)
|
||||
{
|
||||
fprintf (stderr, "%s: error converting posix path to win32 (%s)\n",
|
||||
program_name, strerror (errno));
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
else
|
||||
/* Allow dir to be empty (legal in shortcut) */
|
||||
{
|
||||
dir_name = L"";
|
||||
}
|
||||
}
|
||||
|
||||
/* Generate a name for the link if not given */
|
||||
if (opts.name_arg == NULL)
|
||||
{
|
||||
/* Strip trailing /'s if any */
|
||||
buf_str = strdup (opts.target_arg);
|
||||
base_str = buf_str;
|
||||
tmp_str = buf_str;
|
||||
tmp = strlen (buf_str) - 1;
|
||||
while (strrchr (buf_str, '/') == (buf_str + tmp))
|
||||
{
|
||||
buf_str[tmp] = '\0';
|
||||
tmp--;
|
||||
}
|
||||
/* Get basename */
|
||||
while (*buf_str)
|
||||
{
|
||||
if (*buf_str == '/')
|
||||
tmp_str = buf_str + 1;
|
||||
buf_str++;
|
||||
}
|
||||
link_name = strdup (tmp_str);
|
||||
}
|
||||
/* User specified a name, so check it and convert */
|
||||
else
|
||||
{
|
||||
if (opts.desktop_flag || opts.smprograms_flag)
|
||||
{
|
||||
/* Cannot have absolute path relative to Desktop/SM Programs */
|
||||
if (opts.name_arg[0] == '/')
|
||||
{
|
||||
fprintf (stderr,
|
||||
"%s: absolute pathnames not allowed with -D/-P\n",
|
||||
program_name);
|
||||
usage (stderr, program_name);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/* Sigh. Another W32 path */
|
||||
#ifdef colon_stuff
|
||||
if (strchr (opts.name_arg, ':') != NULL)
|
||||
{
|
||||
fprintf (stderr, "%s: all paths must be in POSIX format\n",
|
||||
program_name);
|
||||
usage (stderr, program_name);
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
link_name = (char *) cygwin_create_path (
|
||||
CCP_POSIX_TO_WIN_A | CCP_RELATIVE, opts.name_arg);
|
||||
// passing multi-byte characters transparently per byte
|
||||
if (!link_name)
|
||||
{
|
||||
fprintf (stderr, "%s: error converting posix path to win32 (%s)\n",
|
||||
program_name, strerror (errno));
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
|
||||
/* Add suffix to link name if necessary */
|
||||
if (strlen (link_name) > 4)
|
||||
{
|
||||
tmp = strlen (link_name) - 4;
|
||||
if (strncmp (link_name + tmp, ".lnk", 4) != 0)
|
||||
xstrncat (&link_name, ".lnk");
|
||||
}
|
||||
else
|
||||
xstrncat (&link_name, ".lnk");
|
||||
|
||||
/* Prepend relative path if necessary */
|
||||
if (opts.desktop_flag)
|
||||
{
|
||||
char local_buf[MAX_PATH];
|
||||
buf_str = strdup (link_name);
|
||||
|
||||
if (!opts.allusers_flag)
|
||||
SHGetSpecialFolderLocation (NULL, CSIDL_DESKTOPDIRECTORY, &id);
|
||||
else
|
||||
SHGetSpecialFolderLocation (NULL, CSIDL_COMMON_DESKTOPDIRECTORY, &id);
|
||||
SHGetPathFromIDList (id, local_buf);
|
||||
/* Make sure Win95 without "All Users" has output */
|
||||
if (strlen (local_buf) == 0)
|
||||
{
|
||||
SHGetSpecialFolderLocation (NULL, CSIDL_DESKTOPDIRECTORY, &id);
|
||||
SHGetPathFromIDList (id, local_buf);
|
||||
}
|
||||
link_name = strdup (local_buf);
|
||||
xstrncat (&link_name, "\\");
|
||||
xstrncat (&link_name, buf_str);
|
||||
}
|
||||
|
||||
if (opts.smprograms_flag)
|
||||
{
|
||||
char local_buf[MAX_PATH];
|
||||
buf_str = strdup (link_name);
|
||||
|
||||
if (!opts.allusers_flag)
|
||||
SHGetSpecialFolderLocation (NULL, CSIDL_PROGRAMS, &id);
|
||||
else
|
||||
SHGetSpecialFolderLocation (NULL, CSIDL_COMMON_PROGRAMS, &id);
|
||||
SHGetPathFromIDList (id, local_buf);
|
||||
/* Make sure Win95 without "All Users" has output */
|
||||
if (strlen (local_buf) == 0)
|
||||
{
|
||||
SHGetSpecialFolderLocation (NULL, CSIDL_PROGRAMS, &id);
|
||||
SHGetPathFromIDList (id, local_buf);
|
||||
}
|
||||
link_name = strdup (local_buf);
|
||||
xstrncat (&link_name, "\\");
|
||||
xstrncat (&link_name, buf_str);
|
||||
}
|
||||
|
||||
/* Make link name Unicode-compliant */
|
||||
WCHAR * widename = towcs (link_name);
|
||||
|
||||
/* After Windows 7, saving link to relative path fails; work around that */
|
||||
#ifdef corrupt_memory
|
||||
WCHAR widepath[MAX_PATH];
|
||||
hres = GetFullPathNameW (widename, sizeof (widepath), widepath, NULL);
|
||||
if (hres == 0)
|
||||
{
|
||||
fprintf (stderr, "%s: Could not qualify link name\n", program_name);
|
||||
return 2;
|
||||
}
|
||||
#else
|
||||
WCHAR * widepath = (WCHAR *) cygwin_create_path (CCP_POSIX_TO_WIN_W, link_name);
|
||||
#endif
|
||||
link_name = (char *) cygwin_create_path (CCP_WIN_W_TO_POSIX, widepath);
|
||||
|
||||
/* Setup description text */
|
||||
if (opts.desc_arg != NULL)
|
||||
{
|
||||
desc = towcs (opts.desc_arg);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Put the POSIX path in the "Description", just to be nice */
|
||||
desc = towcs (cygwin_create_path (CCP_WIN_A_TO_POSIX, exe_name));
|
||||
if (!desc)
|
||||
{
|
||||
fprintf (stderr, "%s: error converting win32 path to posix (%s)\n",
|
||||
program_name, strerror (errno));
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
|
||||
/* Beginning of Windows interface */
|
||||
hres = OleInitialize (NULL);
|
||||
if (hres != S_FALSE && hres != S_OK)
|
||||
{
|
||||
fprintf (stderr, "%s: Could not initialize OLE interface\n",
|
||||
program_name);
|
||||
return 3;
|
||||
}
|
||||
|
||||
hres =
|
||||
CoCreateInstance (&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
|
||||
&IID_IShellLinkW, (void **) &shell_link);
|
||||
if (SUCCEEDED (hres))
|
||||
{
|
||||
hres =
|
||||
shell_link->lpVtbl->QueryInterface (shell_link, &IID_IPersistFile,
|
||||
(void **) &persist_file);
|
||||
if (SUCCEEDED (hres))
|
||||
{
|
||||
shell_link->lpVtbl->SetPath (shell_link, exe_name);
|
||||
shell_link->lpVtbl->SetDescription (shell_link, desc);
|
||||
shell_link->lpVtbl->SetWorkingDirectory (shell_link, dir_name);
|
||||
if (opts.argument_arg)
|
||||
shell_link->lpVtbl->SetArguments (shell_link,
|
||||
towcs (opts.argument_arg));
|
||||
if (opts.icon_flag)
|
||||
shell_link->lpVtbl->SetIconLocation (shell_link,
|
||||
towcs (opts.icon_name_arg),
|
||||
opts.offset);
|
||||
if (opts.show_flag != SW_SHOWNORMAL)
|
||||
shell_link->lpVtbl->SetShowCmd (shell_link, opts.show_flag);
|
||||
|
||||
hres = persist_file->lpVtbl->Save (persist_file, widepath, TRUE);
|
||||
if (!SUCCEEDED (hres))
|
||||
{
|
||||
fprintf (stderr,
|
||||
"%s: Saving \"%s\" failed; does the target directory exist?\n",
|
||||
program_name, link_name);
|
||||
return 3;
|
||||
}
|
||||
persist_file->lpVtbl->Release (persist_file);
|
||||
shell_link->lpVtbl->Release (shell_link);
|
||||
|
||||
/* If we are creating shortcut for all users, ensure it is readable by all users */
|
||||
if (opts.allusers_flag)
|
||||
{
|
||||
char *posixpath = (char *) cygwin_create_path (
|
||||
CCP_WIN_W_TO_POSIX | CCP_ABSOLUTE, widepath);
|
||||
if (posixpath && *posixpath)
|
||||
{
|
||||
struct stat statbuf;
|
||||
if (stat (posixpath, &statbuf))
|
||||
{
|
||||
fprintf (stderr,
|
||||
"%s: stat \"%s\" failed\n",
|
||||
program_name, posixpath);
|
||||
}
|
||||
else if (chmod (posixpath, statbuf.st_mode|S_IRUSR|S_IRGRP|S_IROTH))
|
||||
{
|
||||
fprintf (stderr,
|
||||
"%s: chmod \"%s\" failed\n",
|
||||
program_name, posixpath);
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf (stderr, "%s: QueryInterface failed\n", program_name);
|
||||
return 3;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf (stderr, "%s: CoCreateInstance failed\n", program_name);
|
||||
return 3;
|
||||
}
|
||||
}
|
||||
|
||||
static const char *
|
||||
getVersion ()
|
||||
{
|
||||
return versionID;
|
||||
}
|
||||
|
||||
static void
|
||||
printTopDescription (FILE * f, char *name)
|
||||
{
|
||||
char s[20];
|
||||
fprintf (f, "%s is part of cygutils version %s\n", name, getVersion ());
|
||||
fprintf (f, " create a Windows shortcut\n\n");
|
||||
}
|
||||
|
||||
static void
|
||||
printBottomDescription (FILE * f, char *name)
|
||||
{
|
||||
fprintf (f,
|
||||
"\nNOTE: All filename arguments must be in unix (POSIX) format\n");
|
||||
}
|
||||
|
||||
static void
|
||||
printLicense (FILE * f, char *name)
|
||||
{
|
||||
fprintf (f,
|
||||
"This program is free software: you can redistribute it and/or modify\n"
|
||||
"it under the terms of the GNU General Public License as published by\n"
|
||||
"the Free Software Foundation, either version 3 of the License, or\n"
|
||||
"(at your option) any later version.\n\n"
|
||||
"This program is distributed in the hope that it will be useful,\n"
|
||||
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
|
||||
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
|
||||
"GNU General Public License for more details.\n\n"
|
||||
"You should have received a copy of the GNU General Public License\n"
|
||||
"along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n"
|
||||
"See the COPYING file for full license information.\n");
|
||||
}
|
||||
|
||||
static void
|
||||
usage (FILE * f, char *name)
|
||||
{
|
||||
poptPrintUsage (optCon, f, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
help (FILE * f, char *name)
|
||||
{
|
||||
printTopDescription (f, name);
|
||||
poptPrintHelp (optCon, f, 0);
|
||||
printBottomDescription (f, name);
|
||||
}
|
||||
|
||||
static void
|
||||
version (FILE * f, char *name)
|
||||
{
|
||||
printTopDescription (f, name);
|
||||
fprintf (f, copyrightID);
|
||||
}
|
||||
|
||||
static void
|
||||
license (FILE * f, char *name)
|
||||
{
|
||||
printTopDescription (f, name);
|
||||
printLicense (f, name);
|
||||
}
|
||||
@@ -1,15 +1,15 @@
|
||||
rem cscript mkshortcut.vbs [/param:arg] /target:link
|
||||
rem cscript mkshortcut.vbs [/param:arg] /target:link
|
||||
|
||||
rem %
|
||||
rem /arguments:--wsl -h err -o Locale=C -o Charset=UTF-8 /bin/wslbridge -t /bin/bash
|
||||
rem ~
|
||||
rem /arguments:--wsl -h err -o Locale=C -o Charset=UTF-8 /bin/wslbridge -C~ -t /bin/bash
|
||||
rem -l
|
||||
rem /arguments:--wsl -h err -o Locale=C -o Charset=UTF-8 /bin/wslbridge -t /bin/bash -l
|
||||
rem /target:%LOCALAPPDATA%\wsltty\bin\mintty.exe
|
||||
rem /workingdir:%USERPROFILE%
|
||||
rem rem /icon:%LOCALAPPDATA%\lxss\bash.ico
|
||||
rem /icon:%LOCALAPPDATA%\wsltty\wsl.ico
|
||||
rem deprecated: /icon:%LOCALAPPDATA%\lxss\bash.ico
|
||||
rem deprecated: %
|
||||
rem /arguments:--wsl -o Locale=C -o Charset=UTF-8 /bin/wslbridge -t /bin/bash
|
||||
rem deprecated: ~
|
||||
rem /arguments:--wsl -o Locale=C -o Charset=UTF-8 /bin/wslbridge -C~ -t /bin/bash
|
||||
rem deprecated: -l
|
||||
rem /arguments:--wsl -o Locale=C -o Charset=UTF-8 /bin/wslbridge -t /bin/bash -l
|
||||
|
||||
rem General - Name:
|
||||
name = Wscript.Arguments.Named("name") & ".lnk"
|
||||
@@ -24,7 +24,7 @@ rem lnk.Arguments = Wscript.Arguments.Named("arguments")
|
||||
lnk.TargetPath = wshell.ExpandEnvironmentStrings("%target%")
|
||||
minttyargs = wshell.ExpandEnvironmentStrings("%minttyargs%")
|
||||
bridgeargs = wshell.ExpandEnvironmentStrings("%bridgeargs%")
|
||||
lnk.Arguments = minttyargs & bridgeargs
|
||||
lnk.Arguments = minttyargs & " " & bridgeargs
|
||||
rem wscript.echo "minttyargs: " & minttyargs
|
||||
rem wscript.echo lnk.Arguments
|
||||
|
||||
@@ -46,6 +46,7 @@ rem Shorcut key:
|
||||
rem lnk.HotKey = "ALT+CTRL+W"
|
||||
|
||||
rem Run:
|
||||
rem 1: Normal 7: Minimized 3: Maximized
|
||||
rem lnk.WindowStyle = 1
|
||||
|
||||
rem Comment:
|
||||
|
||||
0
wsl.ico → tux.ico
Executable file → Normal file
0
wsl.ico → tux.ico
Executable file → Normal file
|
Before Width: | Height: | Size: 472 KiB After Width: | Height: | Size: 472 KiB |
13
wsl-l.bat
13
wsl-l.bat
@@ -1,13 +0,0 @@
|
||||
@echo off
|
||||
|
||||
rem Start mintty terminal for WSL with login shell
|
||||
|
||||
if "%installdir%" == "" set installdir=%LOCALAPPDATA%\wsltty
|
||||
if "%configdir%" == "" set configdir=%APPDATA%\wsltty
|
||||
|
||||
rem To enable invocation of this script from WIN+R or from cmd.exe,
|
||||
rem you may want to copy this script into "%SYSTEMROOT%\System32",
|
||||
rem or include the installation folder "%LOCALAPPDATA%\wsltty" in your PATH
|
||||
|
||||
"%installdir%\bin\mintty.exe" --wsl -h err "--configdir=%configdir%" -o Locale=C -o Charset=UTF-8 -i "%LOCALAPPDATA%\wsltty\wsl.ico" /bin/wslbridge -t /bin/bash -l
|
||||
|
||||
13
wsl.bat
13
wsl.bat
@@ -1,13 +0,0 @@
|
||||
@echo off
|
||||
|
||||
rem Start mintty terminal for WSL in current directory
|
||||
|
||||
if "%installdir%" == "" set installdir=%LOCALAPPDATA%\wsltty
|
||||
if "%configdir%" == "" set configdir=%APPDATA%\wsltty
|
||||
|
||||
rem To enable invocation of this script from WIN+R or from cmd.exe,
|
||||
rem you may want to copy this script into "%SYSTEMROOT%\System32",
|
||||
rem or include the installation folder "%LOCALAPPDATA%\wsltty" in your PATH
|
||||
|
||||
"%installdir%\bin\mintty.exe" --wsl -h err "--configdir=%configdir%" -o Locale=C -o Charset=UTF-8 -i "%LOCALAPPDATA%\wsltty\wsl.ico" /bin/wslbridge -t /bin/bash
|
||||
|
||||
76
wslbridge-backend-static.patch
Normal file
76
wslbridge-backend-static.patch
Normal file
@@ -0,0 +1,76 @@
|
||||
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
|
||||
BIN
wsltty.png
BIN
wsltty.png
Binary file not shown.
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
13
wsl~.bat
13
wsl~.bat
@@ -1,13 +0,0 @@
|
||||
@echo off
|
||||
|
||||
rem Start mintty terminal for WSL in WSL home directory
|
||||
|
||||
if "%installdir%" == "" set installdir=%LOCALAPPDATA%\wsltty
|
||||
if "%configdir%" == "" set configdir=%APPDATA%\wsltty
|
||||
|
||||
rem To enable invocation of this script from WIN+R or from cmd.exe,
|
||||
rem you may want to copy this script into "%SYSTEMROOT%\System32",
|
||||
rem or include the installation folder "%LOCALAPPDATA%\wsltty" in your PATH
|
||||
|
||||
"%installdir%\bin\mintty.exe" --wsl -h err "--configdir=%configdir%" -o Locale=C -o Charset=UTF-8 -i "%LOCALAPPDATA%\wsltty\wsl.ico" /bin/wslbridge -C~ -t /bin/bash
|
||||
|
||||
Reference in New Issue
Block a user