summaryrefslogtreecommitdiff
path: root/lib/frrscript.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/frrscript.h')
-rw-r--r--lib/frrscript.h80
1 files changed, 47 insertions, 33 deletions
diff --git a/lib/frrscript.h b/lib/frrscript.h
index 44067bf0b4..cbc0ca6c51 100644
--- a/lib/frrscript.h
+++ b/lib/frrscript.h
@@ -29,6 +29,13 @@ extern "C" {
#define FRRSCRIPT_PATH "/etc/frr/scripts"
typedef void (*encoder_func)(lua_State *, const void *);
+typedef void *(*decoder_func)(lua_State *, int);
+
+struct frrscript_codec {
+ const char *typename;
+ encoder_func encoder;
+ decoder_func decoder;
+};
struct frrscript {
/* Script name */
@@ -38,6 +45,16 @@ struct frrscript {
struct lua_State *L;
};
+struct frrscript_env {
+ /* Value type */
+ const char *typename;
+
+ /* Binding name */
+ const char *name;
+
+ /* Value */
+ const void *val;
+};
/*
* Create new FRR script.
@@ -51,64 +68,61 @@ struct frrscript *frrscript_load(const char *name,
void frrscript_unload(struct frrscript *fs);
/*
- * Register a Lua encoder for a type.
+ * Register a Lua codec for a type.
*
* tname
* Name of type; e.g., "peer", "ospf_interface", etc. Chosen at will.
*
- * encoder
- * Function pointer to encoder function. Encoder function should push a Lua
+ * codec(s)
+ * Function pointer to codec struct. Encoder function should push a Lua
* table representing the passed argument - which will have the C type
- * associated with the chosen 'tname' to the provided stack.
+ * associated with the chosen 'tname' to the provided stack. The decoder
+ * function should pop a value from the top of the stack and return a heap
+ * chunk containing that value. Allocations should be made with MTYPE_TMP.
+ *
+ * If using the plural function variant, pass a NULL-terminated array.
*
*/
-void frrscript_register_type_encoder(const char *tname, encoder_func encoder);
+void frrscript_register_type_codec(struct frrscript_codec *codec);
+void frrscript_register_type_codecs(struct frrscript_codec *codecs);
/*
* Initialize scripting subsystem. Call this before anything else.
*/
void frrscript_init(void);
-/*
- * Forward decl for frrscript_lua_call
- */
-int frrscript_lua_call(struct frrscript *fs, ...);
/*
- * Call FRR script.
- *
- * Call it like this:
+ * Call script.
*
- * frrscript_call(fs, FRRSCRIPT_ARGS("cool_prefix", "prefix", p),
- * FRRSCRIPT_RESULTS("result1", "result2"))
- */
-#define frrscript_call(fs, ...) frrscript_lua_call((fs), __VA_ARGS__)
-
-/*
- * Macro that defines the arguments to a script.
+ * fs
+ * The script to call; this is obtained from frrscript_load().
*
- * For each argument you want to pass to a script, pass *three* arguments to
- * this function. The first should be name of the variable to bind the argument
- * to in the script's environment. The second should be the type, as registered
- * by frrscript_register_type_encoder(). The third should be the argument
- * itself.
+ * env
+ * The script's environment. Specify this as an array of frrscript_env.
*
- * This macro itself should be used as the second argument to frrscript_call().
+ * Returns:
+ * 0 if the script ran successfully, nonzero otherwise.
*/
-#define FRRSCRIPT_ARGS(...) PP_NARG(__VA_ARGS__), ##__VA_ARGS__
+int frrscript_call(struct frrscript *fs, struct frrscript_env *env);
+
/*
- * Macro that defines the results from a script.
+ * Get result from finished script.
*
- * Similar to FRRSCRIPT_ARGS, except this defines the results from a script.
+ * fs
+ * The script. This script must have been run already.
*
- * The first argument should be the name to bind the first result to and will
- * be used after the script finishes to get that particular result value.
+ * result
+ * The result to extract from the script.
+ * This reuses the frrscript_env type, but only the typename and name fields
+ * need to be set. The value is returned directly.
*
- * This macro itself should be used as the third argument to frrscript_call().
- * It may not be omitted.
+ * Returns:
+ * The script result of the specified name and type, or NULL.
*/
-#define FRRSCRIPT_RESULTS(...) PP_NARG(__VA_ARGS__), ##__VA_ARGS__
+void *frrscript_get_result(struct frrscript *fs,
+ const struct frrscript_env *result);
#ifdef __cplusplus
}