blob: 7ab49e97e2e5a51502b9b8f7a0e53d61b17d9917 [file] [log] [blame]
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 <mark.hatle@windriver.com>
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);