Lua 'print' statement is not working properly inside of RPM 5 The print statement should capture the output and send it to the script processing engine, and not display it directly to the screen. This patch is from: http://rpm5.org/cvs/patchset?cn=17671 Upstream-Status: backport (patchset 17671 from rpm5.org) Signed-off-by: Mark Hatle Index: rpm-5.4.14/CHANGES =================================================================== --- rpm-5.4.14.orig/CHANGES +++ rpm-5.4.14/CHANGES @@ -1,3 +1,4 @@ + - jbj: lua: fix: resurrect output capture with lua-5.2. - jbj: verify: fix: broken logic for %ghost avoidance (Mark Hatle). 5.4.13 -> 5.4.14: Index: rpm-5.4.14/rpmio/rpmlua.c =================================================================== --- rpm-5.4.14.orig/rpmio/rpmlua.c +++ rpm-5.4.14/rpmio/rpmlua.c @@ -175,7 +175,7 @@ rpmlua rpmluaNew(void) }; /*@=readonlytrans =nullassign @*/ /*@observer@*/ /*@unchecked@*/ - const luaL_Reg *lib = lualibs; + const luaL_Reg *lib; char *path_buf; char *path_next; char *path; @@ -190,31 +190,34 @@ rpmlua rpmluaNew(void) luaL_openlibs(L); - for (; lib->name; lib++) { + for (lib = lualibs; lib->name; lib++) { luaL_requiref(L, lib->name, lib->func, 1); + lua_pop(L, 1); } { const char * _lua_path = rpmGetPath(rpmluaPath, NULL); if (_lua_path != NULL) { +#if defined(LUA_GLOBALSINDEX) lua_pushliteral(L, "LUA_PATH"); lua_pushstring(L, _lua_path); + lua_rawset(L, LUA_GLOBALSINDEX); +#else + lua_pushstring(L, _lua_path); + lua_setglobal(L, "LUA_PATH"); +#endif _lua_path = _free(_lua_path); } } #if defined(LUA_GLOBALSINDEX) - lua_rawset(L, LUA_GLOBALSINDEX); -#else - lua_pushglobaltable(L); -#endif lua_pushliteral(L, "print"); lua_pushcfunction(L, rpm_print); - -#if defined(LUA_GLOBALSINDEX) lua_rawset(L, LUA_GLOBALSINDEX); #else - lua_pushglobaltable(L); + lua_pushcfunction(L, rpm_print); + lua_setglobal(L, "print"); #endif + rpmluaSetData(lua, "lua", lua); /* load all standard RPM Lua script files */ @@ -351,6 +354,9 @@ void rpmluaSetVar(rpmlua _lua, rpmluav v #if defined(LUA_GLOBALSINDEX) if (lua->pushsize == 0) lua_pushvalue(L, LUA_GLOBALSINDEX); +#else + if (lua->pushsize == 0) + lua_pushglobaltable(L); #endif if (pushvar(L, var->keyType, &var->key) != -1) { if (pushvar(L, var->valueType, &var->value) != -1) @@ -1039,14 +1045,15 @@ static int rpm_print (lua_State *L) lua_getglobal(L, "tostring"); for (i = 1; i <= n; i++) { const char *s; + size_t l; lua_pushvalue(L, -1); /* function to be called */ lua_pushvalue(L, i); /* value to print */ lua_call(L, 1, 1); - s = lua_tostring(L, -1); /* get result */ + s = lua_tolstring(L, -1, &l); /* get result */ if (s == NULL) return luaL_error(L, "`tostring' must return a string to `print'"); if (lua->storeprint) { - size_t sl = lua_rawlen(L, -1); + size_t sl = l; if ((size_t)(lua->printbufused+sl+1) > lua->printbufsize) { lua->printbufsize += sl+512; lua->printbuf = (char *) xrealloc(lua->printbuf, lua->printbufsize);