mirror of
https://github.com/mintty/wsltty.git
synced 2025-11-08 11:01:51 +00:00
Compare commits
42 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 | ||
|
|
fc8e7cda45 | ||
|
|
b23a0a4b3d | ||
|
|
a2414e0dc7 | ||
|
|
963a40d919 | ||
|
|
017b05c48c | ||
|
|
52b03a43d9 |
@@ -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
|
The sources of PuTTY 0.60 can be downloaded from
|
||||||
ftp://ftp.chiark.greenend.org.uk/users/sgtatham/putty-0.60.
|
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
|
Sixel code (sixel.c) is relicensed under GPL like mintty with the
|
||||||
permission of its author (kmiya@culti); Sixel colour conversion code
|
permission of its author (kmiya@culti); Sixel colour conversion code
|
||||||
(sixel_hls.c) is licensed by its author Ross Combs under the license
|
(sixel_hls.c) is licensed by its author Ross Combs under the license
|
||||||
@@ -31,3 +33,7 @@ The colour schemes / theme files bundled with mintty are included
|
|||||||
under various licenses. The source and license or permission are
|
under various licenses. The source and license or permission are
|
||||||
quoted in the respective theme files.
|
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.
|
||||||
|
|
||||||
|
|||||||
31
README.md
31
README.md
@@ -73,12 +73,19 @@ A Windows Appx package and certificate is available in the [wsltty.appx](https:/
|
|||||||
|
|
||||||
WSLtty can be invoked with
|
WSLtty can be invoked with
|
||||||
* installed Start Menu shortcuts (or Desktop shortcuts if copied there)
|
* 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)
|
* Explorer context menu (if installed from the Start Menu `WSLtty` subfolder)
|
||||||
|
|
||||||
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 ####
|
||||||
|
|
||||||
|
Due to some incompatible changes by Microsoft, wslbridge cannot connect
|
||||||
|
in WSL 2 mode at this time.
|
||||||
|
Workaround:
|
||||||
|
* `wsl --set-default-version 1`
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Configuration ###
|
### Configuration ###
|
||||||
@@ -99,6 +106,12 @@ One Desktop shortcut is installed:
|
|||||||
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.
|
||||||
|
|
||||||
|
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` ####
|
#### Command line scripts `wsl*.bat` ####
|
||||||
|
|
||||||
WSLtty installs the following scripts into `%LOCALAPPDATA%\Microsoft\WindowsApps`
|
WSLtty installs the following scripts into `%LOCALAPPDATA%\Microsoft\WindowsApps`
|
||||||
@@ -117,9 +130,23 @@ WSLtty provides context menu entries for all installed WSL distributions
|
|||||||
and one for the configured default distribution,
|
and one for the configured default distribution,
|
||||||
to start a respective WSL terminal in a specific folder from an Explorer window.
|
to start a respective WSL terminal in a specific folder from an Explorer window.
|
||||||
They are not installed by default.
|
They are not installed by default.
|
||||||
|
|
||||||
To add launch entries for the default or all WSL distributions to the
|
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
|
Explorer context menu, or remove them, run the respective script from the
|
||||||
Start Menu subfolder `WSLtty`.
|
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 ####
|
#### Mintty settings ####
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,27 @@
|
|||||||
#! /bin/sh
|
#! /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'}
|
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'}
|
configdir=${configdir:-'%APPDATA%\wsltty'}
|
||||||
|
|
||||||
PATH=/bin:"$PATH"
|
PATH=/bin:"$PATH":$SYSTEMROOT/System32
|
||||||
|
|
||||||
contextmenu=false
|
contextmenu=false
|
||||||
remove=false
|
remove=false
|
||||||
@@ -97,21 +115,45 @@ echo Creating %1.bat
|
|||||||
|
|
||||||
echo @echo off> %1.bat
|
echo @echo off> %1.bat
|
||||||
echo rem Start mintty terminal for WSL package %name% in current directory>> %1.bat
|
echo rem Start mintty terminal for WSL package %name% in current directory>> %1.bat
|
||||||
echo %target% -i "%icon%" %minttyargs% %bridgeargs%>> %1.bat
|
echo %target% -i "%icon%" %minttyargs% %bridgeargs% %%*>> %1.bat
|
||||||
/EOB
|
/EOB
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
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"
|
lxss="/HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Lxss"
|
||||||
schema="/HKEY_CURRENT_USER/Software/Classes/Local Settings/Software/Microsoft/Windows/CurrentVersion/AppModel/SystemAppData"
|
schema="/HKEY_CURRENT_USER/Software/Classes/Local Settings/Software/Microsoft/Windows/CurrentVersion/AppModel/SystemAppData"
|
||||||
|
|
||||||
#(regtool list "$lxss" 2>/dev/null && echo || echo "No WSL packages registered" >&2) |
|
appex () {
|
||||||
(
|
while read line
|
||||||
if $alldistros
|
do
|
||||||
then regtool list "$lxss" 2>/dev/null
|
case "$line" in
|
||||||
else true
|
*Application*Executable*)
|
||||||
fi && echo || echo "No WSL packages registered" >&2) |
|
for item in $line
|
||||||
while read guid
|
do case "$item" in
|
||||||
do
|
Executable=*)
|
||||||
|
eval $item
|
||||||
|
echo "$Executable"
|
||||||
|
break;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
break;;
|
||||||
|
esac
|
||||||
|
done < $*
|
||||||
|
}
|
||||||
|
|
||||||
|
config () {
|
||||||
|
guid="$1"
|
||||||
ok=false
|
ok=false
|
||||||
case $guid in
|
case $guid in
|
||||||
{*)
|
{*)
|
||||||
@@ -131,18 +173,29 @@ do
|
|||||||
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"`
|
instdir=`regtool get "$schema/$package/Schemas/PackageFullName"`
|
||||||
if [ -r "$ProgramW6432/WindowsApps/$instdir/images/icon.ico" ]
|
# 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"
|
then icon="%PROGRAMFILES%/WindowsApps/$instdir/images/icon.ico"
|
||||||
else icon="$installdir"'\wsl.ico'
|
else icon="$installdir"'\wsl.ico'
|
||||||
fi
|
fi
|
||||||
root="$basepath/rootfs"
|
root="$basepath/rootfs"
|
||||||
|
elif [ -f "$basepath/$distro.exe" ]
|
||||||
|
then
|
||||||
|
icon="$basepath/$distro.exe"
|
||||||
|
root="$basepath/rootfs"
|
||||||
else
|
else
|
||||||
icon="%LOCALAPPDATA%/lxss/bash.ico"
|
icon="%LOCALAPPDATA%/lxss/bash.ico"
|
||||||
root="$basepath"
|
root="$basepath"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
minttyargs='--wsl --rootfs="'"$root"'" --configdir="'"$configdir"'" -o Locale=C -o Charset=UTF-8 /bin/wslbridge '
|
#minttyargs='--wsl --rootfs="'"$root"'" --configdir="'"$configdir"'" -o Locale=C -o Charset=UTF-8 /bin/wslbridge '
|
||||||
minttyargs='--WSL="'"$distro"'" --configdir="'"$configdir"'"'
|
minttyargs='--WSL="'"$distro"'" --configdir="'"$configdir"'"'
|
||||||
|
MINTARGS='--WSL="'"$distro"'" --configdir="'"$CONFDIR"'"'
|
||||||
#if [ -z "$launch" ]
|
#if [ -z "$launch" ]
|
||||||
#then bridgeargs='-t /bin/bash'
|
#then bridgeargs='-t /bin/bash'
|
||||||
#else bridgeargs='-l "'"$launch"'" -t /bin/bash'
|
#else bridgeargs='-l "'"$launch"'" -t /bin/bash'
|
||||||
@@ -151,11 +204,12 @@ do
|
|||||||
bridgeargs='--distro-guid "'"$guid"'" -t'
|
bridgeargs='--distro-guid "'"$guid"'" -t'
|
||||||
|
|
||||||
ok=true;;
|
ok=true;;
|
||||||
"") # WSL default installation
|
DefaultDistribution|"") # WSL default installation
|
||||||
distro=
|
distro=
|
||||||
name=WSL
|
name=WSL
|
||||||
icon="$installdir"'\wsl.ico'
|
icon="$installdir"'\wsl.ico'
|
||||||
minttyargs='--WSL= --configdir="'"$configdir"'"'
|
minttyargs='--WSL= --configdir="'"$configdir"'"'
|
||||||
|
MINTARGS='--WSL= --configdir="'"$CONFDIR"'"'
|
||||||
bridgeargs='-t'
|
bridgeargs='-t'
|
||||||
|
|
||||||
ok=true;;
|
ok=true;;
|
||||||
@@ -166,29 +220,37 @@ do
|
|||||||
echoc "- (launcher $launcher)"
|
echoc "- (launcher $launcher)"
|
||||||
echoc "- icon $icon"
|
echoc "- icon $icon"
|
||||||
echoc "- root $root"
|
echoc "- root $root"
|
||||||
target="$installdir"'\bin\mintty.exe'
|
bridgeargs=" " # deprecated
|
||||||
bridgeargs=" "
|
|
||||||
|
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
|
if $ok && $config
|
||||||
then
|
then
|
||||||
export target minttyargs bridgeargs icon
|
export name target minttyargs bridgeargs icon
|
||||||
|
|
||||||
if $contextmenu
|
if $contextmenu
|
||||||
then
|
then
|
||||||
# context menu entries
|
# context menu entries
|
||||||
#cmd /C mkcontext "$name"
|
#cmd /C mkcontext "$name"
|
||||||
direckey='HKEY_CURRENT_USER\Software\Classes\Directory'
|
direckey='HKEY_CURRENT_USER\Software\Classes\Directory'
|
||||||
|
keyname="${name}_Terminal"
|
||||||
if $remove
|
if $remove
|
||||||
then
|
then
|
||||||
reg delete "$direckey\\shell\\$name" /f
|
reg delete "$direckey\\shell\\$keyname" /f
|
||||||
reg delete "$direckey\\Background\\shell\\$name" /f
|
reg delete "$direckey\\Background\\shell\\$keyname" /f
|
||||||
else
|
else
|
||||||
reg add "$direckey\\shell\\$name" /d "$name Terminal" /f
|
reg add "$direckey\\shell\\$keyname" /d "$name Terminal" /f
|
||||||
reg add "$direckey\\shell\\$name" /v Icon /d "$icon" /f
|
reg add "$direckey\\shell\\$keyname" /v Icon /d "$icon" /f
|
||||||
cmd /C reg add "$direckey\\shell\\$name\\command" /d "\"$target\" -i \"$icon\" --dir \"%1\" $minttyargs $bridgeargs" /f
|
cmd /C reg add "$direckey\\shell\\$keyname\\command" /d "\"$target\" -i \"$icon\" --dir \"%1\" $minttyargs $bridgeargs" /f
|
||||||
reg add "$direckey\\Background\\shell\\$name" /d "$name Terminal" /f
|
reg add "$direckey\\Background\\shell\\$keyname" /d "$name Terminal" /f
|
||||||
reg add "$direckey\\Background\\shell\\$name" /v Icon /d "$icon" /f
|
reg add "$direckey\\Background\\shell\\$keyname" /v Icon /d "$icon" /f
|
||||||
cmd /C reg add "$direckey\\Background\\shell\\$name\\command" /d "\"$target\" -i \"$icon\" $minttyargs $bridgeargs" /f
|
cmd /C reg add "$direckey\\Background\\shell\\$keyname\\command" /d "\"$target\" -i \"$icon\" $minttyargs $bridgeargs" /f
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
# invocation shortcuts and scripts
|
# invocation shortcuts and scripts
|
||||||
@@ -199,7 +261,8 @@ do
|
|||||||
cmd /C del "%LOCALAPPDATA%\\Microsoft\\WindowsApps\\$name~.bat"
|
cmd /C del "%LOCALAPPDATA%\\Microsoft\\WindowsApps\\$name~.bat"
|
||||||
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%
|
||||||
cmd /C copy "$name Terminal %.lnk" "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty"
|
cmd /C 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
|
||||||
@@ -210,14 +273,23 @@ do
|
|||||||
# prepare versions to target WSL home directory
|
# prepare versions to target WSL home directory
|
||||||
#bridgeargs="-C~ $bridgeargs"
|
#bridgeargs="-C~ $bridgeargs"
|
||||||
minttyargs="$minttyargs -~"
|
minttyargs="$minttyargs -~"
|
||||||
|
MINTARGS="$MINTARGS -~"
|
||||||
|
|
||||||
# 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%
|
||||||
cmd /C copy "$name Terminal.lnk" "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs"
|
cmd /C 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 cmd /C copy "$name Terminal.lnk" "%USERPROFILE%\\Desktop"
|
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
|
fi
|
||||||
|
|
||||||
# launch script in ~ -> WSLtty home, WindowsApps launch folder
|
# launch script in ~ -> WSLtty home, WindowsApps launch folder
|
||||||
@@ -228,4 +300,18 @@ do
|
|||||||
|
|
||||||
fi
|
fi
|
||||||
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
|
done
|
||||||
|
|
||||||
|
|||||||
31
install.bat
31
install.bat
@@ -26,11 +26,16 @@ copy "add to context menu.lnk" "%installdir%"
|
|||||||
copy "add default to context menu.lnk" "%installdir%"
|
copy "add default to context menu.lnk" "%installdir%"
|
||||||
copy "remove from context menu.lnk" "%installdir%"
|
copy "remove from context menu.lnk" "%installdir%"
|
||||||
copy "configure WSL shortcuts.lnk" "%installdir%"
|
copy "configure WSL shortcuts.lnk" "%installdir%"
|
||||||
copy "WSL Terminal.lnk" "%installdir%"
|
rem copy "WSL Terminal.lnk" "%installdir%"
|
||||||
copy "WSL Terminal %%.lnk" "%installdir%"
|
rem copy "WSL Terminal %%.lnk" "%installdir%"
|
||||||
copy wsl.ico "%installdir%"
|
|
||||||
copy config-distros.sh "%installdir%"
|
copy config-distros.sh "%installdir%"
|
||||||
copy mkshortcut.vbs "%installdir%"
|
|
||||||
|
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
|
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
|
||||||
@@ -54,15 +59,23 @@ copy dash.exe "%installdir%\bin"
|
|||||||
copy regtool.exe "%installdir%\bin"
|
copy regtool.exe "%installdir%\bin"
|
||||||
copy zoo.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
|
rem create system config directory and copy config archive
|
||||||
mkdir "%installdir%\usr\share\mintty\lang"
|
mkdir "%installdir%\usr\share\mintty\lang"
|
||||||
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"
|
||||||
copy themes.zoo "%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"
|
mkdir "%installdir%\usr\share\mintty\info"
|
||||||
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"
|
||||||
copy wsl.ico "%installdir%\usr\share\mintty\icon"
|
copy tux.ico "%installdir%\usr\share\mintty\icon"
|
||||||
|
copy mintty.ico "%installdir%\usr\share\mintty\icon"
|
||||||
|
|
||||||
|
|
||||||
rem create Start Menu Folder
|
rem create Start Menu Folder
|
||||||
@@ -77,8 +90,8 @@ copy "add to context menu.lnk" "%smf%"
|
|||||||
copy "add default to context menu.lnk" "%smf%"
|
copy "add default to context menu.lnk" "%smf%"
|
||||||
copy "remove from context menu.lnk" "%smf%"
|
copy "remove from context menu.lnk" "%smf%"
|
||||||
copy "configure WSL shortcuts.lnk" "%smf%"
|
copy "configure WSL shortcuts.lnk" "%smf%"
|
||||||
copy "WSL Terminal.lnk" "%smf%"
|
rem copy "WSL Terminal.lnk" "%smf%"
|
||||||
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"
|
||||||
|
|
||||||
@@ -87,6 +100,8 @@ cd /D "%installdir%\usr\share\mintty\lang"
|
|||||||
"%installdir%\bin\zoo" xO lang
|
"%installdir%\bin\zoo" xO lang
|
||||||
cd /D "%installdir%\usr\share\mintty\themes"
|
cd /D "%installdir%\usr\share\mintty\themes"
|
||||||
"%installdir%\bin\zoo" xO themes
|
"%installdir%\bin\zoo" xO themes
|
||||||
|
cd /D "%installdir%\usr\share\mintty\sounds"
|
||||||
|
"%installdir%\bin\zoo" xO sounds
|
||||||
|
|
||||||
|
|
||||||
:migrate configuration
|
:migrate configuration
|
||||||
@@ -109,8 +124,8 @@ rmdir "%oldroot%\home"
|
|||||||
|
|
||||||
rem create user config directory and subfolders
|
rem create user config directory and subfolders
|
||||||
mkdir "%configdir%\lang"
|
mkdir "%configdir%\lang"
|
||||||
mkdir "%configdir%\sounds"
|
|
||||||
mkdir "%configdir%\themes"
|
mkdir "%configdir%\themes"
|
||||||
|
mkdir "%configdir%\sounds"
|
||||||
|
|
||||||
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"
|
||||||
|
|||||||
61
makefile
61
makefile
@@ -8,14 +8,18 @@
|
|||||||
|
|
||||||
|
|
||||||
# wsltty release
|
# wsltty release
|
||||||
ver=1.9.2
|
ver=3.0.2.3
|
||||||
|
|
||||||
# wsltty appx release
|
# wsltty appx release - must have 4 parts!
|
||||||
verx=0.9.2
|
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
|
# mintty release version
|
||||||
minttyver=2.9.2
|
minttyver=3.0.2
|
||||||
|
|
||||||
# or mintty branch or commit version
|
# or mintty branch or commit version
|
||||||
#minttyver=master
|
#minttyver=master
|
||||||
@@ -90,6 +94,19 @@ check:
|
|||||||
# 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
|
||||||
|
|
||||||
|
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
|
# generation
|
||||||
|
|
||||||
@@ -104,18 +121,26 @@ wslbridge-package:
|
|||||||
|
|
||||||
wslbridge-source: wslbridge-$(wslbridge-commit).zip
|
wslbridge-source: wslbridge-$(wslbridge-commit).zip
|
||||||
unzip -o 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
|
tr -d '\015' < wslbridge-$(wslbridge-commit)/LICENSE.txt > LICENSE.wslbridge
|
||||||
|
|
||||||
wslbridge-$(wslbridge-commit).zip:
|
wslbridge-$(wslbridge-commit).zip:
|
||||||
$(wgeto) https://github.com/rprichard/wslbridge/archive/$(wslbridge-commit).zip -o wslbridge-$(wslbridge-commit).zip
|
$(wgeto) https://github.com/rprichard/wslbridge/archive/$(wslbridge-commit).zip -o wslbridge-$(wslbridge-commit).zip
|
||||||
|
|
||||||
wslbridge-frontend: wslbridge-source
|
wslbridge-frontend: wslbridge-source
|
||||||
|
echo ------------- Compiling wslbridge frontend
|
||||||
cd wslbridge-$(wslbridge-commit)/frontend; make
|
cd wslbridge-$(wslbridge-commit)/frontend; make
|
||||||
strip wslbridge-$(wslbridge-commit)/out/wslbridge.exe
|
strip wslbridge-$(wslbridge-commit)/out/wslbridge.exe
|
||||||
mkdir -p bin
|
mkdir -p bin
|
||||||
cp wslbridge-$(wslbridge-commit)/out/wslbridge.exe bin/
|
cp wslbridge-$(wslbridge-commit)/out/wslbridge.exe bin/
|
||||||
|
|
||||||
wslbridge-backend: wslbridge-source
|
#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
|
cd wslbridge-$(wslbridge-commit)/backend; if uname -m | grep x86_64; then cmd /C wsl make; else wslbridge make; fi
|
||||||
mkdir -p bin
|
mkdir -p bin
|
||||||
cp wslbridge-$(wslbridge-commit)/out/wslbridge-backend bin/
|
cp wslbridge-$(wslbridge-commit)/out/wslbridge-backend bin/
|
||||||
@@ -123,6 +148,7 @@ wslbridge-backend: wslbridge-source
|
|||||||
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
|
||||||
unzip -o mintty-$(minttyver).zip
|
unzip -o mintty-$(minttyver).zip
|
||||||
|
cp mintty-$(minttyver)/icon/terminal.ico mintty.ico
|
||||||
|
|
||||||
wslbuild=LDFLAGS="-static -static-libgcc -s"
|
wslbuild=LDFLAGS="-static -static-libgcc -s"
|
||||||
appxbuild=$(wslbuild) CCOPT=-DWSLTTY_APPX
|
appxbuild=$(wslbuild) CCOPT=-DWSLTTY_APPX
|
||||||
@@ -136,6 +162,7 @@ mintty-build:
|
|||||||
cd mintty-$(minttyver)/src; make $(wslbuild) $(wslversion)
|
cd mintty-$(minttyver)/src; make $(wslbuild) $(wslversion)
|
||||||
mkdir -p bin
|
mkdir -p bin
|
||||||
cp mintty-$(minttyver)/bin/mintty.exe bin/
|
cp mintty-$(minttyver)/bin/mintty.exe bin/
|
||||||
|
strip bin/mintty.exe
|
||||||
|
|
||||||
mintty-build-appx:
|
mintty-build-appx:
|
||||||
# ensure rebuild of version-specific check and message
|
# ensure rebuild of version-specific check and message
|
||||||
@@ -144,25 +171,29 @@ mintty-build-appx:
|
|||||||
cd mintty-$(minttyver)/src; make $(appxbuild) $(appxversion)
|
cd mintty-$(minttyver)/src; make $(appxbuild) $(appxversion)
|
||||||
mkdir -p bin
|
mkdir -p bin
|
||||||
cp mintty-$(minttyver)/bin/mintty.exe bin/
|
cp mintty-$(minttyver)/bin/mintty.exe bin/
|
||||||
|
strip bin/mintty.exe
|
||||||
|
|
||||||
mintty-pkg:
|
mintty-pkg:
|
||||||
cp mintty-$(minttyver)/LICENSE LICENSE.mintty
|
cp mintty-$(minttyver)/LICENSE LICENSE.mintty
|
||||||
cd mintty-$(minttyver)/lang; zoo a lang *.po; mv lang.zoo ../../
|
cd mintty-$(minttyver)/lang; zoo a lang *.po; mv lang.zoo ../../
|
||||||
cd mintty-$(minttyver)/themes; zoo a themes *[!~]; mv themes.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"
|
# add charnames.txt to support "Character Info"
|
||||||
cd mintty-$(minttyver)/src; sh ./mknames
|
cd mintty-$(minttyver)/src; sh ./mknames
|
||||||
cp mintty-$(minttyver)/src/charnames.txt .
|
cp mintty-$(minttyver)/src/charnames.txt .
|
||||||
|
|
||||||
mintty-appx:
|
mintty-appx:
|
||||||
mkdir -p usr/share/mintty
|
mkdir -p usr/share/mintty
|
||||||
cd usr/share/mintty; mkdir -p lang themes info
|
cd usr/share/mintty; mkdir -p lang themes sounds info
|
||||||
cp mintty-$(minttyver)/lang/*.po usr/share/mintty/lang/
|
cp mintty-$(minttyver)/lang/*.po usr/share/mintty/lang/
|
||||||
cp mintty-$(minttyver)/themes/*[!~] usr/share/mintty/themes/
|
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"
|
# add charnames.txt to support "Character Info"
|
||||||
cd mintty-$(minttyver)/src; sh ./mknames
|
cd mintty-$(minttyver)/src; sh ./mknames
|
||||||
cp mintty-$(minttyver)/src/charnames.txt usr/share/mintty/info/
|
cp mintty-$(minttyver)/src/charnames.txt usr/share/mintty/info/
|
||||||
|
|
||||||
cygwin:
|
cygwin: mkshortcutexe
|
||||||
mkdir -p bin
|
mkdir -p 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/
|
||||||
@@ -170,6 +201,15 @@ cygwin:
|
|||||||
cp /bin/regtool.exe bin/
|
cp /bin/regtool.exe bin/
|
||||||
cp /bin/zoo.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:
|
appx-bin:
|
||||||
mkdir -p bin
|
mkdir -p bin
|
||||||
cp /bin/cygwin1.dll bin/
|
cp /bin/cygwin1.dll bin/
|
||||||
@@ -187,9 +227,14 @@ cop: ver
|
|||||||
cp bin/zoo.exe rel/
|
cp bin/zoo.exe rel/
|
||||||
cp lang.zoo rel/
|
cp lang.zoo rel/
|
||||||
cp themes.zoo rel/
|
cp themes.zoo rel/
|
||||||
|
cp sounds.zoo rel/
|
||||||
cp charnames.txt rel/
|
cp charnames.txt rel/
|
||||||
cp bin/wslbridge.exe rel/
|
cp bin/wslbridge.exe rel/
|
||||||
cp bin/wslbridge-backend 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 LICENSE.* rel/
|
||||||
cp VERSION rel/
|
cp VERSION rel/
|
||||||
cp *.lnk rel/
|
cp *.lnk rel/
|
||||||
@@ -224,7 +269,7 @@ pkg: wslbridge cygwin mintty-get mintty-build mintty-pkg cab
|
|||||||
wsltty-appx: wslbridge appx-bin mintty-get mintty-build-appx mintty-appx
|
wsltty-appx: wslbridge appx-bin mintty-get mintty-build-appx mintty-appx
|
||||||
|
|
||||||
# appx package target:
|
# appx package target:
|
||||||
appx: wsltty-appx
|
appx: wsltty-appx fix-verx
|
||||||
sh ./build.sh
|
sh ./build.sh
|
||||||
|
|
||||||
#############################################################################
|
#############################################################################
|
||||||
|
|||||||
16
makewinx.cfg
16
makewinx.cfg
@@ -25,7 +25,7 @@ SourceFiles=SourceFiles
|
|||||||
[Strings]
|
[Strings]
|
||||||
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 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%-install.exe
|
||||||
FriendlyName=wsltty
|
FriendlyName=wsltty
|
||||||
AppLaunched=cmd.exe /c install.bat
|
AppLaunched=cmd.exe /c install.bat
|
||||||
@@ -47,7 +47,7 @@ FILE11="dash.exe"
|
|||||||
FILE12="regtool.exe"
|
FILE12="regtool.exe"
|
||||||
FILE13="install.bat"
|
FILE13="install.bat"
|
||||||
FILE14="uninstall.bat"
|
FILE14="uninstall.bat"
|
||||||
FILE15="wsl.ico"
|
FILE15="tux.ico"
|
||||||
FILE16="add to context menu.lnk"
|
FILE16="add to context menu.lnk"
|
||||||
FILE17="add default to context menu.lnk"
|
FILE17="add default to context menu.lnk"
|
||||||
FILE18="remove from context menu.lnk"
|
FILE18="remove from context menu.lnk"
|
||||||
@@ -55,9 +55,12 @@ FILE19="wsltty home & help.url"
|
|||||||
FILE20="zoo.exe"
|
FILE20="zoo.exe"
|
||||||
FILE21="lang.zoo"
|
FILE21="lang.zoo"
|
||||||
FILE22="themes.zoo"
|
FILE22="themes.zoo"
|
||||||
FILE23="WSL Terminal %.lnk"
|
FILE23="sounds.zoo"
|
||||||
FILE24="WSL Terminal.lnk"
|
FILE24="mintty.ico"
|
||||||
FILE25="mkshortcut.vbs"
|
FILE25="mkshortcut.exe"
|
||||||
|
FILE26="cygpopt-0.dll"
|
||||||
|
FILE27="cygiconv-2.dll"
|
||||||
|
FILE28="cygintl-8.dll"
|
||||||
|
|
||||||
[SourceFiles]
|
[SourceFiles]
|
||||||
SourceFiles0=.
|
SourceFiles0=.
|
||||||
@@ -89,4 +92,7 @@ SourceFiles0=.
|
|||||||
%FILE23%=
|
%FILE23%=
|
||||||
%FILE24%=
|
%FILE24%=
|
||||||
%FILE25%=
|
%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,4 +1,4 @@
|
|||||||
rem cscript mkshortcut.vbs [/param:arg] /target:link
|
rem cscript mkshortcut.vbs [/param:arg] /target:link
|
||||||
|
|
||||||
rem /target:%LOCALAPPDATA%\wsltty\bin\mintty.exe
|
rem /target:%LOCALAPPDATA%\wsltty\bin\mintty.exe
|
||||||
rem /workingdir:%USERPROFILE%
|
rem /workingdir:%USERPROFILE%
|
||||||
@@ -24,7 +24,7 @@ rem lnk.Arguments = Wscript.Arguments.Named("arguments")
|
|||||||
lnk.TargetPath = wshell.ExpandEnvironmentStrings("%target%")
|
lnk.TargetPath = wshell.ExpandEnvironmentStrings("%target%")
|
||||||
minttyargs = wshell.ExpandEnvironmentStrings("%minttyargs%")
|
minttyargs = wshell.ExpandEnvironmentStrings("%minttyargs%")
|
||||||
bridgeargs = wshell.ExpandEnvironmentStrings("%bridgeargs%")
|
bridgeargs = wshell.ExpandEnvironmentStrings("%bridgeargs%")
|
||||||
lnk.Arguments = minttyargs & bridgeargs
|
lnk.Arguments = minttyargs & " " & bridgeargs
|
||||||
rem wscript.echo "minttyargs: " & minttyargs
|
rem wscript.echo "minttyargs: " & minttyargs
|
||||||
rem wscript.echo lnk.Arguments
|
rem wscript.echo lnk.Arguments
|
||||||
|
|
||||||
@@ -46,6 +46,7 @@ rem Shorcut key:
|
|||||||
rem lnk.HotKey = "ALT+CTRL+W"
|
rem lnk.HotKey = "ALT+CTRL+W"
|
||||||
|
|
||||||
rem Run:
|
rem Run:
|
||||||
|
rem 1: Normal 7: Minimized 3: Maximized
|
||||||
rem lnk.WindowStyle = 1
|
rem lnk.WindowStyle = 1
|
||||||
|
|
||||||
rem Comment:
|
rem Comment:
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 472 KiB After Width: | Height: | Size: 472 KiB |
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
|
||||||
Reference in New Issue
Block a user