summaryrefslogtreecommitdiff
path: root/lib/frrscript.c
diff options
context:
space:
mode:
authorQuentin Young <qlyoung@nvidia.com>2020-11-29 02:33:07 -0500
committerQuentin Young <qlyoung@nvidia.com>2020-12-01 18:37:14 -0500
commit646b0cce88a4fa6512f434d508a627518d28e55c (patch)
tree56c8a2de98f283666d9887194c78d58dc16ba6bd /lib/frrscript.c
parente613a6f73c03b338196f71db615047af7862837e (diff)
lib: add better script error handling
Signed-off-by: Quentin Young <qlyoung@nvidia.com>
Diffstat (limited to 'lib/frrscript.c')
-rw-r--r--lib/frrscript.c41
1 files 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)