From: Donald Lee Date: Wed, 7 Jul 2021 13:53:38 +0000 (+0800) Subject: lib: Add frrscript_get_result X-Git-Tag: base_8.1~259^2~35 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=06947ddeac654c76940c09d38cb0e5f435e28495;p=mirror%2Ffrr.git lib: Add frrscript_get_result Signed-off-by: Donald Lee --- diff --git a/lib/frrscript.c b/lib/frrscript.c index 1d4fe58dd1..5352c6470d 100644 --- a/lib/frrscript.c +++ b/lib/frrscript.c @@ -194,22 +194,31 @@ done: return ret; } -void *frrscript_get_result(struct frrscript *fs, - const struct frrscript_env *result) +void *frrscript_get_result(struct frrscript *fs, const char *function_name, + const char *name, + void *(*lua_to)(lua_State *L, int idx)) { - void *r; - struct frrscript_codec c = {.typename = result->typename}; + void *p; + struct lua_function_state *lfs; + struct lua_function_state lookup = {.name = function_name}; - struct frrscript_codec *codec = hash_lookup(codec_hash, &c); - assert(codec && "No encoder for type"); + lfs = hash_lookup(fs->lua_function_hash, &lookup); - if (!codec->decoder) { - zlog_err("No script decoder for type '%s'", result->typename); + if (lfs == NULL) { return NULL; } + /* results table is idx 1 on the stack, getfield pushes our item to idx + * 2*/ + lua_getfield(lfs->L, 1, name); + if (lua_isnil(lfs->L, -1)) { + lua_pop(lfs->L, 1); + zlog_err("No result in results table with that name %s", name); + return NULL; + } + p = lua_to(lfs->L, 2); - return r; + return p; } void frrscript_register_type_codec(struct frrscript_codec *codec) diff --git a/lib/frrscript.h b/lib/frrscript.h index 1e35e2ee41..d2791a5a8b 100644 --- a/lib/frrscript.h +++ b/lib/frrscript.h @@ -233,8 +233,9 @@ int _frrscript_call_lua(struct lua_function_state *lfs, int nargs); * Returns: * The script result of the specified name and type, or NULL. */ -void *frrscript_get_result(struct frrscript *fs, - const struct frrscript_env *result); +void *frrscript_get_result(struct frrscript *fs, const char *function_name, + const char *name, + void *(*lua_to)(lua_State *L, int idx)); #ifdef __cplusplus }