diff options
| author | Quentin Young <qlyoung@users.noreply.github.com> | 2021-10-26 15:26:32 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-10-26 15:26:32 -0400 |
| commit | 0c124f75db6b37cd67f643935b04ee40b9ea6b52 (patch) | |
| tree | 3e8a7d13e08e955c16a99dbd29b4afdc9a91e6bd /lib/frrscript.c | |
| parent | d12799878586a9ea5823fc51de5432495c94fe7a (diff) | |
| parent | 30085ba550c6e20e93eecc1d78929f5e5ed1afaa (diff) | |
Merge pull request #9440 from dlqs/dplanehook2
Diffstat (limited to 'lib/frrscript.c')
| -rw-r--r-- | lib/frrscript.c | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/lib/frrscript.c b/lib/frrscript.c index b935b30cc2..ccb790dc4a 100644 --- a/lib/frrscript.c +++ b/lib/frrscript.c @@ -32,6 +32,92 @@ DEFINE_MTYPE_STATIC(LIB, SCRIPT, "Scripting"); +/* + * Script name hash utilities + */ + +struct frrscript_names_head frrscript_names_hash; + +/* + * Wrapper for frrscript_names_add + * Use this to register hook calls when a daemon starts up + */ +int frrscript_names_add_function_name(const char *function_name) +{ + struct frrscript_names_entry *insert = + XCALLOC(MTYPE_SCRIPT, sizeof(*insert)); + strlcpy(insert->function_name, function_name, + sizeof(insert->function_name)); + + if (frrscript_names_add(&frrscript_names_hash, insert)) { + zlog_warn( + "Failed to add hook call function name to script_names"); + return 1; + } + return 0; +} + +void frrscript_names_destroy(void) +{ + struct frrscript_names_entry *ne; + + while ((ne = frrscript_names_pop(&frrscript_names_hash))) + XFREE(MTYPE_SCRIPT, ne); +} + +/* + * Given a function_name, set its script_name. function_names and script_names + * are one-to-one. Each set will wipe the previous script_name. + * Return 0 if set was successful, else 1. + * + * script_name is the base name of the file, without .lua. + */ +int frrscript_names_set_script_name(const char *function_name, + const char *script_name) +{ + struct frrscript_names_entry lookup; + + strlcpy(lookup.function_name, function_name, + sizeof(lookup.function_name)); + struct frrscript_names_entry *snhe = + frrscript_names_find(&frrscript_names_hash, &lookup); + if (!snhe) + return 1; + strlcpy(snhe->script_name, script_name, sizeof(snhe->script_name)); + return 0; +} + +/* + * Given a function_name, get its script_name. + * Return NULL if function_name not found. + * + * script_name is the base name of the file, without .lua. + */ +char *frrscript_names_get_script_name(const char *function_name) +{ + struct frrscript_names_entry lookup; + + strlcpy(lookup.function_name, function_name, + sizeof(lookup.function_name)); + struct frrscript_names_entry *snhe = + frrscript_names_find(&frrscript_names_hash, &lookup); + if (!snhe) + return NULL; + return snhe->script_name; +} + +uint32_t frrscript_names_hash_key(const struct frrscript_names_entry *snhe) +{ + return string_hash_make(snhe->function_name); +} + +int frrscript_names_hash_cmp(const struct frrscript_names_entry *snhe1, + const struct frrscript_names_entry *snhe2) +{ + return strncmp(snhe1->function_name, snhe2->function_name, + sizeof(snhe1->function_name)); +} + /* Codecs */ struct frrscript_codec frrscript_codecs_lib[] = { |
