From 646b0cce88a4fa6512f434d508a627518d28e55c Mon Sep 17 00:00:00 2001 From: Quentin Young Date: Sun, 29 Nov 2020 02:33:07 -0500 Subject: [PATCH] lib: add better script error handling Signed-off-by: Quentin Young --- lib/frrscript.c | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/lib/frrscript.c b/lib/frrscript.c index 861819b25f..5465aa36e2 100644 --- a/lib/frrscript.c +++ b/lib/frrscript.c @@ -110,23 +110,28 @@ int frrscript_lua_call(struct frrscript *fs, ...) int ret = lua_pcall(fs->L, 0, nresults, 0); switch (ret) { + case LUA_OK: + break; case LUA_ERRRUN: - zlog_err("Script '%s' runtime error", fs->name); + zlog_err("Script '%s' runtime error: %s", fs->name, lua_tostring(fs->L, -1)); break; case LUA_ERRMEM: - zlog_err("Script '%s' memory error", fs->name); + zlog_err("Script '%s' memory error: %s", fs->name, lua_tostring(fs->L, -1)); break; case LUA_ERRERR: - zlog_err("Script '%s' error handler error", fs->name); + zlog_err("Script '%s' error handler error: %s", fs->name, lua_tostring(fs->L, -1)); break; case LUA_ERRGCMM: - zlog_err("Script '%s' garbage collector error", fs->name); + zlog_err("Script '%s' garbage collector error: %s", fs->name, lua_tostring(fs->L, -1)); break; default: - zlog_err("Script '%s' unknown error", fs->name); + zlog_err("Script '%s' unknown error: %s", fs->name, lua_tostring(fs->L, -1)); break; } + if (ret != LUA_OK) + lua_pop(fs->L, 1); + /* After script returns, decode results */ for (int i = 0; i < nresults; i++) { const char *resultname = va_arg(vl, const char *); @@ -162,7 +167,31 @@ struct frrscript *frrscript_load(const char *name, char fname[MAXPATHLEN]; snprintf(fname, sizeof(fname), FRRSCRIPT_PATH "/%s.lua", fs->name); - if (luaL_loadfile(fs->L, fname) != LUA_OK) + int ret = luaL_loadfile(fs->L, fname); + + switch (ret) { + case LUA_OK: + break; + case LUA_ERRSYNTAX: + zlog_err("Failed loading script '%s': syntax error", fname); + break; + case LUA_ERRMEM: + zlog_err("Failed loading script '%s': out-of-memory error", + fname); + break; + case LUA_ERRGCMM: + zlog_err("Failed loading script '%s': garbage collector error", + fname); + break; + case LUA_ERRFILE: + zlog_err("Failed loading script '%s': file read error", fname); + break; + default: + zlog_err("Failed loading script '%s': unknown error", fname); + break; + } + + if (ret != LUA_OK) goto fail; if (load_cb && (*load_cb)(fs) != 0) -- 2.39.5