Below I include a suggestion on how to do this sort of version agnostic.
Cheers, Henri
Live example on Wandbox:
https://wandbox.org/permlink/jEn9kNnPB0t5rwjP
---
#include
#include
#include
#include
#include
static int (*lua_os_execute)(lua_State *L) = NULL;
static int os_execute(lua_State *L) {
// Do whatever
printf("Hello Hans!\n");
// Safeguard
assert(lua_os_execute != NULL);
// Return wrapped
return lua_os_execute(L);
}
LUAMOD_API int luaopen_oslibext(lua_State *L) {
lua_getglobal(L, "os");
// Get the address of the original function
if (lua_os_execute == NULL) {
lua_getfield(L, -1, "execute");
lua_os_execute = lua_tocfunction(L, -1);
lua_pop(L, 1);
}
// Push the new function to overwrite the old one
lua_pushcfunction(L, os_execute);
lua_setfield(L, -2, "execute");
return 1;
}
int main(void) {
lua_State *L = luaL_newstate();
luaL_openlibs(L);
luaopen_oslibext(L);
if (luaL_dostring(L, "os.execute([[date]])") != 0) {
fprintf(stderr, "%s", lua_tostring(L, -1));
lua_pop(L, 1);
}
lua_close(L);
}
On 11/21/19 8:17 PM, Henri Menke wrote:
Dear list,
The following Lua script behaves differently when executed in Lua vs.
LuaTeX.
print(os.execute("date"))
It seems that the definition of os_execute in loslibext.c was copied
over from Lua 5.1 and not adapted to newer versions.
$ lua5.1 test.lua
0
$ lua5.2 test.lua
true exit 0
$ lua5.3 test.lua
true exit 0
$ texlua test.lua
0
$ luajit test.lua
0
$ texluajit test.lua
0
As you can see from the example, this comes with the additional
complication that LuaJIT has Lua 5.1 behaviour and should also retain
that.
Cheers, Henri