summaryrefslogtreecommitdiff
path: root/Build
diff options
context:
space:
mode:
authorPiotr Strzelczyk <piotr@eps.gda.pl>2010-03-13 01:35:26 +0000
committerPiotr Strzelczyk <piotr@eps.gda.pl>2010-03-13 01:35:26 +0000
commit6c39d50dea7ac3be2a0db39c07a005099ea1b0c4 (patch)
tree4aeeba82ae176c142ce2d08c4b44e9a50c15a0d5 /Build
parenta88ba16f2cfdb3de47c4bda4afdca4971e2d2ba1 (diff)
2010/03/13 - added 'readme.txt' and changelog
- added support and docs for calling user added scripts; (use path of 'runscript.dll' instead of .exe stub to locate 'runscript.tlu' script) - limit search for shell_escape_commands to system trees - added function for creating directory hierarchy - fixed directory creation for dviout & texworks aliases - fixed arg[0] of repstopdf & rpdfcrop git-svn-id: svn://tug.org/texlive/trunk@17448 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build')
-rw-r--r--Build/source/texk/texlive/w32_wrapper/readme.txt156
-rw-r--r--Build/source/texk/texlive/w32_wrapper/runscript.tlu286
-rw-r--r--Build/source/texk/texlive/w32_wrapper/runscript_dll.c56
-rw-r--r--Build/source/texk/texlive/w32_wrapper/runscript_exe.c10
-rw-r--r--Build/source/texk/texlive/w32_wrapper/wrunscript.c104
-rw-r--r--Build/source/texk/texlive/w32_wrapper/wrunscript_exe.c10
6 files changed, 402 insertions, 220 deletions
diff --git a/Build/source/texk/texlive/w32_wrapper/readme.txt b/Build/source/texk/texlive/w32_wrapper/readme.txt
new file mode 100644
index 00000000000..4229867d09a
--- /dev/null
+++ b/Build/source/texk/texlive/w32_wrapper/readme.txt
@@ -0,0 +1,156 @@
+
+--[===================================================================[--
+
+ Script and program wrappers in TeX Live for Windows
+
+ License
+
+ Public Domain
+
+ Originally written in 2009 by Tomasz M. Trzeciak.
+
+ Prior work:
+ 'tl-w32-wrapper.texlua' by Reinhard Kotucha and Norbert Preining.
+ 'tl-w32-wrapper.cmd' by Tomasz M. Trzeciak.
+
+ Rationale
+
+ Wrappers enable to use scripts on Windows as regular programs.
+ They are also required for some binary programs to set-up the
+ right environment for them.
+
+ Batch scripts can be used for wrapping but they are not as universal
+ as binaries (there are some odd cases where they don't work) and
+ it is hard to make them robust and secure. Compiled binary wrappers
+ don't suffer from these problems but they are harder to write, debug
+ and maintain in comparison to scripts. For these reasons a hybrid
+ approach was adopted that offers the best of both worlds - a binary
+ stub combined with a launcher script.
+
+ Source files
+
+ runscript.tlu launcher script for locating and dispatching
+ target scripts/programs
+ runscript_dll.c common DLL part of the binary stubs; locates and
+ calls the launcher script
+ runscript_exe.c EXE proxy to the common DLL for CLI mode stubs
+ wrunscript_exe.c EXE proxy to the common DLL for GUI mode stubs
+
+ Compilation of binaries (requires luatex.dll in the same directory)
+
+ with gcc (size optimized):
+
+ gcc -Os -s -shared -o runscript.dll runscript_dll.c -L./ -lluatex
+ gcc -Os -s -o runscript.exe runscript_exe.c -L./ -lrunscript
+ gcc -mwindows -Os -s -o wrunscript.exe wrunscript_exe.c -L./ -lrunscript
+
+ with tcc (extra small size):
+
+ tiny_impdef luatex.dll
+ tcc -shared -o runscript.dll runscript_dll.c luatex.def
+ tcc -o runscript.exe runscript_exe.c runscript.def
+ tcc -o wrunscript.exe wrunscript_exe.c runscript.def
+
+ Structure of the wrapper
+
+ Wrappers consist of small binary stubs and a common texlua script.
+ The binary stubs are all the same, just different names (but CLI
+ and GUI stubs differ, see below, and GUI stubs are actually all
+ different due to different embedded icons).
+
+ The job of the binary stub is twofold: (a) call the texlua launcher
+ script 'runscript.tlu' from the same directory (or more precisely
+ from the directory containing 'runscript.dll') and (b) pass to it
+ argv[0] and the unparsed argument string as the last two arguments
+ (after adding a sentinel argument, which ends with a new line
+ character). Arbitrary C strings can be passed, because the script
+ is executed by linking with luatex.dll and calling its lua
+ interpreter directly rather than by spawning a new process.
+
+ There are two flavours of the binary stub: one for CLI programs
+ and another one for GUI programs. The GUI variant does not open
+ a console window nor does it block the command promt if started
+ from there. It also uses a dialog box to display an error message
+ in addition to outputting to stderr.
+
+ The stubs are further split into a common DLL and EXE proxies
+ to it. This is for maintenance reasons - updates can be done by
+ replacement of a single DLL rather than all binary stubs.
+
+ The launcher script knows, which variant has been used to invoke it
+ based on the sentinel argument. The lack of this argument means
+ that it was invoked in a standard way, i.e. through texlua.exe.
+
+ All the hard work of locating a script/program to execute happens
+ in the launcher script. The located script/program is always
+ executed directly by spawning its interpreter (or binary) in a new
+ process. The system shell (cmd.exe) is never called (except for
+ batch scripts, of course). If the located script happens to be
+ a (tex)lua script, it is loaded and called directly from within
+ this script, i.e. no new process is spawned.
+
+ Adding wrappers for user scripts
+
+ The script wrapping machinery is not limited to scripts included in
+ TeX Live. You can also use it for script programs from manually
+ installed packages, which should minimize the problems when using
+ them with TeX Live.
+
+ First, make sure that there is an interpreter program available on
+ your system for the script you want to use. Interpreters for Perl
+ and Lua are bundled with TeX Live, all others have to be installed
+ independently. The following script types and their file extensions
+ are currently supported and searched in that order:
+
+ Lua (.tlu;.texlua;.lua) -- included
+ Perl (.pl) -- included
+ Ruby (.rb) -- requires installation
+ Python (.py) -- requires installation
+ Java (.jar) -- requires installation
+ VBScript (.vbs) -- part of Windows
+ Jscript (.js) -- part of Windows
+ Batch (.bat;.cmd) -- part of Windows
+
+ For Unix-style extensionless scripts their first line starting with
+ she-bang (#!) is consulted for the interpreter program to run. This
+ program must be present on the search path.
+
+ Next, the script program needs to be installed somewhere below the
+ 'scripts' directory under one of the TEXMF trees (consult the
+ documentation or texmf/web2c/texmf.cnf file for a list). You may
+ need to update the file search database afterwards with:
+
+ mktexlsr [TEXMFDIR]
+
+ Test if the script can be located with:
+
+ kpsewhich --format=texmfscripts <script-name>.<ext>
+
+ Once installed the script can be called immediately with:
+
+ runscript <script-name> [script arguments]
+
+ If you prefer to call the script program simply by its name, copy
+ and rename bin/win32/runscript.exe to <script-name>.exe and put it
+ in bin/win32/ directory of your TeX Live installation or, if you
+ don't have the write permissions there, somewhere else on the search
+ path.
+
+ Changelog:
+
+ 2009/12/04 - initial version
+ 2009/12/15 - minor fixes for path & extension list parsing
+ 2010/01/09 - add support for GUI mode stubs
+ 2010/02/28 - enable GUI mode stubs for dviout, psv and texworks;
+ - added generic handling of sys programs
+ - added restricted repstopdf to alias_table
+ 2010/03/13 - added 'readme.txt' and changelog
+ - added support and docs for calling user added scripts;
+ (use path of 'runscript.dll' instead of .exe stub to
+ locate 'runscript.tlu' script)
+ - limit search for shell_escape_commands to system trees
+ - added function for creating directory hierarchy
+ - fixed directory creation for dviout & texworks aliases
+ - fixed arg[0] of repstopdf & rpdfcrop
+
+--]===================================================================]--
diff --git a/Build/source/texk/texlive/w32_wrapper/runscript.tlu b/Build/source/texk/texlive/w32_wrapper/runscript.tlu
index 3071caf9608..112a256d1d4 100644
--- a/Build/source/texk/texlive/w32_wrapper/runscript.tlu
+++ b/Build/source/texk/texlive/w32_wrapper/runscript.tlu
@@ -1,71 +1,161 @@
+
+--[===================================================================[--
+
+ Script and program wrappers in TeX Live for Windows
+
+ License
+
+ Public Domain
+
+ Originally written in 2009 by Tomasz M. Trzeciak.
+
+ Prior work:
+ 'tl-w32-wrapper.texlua' by Reinhard Kotucha and Norbert Preining.
+ 'tl-w32-wrapper.cmd' by Tomasz M. Trzeciak.
+
+ Rationale
+
+ Wrappers enable to use scripts on Windows as regular programs.
+ They are also required for some binary programs to set-up the
+ right environment for them.
+
+ Batch scripts can be used for wrapping but they are not as universal
+ as binaries (there are some odd cases where they don't work) and
+ it is hard to make them robust and secure. Compiled binary wrappers
+ don't suffer from these problems but they are harder to write, debug
+ and maintain in comparison to scripts. For these reasons a hybrid
+ approach was adopted that offers the best of both worlds - a binary
+ stub combined with a launcher script.
+
+ Source files
+
+ runscript.tlu launcher script for locating and dispatching
+ target scripts/programs
+ runscript_dll.c common DLL part of the binary stubs; locates and
+ calls the launcher script
+ runscript_exe.c EXE proxy to the common DLL for CLI mode stubs
+ wrunscript_exe.c EXE proxy to the common DLL for GUI mode stubs
+
+ Compilation of binaries (requires luatex.dll in the same directory)
+
+ with gcc (size optimized):
+
+ gcc -Os -s -shared -o runscript.dll runscript_dll.c -L./ -lluatex
+ gcc -Os -s -o runscript.exe runscript_exe.c -L./ -lrunscript
+ gcc -mwindows -Os -s -o wrunscript.exe wrunscript_exe.c -L./ -lrunscript
+
+ with tcc (extra small size):
+
+ tiny_impdef luatex.dll
+ tcc -shared -o runscript.dll runscript_dll.c luatex.def
+ tcc -o runscript.exe runscript_exe.c runscript.def
+ tcc -o wrunscript.exe wrunscript_exe.c runscript.def
+
+ Structure of the wrapper
+
+ Wrappers consist of small binary stubs and a common texlua script.
+ The binary stubs are all the same, just different names (but CLI
+ and GUI stubs differ, see below, and GUI stubs are actually all
+ different due to different embedded icons).
+
+ The job of the binary stub is twofold: (a) call the texlua launcher
+ script 'runscript.tlu' from the same directory (or more precisely
+ from the directory containing 'runscript.dll') and (b) pass to it
+ argv[0] and the unparsed argument string as the last two arguments
+ (after adding a sentinel argument, which ends with a new line
+ character). Arbitrary C strings can be passed, because the script
+ is executed by linking with luatex.dll and calling its lua
+ interpreter directly rather than by spawning a new process.
+
+ There are two flavours of the binary stub: one for CLI programs
+ and another one for GUI programs. The GUI variant does not open
+ a console window nor does it block the command promt if started
+ from there. It also uses a dialog box to display an error message
+ in addition to outputting to stderr.
+
+ The stubs are further split into a common DLL and EXE proxies
+ to it. This is for maintenance reasons - updates can be done by
+ replacement of a single DLL rather than all binary stubs.
+
+ The launcher script knows, which variant has been used to invoke it
+ based on the sentinel argument. The lack of this argument means
+ that it was invoked in a standard way, i.e. through texlua.exe.
+
+ All the hard work of locating a script/program to execute happens
+ in the launcher script. The located script/program is always
+ executed directly by spawning its interpreter (or binary) in a new
+ process. The system shell (cmd.exe) is never called (except for
+ batch scripts, of course). If the located script happens to be
+ a (tex)lua script, it is loaded and called directly from within
+ this script, i.e. no new process is spawned.
+
+ Adding wrappers for user scripts
+
+ The script wrapping machinery is not limited to scripts included in
+ TeX Live. You can also use it for script programs from manually
+ installed packages, which should minimize the problems when using
+ them with TeX Live.
+
+ First, make sure that there is an interpreter program available on
+ your system for the script you want to use. Interpreters for Perl
+ and Lua are bundled with TeX Live, all others have to be installed
+ independently. The following script types and their file extensions
+ are currently supported and searched in that order:
+
+ Lua (.tlu;.texlua;.lua) -- included
+ Perl (.pl) -- included
+ Ruby (.rb) -- requires installation
+ Python (.py) -- requires installation
+ Java (.jar) -- requires installation
+ VBScript (.vbs) -- part of Windows
+ Jscript (.js) -- part of Windows
+ Batch (.bat;.cmd) -- part of Windows
+
+ For Unix-style extensionless scripts their first line starting with
+ she-bang (#!) is consulted for the interpreter program to run. This
+ program must be present on the search path.
+
+ Next, the script program needs to be installed somewhere below the
+ 'scripts' directory under one of the TEXMF trees (consult the
+ documentation or texmf/web2c/texmf.cnf file for a list). You may
+ need to update the file search database afterwards with:
+
+ mktexlsr [TEXMFDIR]
+
+ Test if the script can be located with:
+
+ kpsewhich --format=texmfscripts <script-name>.<ext>
+
+ Once installed the script can be called immediately with:
+
+ runscript <script-name> [script arguments]
+
+ If you prefer to call the script program simply by its name, copy
+ and rename bin/win32/runscript.exe to <script-name>.exe and put it
+ in bin/win32/ directory of your TeX Live installation or, if you
+ don't have the write permissions there, somewhere else on the search
+ path.
+
+ Changelog:
+
+ 2009/12/04 - initial version
+ 2009/12/15 - minor fixes for path & extension list parsing
+ 2010/01/09 - add support for GUI mode stubs
+ 2010/02/28 - enable GUI mode stubs for dviout, psv and texworks;
+ - added generic handling of sys programs
+ - added restricted repstopdf to alias_table
+ 2010/03/13 - added 'readme.txt' and changelog
+ - added support and docs for calling user added scripts;
+ (use path of 'runscript.dll' instead of .exe stub to
+ locate 'runscript.tlu' script)
+ - limit search for shell_escape_commands to system trees
+ - added function for creating directory hierarchy
+ - fixed directory creation for dviout & texworks aliases
+ - fixed arg[0] of repstopdf & rpdfcrop
+
+--]===================================================================]--
---[===================================================================[--
-
-
- Script and program wrappers in TeX Live on Windows
-
- License
-
- Public Domain
-
- Originally written 2009 by Tomasz M. Trzeciak.
-
- Prior work:
- 'tl-w32-wrapper.texlua' by Reinhard Kotucha and Norbert Preining.
- 'tl-w32-wrapper.cmd' by Tomasz M. Trzeciak.
-
- Rationale
-
- Wrappers enable to use scripts on Windows as regular programs.
- They are also required for some binary programs to set-up the
- right environment for them.
-
- Batch scripts can be used for wrapping but they are not as universal
- as binaries (there are some odd cases where they don't work) and
- it is hard to make them robust and secure. Compiled binary wrappers
- don't suffer from these problems but they are harder to write, debug
- and maintain in comparison to scripts. For these reasons a hybrid
- approach was adopted that offers the best of both worlds - a binary
- stub combined with a wrapper script.
-
- Structure of the wrapper
-
- Wrappers consist of small binary stubs and a common texlua script.
- The binary stubs are all the same, just different names (but CLI
- and GUI stubs differ, see below, and GUI wrappers are actually all
- different due to different embedded icons).
-
- The job of the binary stub is twofold: (a) call the texlua wrapper
- script 'runscript.tlu' from the same directory and (b) pass to it
- argv[0] and the unparsed argument string as the last two arguments
- (after adding a sentinel argument, which ends with a new line
- character). Arbitrary C strings can be passed, because the script
- is executed by linking with luatex.dll and calling its lua
- interpreter directly rather than by spawning a new process.
-
- There are two flavours of the binary stub: one for CLI programs
- and another one for GUI programs. The GUI variant does not open
- a console window nor does it block the command promt if started
- from there. It also uses a dialog box to display an error message
- in addition to outputting to stderr.
-
- The stubs are further split into a common DLL and EXE proxies
- to it. This is for maintenance reasons - upgrades can be done by
- replacement of a single DLL rather than all binary stubs.
-
- The wrapper script knows, which variant has been used to invoke it
- based on the sentinel argument. The lack of this argument means
- that it was invoked in a standard way, i.e. through texlua.exe.
-
- All the hard work of locating a script/program to execute happens
- in this wrapper script. Once located, the script or program is
- always executed directly by spawning its interpreter (or binary) in
- a new process. The system shell (cmd.exe) is never called (except
- for batch scripts, of course). If the located script happens to be
- a (tex)lua script, it is loaded and called directly from within
- this script, i.e. no new process is spawned.
-
---]===================================================================]--
+-- HELPER SUBROUTINES --
-- quotes string with spaces
local function _q(str)
@@ -134,7 +224,7 @@ local function shebang_to_argv(progfullname)
return argv
end
--- checks if command exist on the path and return it
+-- checks if command exist on the path and returns it
local function check_command(cmd, PATH)
local cmdext = cmd..(string.find(cmd, '%.[^\\/.]*$') and '' or '.exe')
local fullcmd = is_abs_path(cmdext) and lfs.isfile(cmdext) and
@@ -146,7 +236,22 @@ local function check_command(cmd, PATH)
end
end
---#####################################################################--
+-- creates directory or directory hierarchy
+local function mkdir_plus(dir)
+ if lfs.mkdir(dir) then
+ return true
+ end
+ -- try with system's mkdir in case we need to create intermediate dirs too
+ local ret = os.spawn({[0]=search_path("cmd.exe"),
+ string.format('cmd.exe /x /c mkdir "%s"', dir)})
+ if ret == 0 then
+ return true
+ else
+ return nil, "cannot create directory: " .. dir
+ end
+end
+
+-- MAIN CHUNK --
-- localize the assert function (it will be replaced in gui mode)
local assert = assert
@@ -175,16 +280,25 @@ if arg[#arg-2] and ( string.sub(arg[#arg-2], -1) == '\n' ) then
error(error_msg, 2)
end
end
-elseif (string.lower(string.match(arg[0], '[^\\/]+$')) == 'runscript.tlu') then
- -- we are called directly as: texlua runscript.tlu progname ...
- arg[0] = arg[1]
- table.remove(arg, 1)
+else
+ -- we must be called as: texlua runscript.tlu progname ...
+ -- this is treated the same as: runscript[.exe] progname ...
+ -- we don't have the unparsed arument line in this case, so construct one
for k = 1, #arg do argline = argline..' '.._q(arg[k]) end
end
+-- ( lower arg[0] : get file name part : remove extension ) == 'runscript'
+if (string.lower(arg[0]):match('[^\\/]+$'):gsub('%.[^.]*$', '') == 'runscript') then
+ -- we are called as: runscript progname ...
+ -- remove the first argument from the arg table and from the argline string
+ -- (this argument should have no embedded spaces!)
+ arg[0] = table.remove(arg, 1)
+ assert(arg[0], "not enough arguments!\nusage: runscript program-name [arguments]")
+ argline = string.gsub(argline, '^%S+%s*', '')
+end
+
-- program name
--- arg[0] : get file name part : remove extension : remove -sys suffix
-local progname, k = (arg[0]):match('[^\\/]+$'):gsub('%.[^.]*$', ''):gsub('%-sys$', '')
+local progname, k = string.lower(arg[0]):match('[^\\/]+$'):gsub('%.[^.]*$', ''):gsub('%-sys$', '')
local sysprog = (k > 0) -- sys type program/script (there was -sys suffix removed)
if (progname == 'runscript') then -- prevent recursive calls to this script
assert(nil, "oops! wrapping the wrapper?")
@@ -224,6 +338,13 @@ if sysprog then
os.setenv('TEXMFVAR', kpse.var_value('TEXMFSYSVAR'))
os.setenv('TEXMFCONFIG', kpse.var_value('TEXMFSYSCONFIG'))
end
+-- restricted programs
+local shell_escape_commands = string.lower(kpse.var_value('shell_escape_commands'))
+if string.find(','..shell_escape_commands..',', ','..progname..',', 1, true) then
+ -- limit search path to the system trees (not really necessary for the names in
+ -- the alias_table, see below, because they are not searched for with kpathsea)
+ os.setenv('TEXMFSCRIPTS', '{!!$TEXMFMAIN,!!$TEXMFLOCAL,!!$TEXMFDIST}/scripts/{$engine,$progname,}//')
+end
-- program alias table (programs with special needs)
local alias_table = {--[[
@@ -248,7 +369,7 @@ local alias_table = {--[[
function ()
local fontsdir = kpse.var_value('TEXMFVAR') .. '/fonts'
if lfs.attributes(fontsdir, 'mode') ~= 'directory' then
- assert(lfs.mkdir(fontsdir))
+ assert(mkdir_plus(fontsdir))
end
local tfmpath = kpse.show_path('tfm')
tfmpath = string.gsub(tfmpath, '!!', '')
@@ -263,32 +384,29 @@ local alias_table = {--[[
[["-TEXPK=^r\pk\\^s.^dpk;^r\tfm\\^s^tfm;^r\vf\\^s.vf;^r\ovf\\^s.ovf;^r\tfm\\^s.tfm" "-TEXROOT=']] ..
table.concat(texrt, ';') .. [['"]]
return {[0]=TEXDIR..'/tlpkg/dviout/dviout.exe', 'dviout', dvioutpar, argline}
- end,---[[
+ end,
psv = {[0]=TEXDIR..'/tlpkg/tlpsv/gswxlua.exe', 'gswxlua',
'-l', _q(TEXDIR..'/tlpkg/tlpsv/psv.wx.lua'),
- '-p', _q(TEXDIR..'/tlpkg/tlpsv/psv_view.ps'), '-sINPUT='..argline},--]]
+ '-p', _q(TEXDIR..'/tlpkg/tlpsv/psv_view.ps'), '-sINPUT='..argline},
repstopdf = {[0]=PERLEXE, 'perl',
_q(TEXDIR..'/texmf-dist/scripts/epstopdf/epstopdf.pl'),
'--restricted', argline},
rpdfcrop = {[0]=PERLEXE, 'perl',
_q(TEXDIR..'/texmf-dist/scripts/pdfcrop/pdfcrop.pl'),
'--restricted', argline},
- sam2p = {[0]=TEXDIR..'/tlpkg/sam2p/sam2p.exe', 'sam2p', argline},---[[
+ sam2p = {[0]=TEXDIR..'/tlpkg/sam2p/sam2p.exe', 'sam2p', argline},
texworks =
function ()
- -- TODO: add to texmf/web2c/texmf.cnf
- -- TW_LIBPATH = $TEXMFCONFIG/texworks
- -- TW_INIPATH = $TW_LIBPATH
local TW_LIBPATH = kpse.var_value('TW_LIBPATH') or
kpse.var_value('TEXMFCONFIG')..'/texworks'
local TW_INIPATH = kpse.var_value('TW_INIPATH') or TW_LIBPATH
os.setenv('TW_LIBPATH', TW_LIBPATH)
os.setenv('TW_INIPATH', TW_INIPATH)
if (TW_INIPATH and lfs.attributes(TW_INIPATH, 'mode') ~= 'directory') then
- assert(lfs.mkdir(TW_INIPATH))
+ assert(mkdir_plus(TW_INIPATH))
end
return {[0]=TEXDIR..'/tlpkg/texworks/texworks.exe', 'texworks', argline}
- end,--]]
+ end,
}
local extension_map = { -- maps script extension to command
diff --git a/Build/source/texk/texlive/w32_wrapper/runscript_dll.c b/Build/source/texk/texlive/w32_wrapper/runscript_dll.c
index 239f512706f..4f85f9c1184 100644
--- a/Build/source/texk/texlive/w32_wrapper/runscript_dll.c
+++ b/Build/source/texk/texlive/w32_wrapper/runscript_dll.c
@@ -1,23 +1,11 @@
/************************************************************************
- Generic script wrapper
-
- Public Domain
- Originally written 2009 by T.M.Trzeciak
-
- For rationale and structure details see runscript.tlu script.
-
- Compilation with gcc (size optimized):
- gcc -Os -s -shared -o runscript.dll runscript_dll.c -L./ -lluatex
- gcc -Os -s -o runscript.exe runscript_exe.c -L./ -lrunscript
- gcc -mwindows -Os -s -o wrunscript.exe wrunscript_exe.c -L./ -lrunscript
-
- Compilation with tcc (extra small size):
- tiny_impdef luatex.dll
- tcc -shared -o runscript.dll runscript_dll.c luatex.def
- tcc -o runscript.exe runscript_exe.c runscript.def
- tcc -o wrunscript.exe wrunscript_exe.c runscript.def
-
+ This file is a part of the wrapper program for launching scripts
+ and programs in TeX Live on Windows. See readme.txt for more details.
+
+ This file was originally written in 2009 by Tomasz M. Trzeciak and
+ was placed in the Public Domain.
+
************************************************************************/
#include <stdio.h>
@@ -42,14 +30,19 @@ __declspec(dllexport) int dllrunscript( int argc, char *argv[] )
static char fpath[MAX_PATH];
char *fname, *argline, **lua_argv;
int k, quoted, lua_argc;
+ HMODULE WINAPI module_handle = NULL;
- // file path of this executable
+ // file path of the executable
k = (int) GetModuleFileName(NULL, own_path, MAX_PATH);
if ( !k || (k == MAX_PATH) )
DIE("cannot get own path (may be too long): %s\n", own_path);
- // script path
- strcpy(fpath, own_path);
+ // script path (the dir of this library)
+ module_handle = GetModuleHandle(module_name);
+ // if ( module_handle == NULL ) exe path will be used, which is OK too
+ k = (int) GetModuleFileName(module_handle, fpath, MAX_PATH);
+ if ( !k || (k == MAX_PATH) )
+ DIE("cannot get module path (may be too long): %s\n", fpath);
fname = strrchr(fpath, '\\');
if ( fname == NULL ) DIE("no directory part in module path: %s\n", fpath);
fname++;
@@ -68,15 +61,14 @@ __declspec(dllexport) int dllrunscript( int argc, char *argv[] )
while ( IS_WHITESPACE(*argline) ) argline++; // remove leading whitespace if any
// set up argument list for texlua script
- lua_argc = argc ? argc + 4 : 5;
- lua_argv = (char **)malloc( (lua_argc + 1) * sizeof(char *) );
- lua_argv[0] = texlua_name;
- lua_argv[1] = fpath; // script to execute
- for ( k = 1; k < argc; k++ ) lua_argv[k+1] = argv[k]; // copy argument list
- lua_argv[lua_argc - 3] = subsys_mode; // sentinel argument
- lua_argv[lua_argc - 2] = argc ? argv[0] : own_path; // original argv[0]
- lua_argv[lua_argc - 1] = argline; // unparsed arguments
- lua_argv[lua_argc] = NULL;
+ lua_argv = (char **)malloc( (argc + 6) * sizeof(char *) );
+ lua_argv[lua_argc=0] = texlua_name;
+ lua_argv[++lua_argc] = fpath; // script to execute
+ for ( k = 1; k < argc; k++ ) lua_argv[++lua_argc] = argv[k]; // copy argument list
+ lua_argv[++lua_argc] = subsys_mode; // sentinel argument
+ lua_argv[++lua_argc] = argc ? argv[0] : own_path; // original argv[0]
+ lua_argv[++lua_argc] = argline; // unparsed arguments
+ lua_argv[++lua_argc] = NULL;
// call texlua interpreter
// dllluatexmain never returns, but we pretend that it does
@@ -97,7 +89,7 @@ void finalize( void )
// check for and display error message if any
char *err_msg;
if ( err_msg = (char *) getenv(err_env_var) )
- MessageBox( NULL, err_msg, module_name, MB_ICONERROR | MB_SETFOREGROUND );
+ MessageBox( NULL, err_msg, script_name, MB_ICONERROR | MB_SETFOREGROUND );
}
__declspec(dllexport) int dllwrunscript(
@@ -106,7 +98,7 @@ __declspec(dllexport) int dllwrunscript(
char *argline,
int winshow
) {
- // set sentinel argument
+ // set sentinel argument (G for GUI_MODE)
*subsys_mode = 'G';
// clear error var in case it exists already
SetEnvironmentVariable(err_env_var, NULL);
diff --git a/Build/source/texk/texlive/w32_wrapper/runscript_exe.c b/Build/source/texk/texlive/w32_wrapper/runscript_exe.c
index 22bfadae886..29d04a93a43 100644
--- a/Build/source/texk/texlive/w32_wrapper/runscript_exe.c
+++ b/Build/source/texk/texlive/w32_wrapper/runscript_exe.c
@@ -1,3 +1,13 @@
+/************************************************************************
+
+ This file is a part of the wrapper program for launching scripts
+ and programs in TeX Live on Windows. See readme.txt for more details.
+
+ This file was originally written in 2009 by Tomasz M. Trzeciak and
+ was placed in the Public Domain.
+
+************************************************************************/
+
#include <windows.h>
__declspec(dllimport) int dllrunscript( int argc, char *argv[] );
diff --git a/Build/source/texk/texlive/w32_wrapper/wrunscript.c b/Build/source/texk/texlive/w32_wrapper/wrunscript.c
deleted file mode 100644
index 12cdb6f6d63..00000000000
--- a/Build/source/texk/texlive/w32_wrapper/wrunscript.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/************************************************************************
-
- Generic script wrapper
-
- Public Domain
- Originally written 2009 by T.M.Trzeciak
-
- This is a GUI subsystem version of the binary stub.
- For more general info on wrapper structure see runscript.tlu.
-
- Compilation with gcc (size optimized):
- gcc -mwindows -Os -s -o wrunscript.exe wrunscript.c -L./ -lluatex
-
- Compilation with tcc (extra small size):
- tiny_impdef luatex.dll
- tcc -o wrunscript.exe wrunscript.c luatex.def
-
-************************************************************************/
-
-#include <stdio.h>
-#include <windows.h>
-#define MAX_MSG 512
-#define IS_WHITESPACE(c) ((c == ' ') || (c == '\t'))
-#define DIE(...) { _snprintf( msg_buf, MAX_MSG - 1, __VA_ARGS__ ); goto DIE; }
-
-char err_env_var[] = "RUNSCRIPT_ERROR_MESSAGE";
-char script_name[] = "runscript.tlu";
-char texlua_name[] = "texlua";
-char sentinel_arg[] = "GUI_MODE\n";
-static char own_path[MAX_PATH] = "runscript";
-static char msg_buf[MAX_MSG];
-
-void finalize( void )
-{
- // check for and display error message if any
- char *err_msg;
- if ( err_msg = (char *) getenv(err_env_var) )
- MessageBox( NULL, err_msg, own_path, MB_ICONERROR | MB_SETFOREGROUND );
-}
-
-__declspec(dllimport) int dllluatexmain( int argc, char *argv[] );
-
-int APIENTRY WinMain(
- HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- char *argline,
- int winshow
-){
- char fpath[MAX_PATH];
- char *fname, *fext, **lua_argv;
- int k, lua_argc;
- int argc = 0;
- char **argv, **env;
- int new_mode = 0;
- int expand_wildcards = 0;
-
- // clear error var in case it exists already
- SetEnvironmentVariable(err_env_var, NULL);
-
- // file path of this executable
- k = (int) GetModuleFileName(NULL, own_path, MAX_PATH);
- if ( !k || (k == MAX_PATH) )
- DIE("could not get own path (may be too long): %s\n", own_path);
-
- // script path
- strcpy(fpath, own_path);
- fname = strrchr(fpath, '\\');
- if ( fname == NULL ) DIE("no directory part in module path: %s\n", fpath);
- fname++;
- if ( fname + strlen(script_name) >= fpath + MAX_PATH - 1 )
- DIE("path too long: %s\n", fpath);
- strcpy(fname, script_name);
- if ( GetFileAttributes(fpath) == INVALID_FILE_ATTRIBUTES )
- DIE("main lua script not found: %s\n", fpath);
-
-#ifdef __MSVCRT__
- // WinMain doesn't provide argc & argv, use MSVCRT function directly
- __getmainargs(&argc, &argv, &env, expand_wildcards, &new_mode);
-#endif
-
- // set up argument list for texlua script
- lua_argc = argc ? argc + 4 : 5;
- lua_argv = (char **) malloc( (lua_argc + 1) * sizeof(char *) );
- lua_argv[0] = texlua_name; // just a bare name, luatex strips the rest anyway
- lua_argv[1] = fpath; // script to execute
- for ( k = 1; k < argc; k++ ) lua_argv[k+1] = argv[k];
- lua_argv[lua_argc - 3] = sentinel_arg; // sentinel argument
- lua_argv[lua_argc - 2] = argc ? argv[0] : own_path; // original argv[0]
- lua_argv[lua_argc - 1] = argline; // unparsed arguments
- lua_argv[lua_argc] = NULL;
-
- // register atexit handler to recover control before terminating
- atexit(finalize);
- // dllluatexmain never returns, but we pretend that it does
- k = dllluatexmain( lua_argc, lua_argv );
- if (lua_argv) free(lua_argv);
- return k;
-
-DIE:
- fprintf(stderr, "%s: ", own_path);
- fprintf(stderr, msg_buf);
- MessageBox( NULL, msg_buf, own_path, MB_ICONERROR | MB_SETFOREGROUND );
- return 1;
-}
diff --git a/Build/source/texk/texlive/w32_wrapper/wrunscript_exe.c b/Build/source/texk/texlive/w32_wrapper/wrunscript_exe.c
index c1023c87481..573501ae757 100644
--- a/Build/source/texk/texlive/w32_wrapper/wrunscript_exe.c
+++ b/Build/source/texk/texlive/w32_wrapper/wrunscript_exe.c
@@ -1,3 +1,13 @@
+/************************************************************************
+
+ This file is a part of the wrapper program for launching scripts
+ and programs in TeX Live on Windows. See readme.txt for more details.
+
+ This file was originally written in 2009 by Tomasz M. Trzeciak and
+ was placed in the Public Domain.
+
+************************************************************************/
+
#include <windows.h>
__declspec(dllimport) int dllwrunscript(