diff options
-rw-r--r-- | tools/gen_northbound_callbacks.c | 72 |
1 files changed, 55 insertions, 17 deletions
diff --git a/tools/gen_northbound_callbacks.c b/tools/gen_northbound_callbacks.c index 516743aca..019404d7c 100644 --- a/tools/gen_northbound_callbacks.c +++ b/tools/gen_northbound_callbacks.c @@ -15,12 +15,13 @@ #include "yang.h" #include "northbound.h" -static bool static_cbs; +static bool f_static_cbs; +static bool f_new_cbs; static void __attribute__((noreturn)) usage(int status) { extern const char *__progname; - fprintf(stderr, "usage: %s [-h] [-s] [-p path]* MODULE\n", __progname); + fprintf(stderr, "usage: %s [-h] [-n] [-s] [-p path]* MODULE\n", __progname); exit(status); } @@ -111,6 +112,14 @@ static struct nb_callback_info nb_config_write = { .arguments = "struct vty *vty, const struct lyd_node *dnode, bool show_defaults", }; +static struct nb_callback_info nb_oper_get = { + .operation = NB_CB_GET_ELEM, + .return_type = "enum nb_error ", + .return_value = "NB_OK", + .arguments = + "const struct nb_node *nb_node, const void *parent_list_entry, struct lyd_node *parent", +}; + static void replace_hyphens_by_underscores(char *str) { char *p; @@ -120,6 +129,14 @@ static void replace_hyphens_by_underscores(char *str) *p++ = '_'; } +static const char *__operation_name(enum nb_cb_operation operation) +{ + if (f_new_cbs && operation == NB_CB_GET_ELEM) + return "get"; + else + return nb_cb_operation_name(operation); +} + static void generate_callback_name(const struct lysc_node *snode, enum nb_cb_operation operation, char *buffer, size_t size) @@ -143,7 +160,7 @@ static void generate_callback_name(const struct lysc_node *snode, strlcat(buffer, snode->name, size); strlcat(buffer, "_", size); } - strlcat(buffer, nb_cb_operation_name(operation), size); + strlcat(buffer, __operation_name(operation), size); list_delete(&snodes); replace_hyphens_by_underscores(buffer); @@ -208,17 +225,25 @@ static int generate_prototypes(const struct lysc_node *snode, void *arg) return YANG_ITER_CONTINUE; } - for (struct nb_callback_info *cb = &nb_callbacks[0]; - cb->operation != -1; cb++) { + for (struct nb_callback_info *cb = &nb_callbacks[0]; cb->operation != -1; cb++) { char cb_name[BUFSIZ]; if (cb->optional || !nb_cb_operation_is_valid(cb->operation, snode)) continue; + if (f_new_cbs && cb->operation == NB_CB_GET_NEXT && snode->nodetype == LYS_LEAFLIST) + continue; + generate_callback_name(snode, cb->operation, cb_name, sizeof(cb_name)); - generate_prototype(cb, cb_name); + + if (cb->operation == NB_CB_GET_ELEM) { + if (f_new_cbs) + generate_prototype(&nb_oper_get, cb_name); + else + generate_prototype(cb, cb_name); + } if (cb->need_config_write && need_config_write) { generate_config_write_cb_name(snode, cb_name, @@ -236,8 +261,8 @@ static int generate_prototypes(const struct lysc_node *snode, void *arg) static void generate_callback(const struct nb_callback_info *ncinfo, const char *cb_name) { - printf("%s%s%s(%s)\n{\n", static_cbs ? "static " : "", - ncinfo->return_type, cb_name, ncinfo->arguments); + printf("%s%s%s(%s)\n{\n", f_static_cbs ? "static " : "", ncinfo->return_type, cb_name, + ncinfo->arguments); switch (ncinfo->operation) { case NB_CB_CREATE: @@ -266,8 +291,8 @@ static void generate_callback(const struct nb_callback_info *ncinfo, static void generate_config_write_callback(const struct nb_callback_info *ncinfo, const char *cb_name) { - printf("%s%s%s(%s)\n{\n", static_cbs ? "static " : "", - ncinfo->return_type, cb_name, ncinfo->arguments); + printf("%s%s%s(%s)\n{\n", f_static_cbs ? "static " : "", ncinfo->return_type, cb_name, + ncinfo->arguments); /* Add a comment, since these callbacks may not all be needed. */ printf("\t/* TODO: this cli callback is optional; the cli output may not need to be done at each node. */\n"); @@ -313,9 +338,18 @@ static int generate_callbacks(const struct lysc_node *snode, void *arg) first = false; } + if (f_new_cbs && cb->operation == NB_CB_GET_NEXT && snode->nodetype == LYS_LEAFLIST) + continue; + generate_callback_name(snode, cb->operation, cb_name, sizeof(cb_name)); - generate_callback(cb, cb_name); + + if (cb->operation == NB_CB_GET_ELEM) { + if (f_new_cbs) + generate_callback(&nb_oper_get, cb_name); + else + generate_callback(cb, cb_name); + } if (cb->need_config_write && need_config_write) { generate_config_write_cb_name(snode, cb_name, @@ -371,12 +405,13 @@ static int generate_nb_nodes(const struct lysc_node *snode, void *arg) printf("\t\t\t.cbs = {\n"); first = false; } + if (f_new_cbs && cb->operation == NB_CB_GET_NEXT && + snode->nodetype == LYS_LEAFLIST) + continue; generate_callback_name(snode, cb->operation, cb_name, sizeof(cb_name)); - printf("\t\t\t\t.%s = %s,\n", - nb_cb_operation_name(cb->operation), - cb_name); + printf("\t\t\t\t.%s = %s,\n", __operation_name(cb->operation), cb_name); } else if (cb->need_config_write && need_config_write) { if (first) { yang_snode_get_path(snode, @@ -417,11 +452,14 @@ int main(int argc, char *argv[]) int opt; bool config_pass; - while ((opt = getopt(argc, argv, "hp:s")) != -1) { + while ((opt = getopt(argc, argv, "hnp:s")) != -1) { switch (opt) { case 'h': usage(EXIT_SUCCESS); /* NOTREACHED */ + case 'n': + f_new_cbs = true; + break; case 'p': if (stat(optarg, &st) == -1) { fprintf(stderr, @@ -438,7 +476,7 @@ int main(int argc, char *argv[]) *darr_append(search_paths) = darr_strdup(optarg); break; case 's': - static_cbs = true; + f_static_cbs = true; break; default: usage(EXIT_FAILURE); @@ -477,7 +515,7 @@ int main(int argc, char *argv[]) printf("// SPDX-" "License-Identifier: GPL-2.0-or-later\n\n"); /* Generate callback prototypes. */ - if (!static_cbs) { + if (!f_static_cbs) { printf("/* prototypes */\n"); yang_snodes_iterate(module->info, generate_prototypes, 0, NULL); printf("\n"); |