mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-09 13:19:17 +00:00
tools: add new-style get operation callback support
Signed-off-by: Christian Hopps <chopps@labn.net>
This commit is contained in:
parent
36f25da612
commit
153c06043b
@ -15,12 +15,13 @@
|
|||||||
#include "yang.h"
|
#include "yang.h"
|
||||||
#include "northbound.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)
|
static void __attribute__((noreturn)) usage(int status)
|
||||||
{
|
{
|
||||||
extern const char *__progname;
|
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);
|
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",
|
.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)
|
static void replace_hyphens_by_underscores(char *str)
|
||||||
{
|
{
|
||||||
char *p;
|
char *p;
|
||||||
@ -120,6 +129,14 @@ static void replace_hyphens_by_underscores(char *str)
|
|||||||
*p++ = '_';
|
*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,
|
static void generate_callback_name(const struct lysc_node *snode,
|
||||||
enum nb_cb_operation operation, char *buffer,
|
enum nb_cb_operation operation, char *buffer,
|
||||||
size_t size)
|
size_t size)
|
||||||
@ -143,7 +160,7 @@ static void generate_callback_name(const struct lysc_node *snode,
|
|||||||
strlcat(buffer, snode->name, size);
|
strlcat(buffer, snode->name, size);
|
||||||
strlcat(buffer, "_", size);
|
strlcat(buffer, "_", size);
|
||||||
}
|
}
|
||||||
strlcat(buffer, nb_cb_operation_name(operation), size);
|
strlcat(buffer, __operation_name(operation), size);
|
||||||
list_delete(&snodes);
|
list_delete(&snodes);
|
||||||
|
|
||||||
replace_hyphens_by_underscores(buffer);
|
replace_hyphens_by_underscores(buffer);
|
||||||
@ -208,17 +225,25 @@ static int generate_prototypes(const struct lysc_node *snode, void *arg)
|
|||||||
return YANG_ITER_CONTINUE;
|
return YANG_ITER_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (struct nb_callback_info *cb = &nb_callbacks[0];
|
for (struct nb_callback_info *cb = &nb_callbacks[0]; cb->operation != -1; cb++) {
|
||||||
cb->operation != -1; cb++) {
|
|
||||||
char cb_name[BUFSIZ];
|
char cb_name[BUFSIZ];
|
||||||
|
|
||||||
if (cb->optional
|
if (cb->optional
|
||||||
|| !nb_cb_operation_is_valid(cb->operation, snode))
|
|| !nb_cb_operation_is_valid(cb->operation, snode))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (f_new_cbs && cb->operation == NB_CB_GET_NEXT && snode->nodetype == LYS_LEAFLIST)
|
||||||
|
continue;
|
||||||
|
|
||||||
generate_callback_name(snode, cb->operation, cb_name,
|
generate_callback_name(snode, cb->operation, cb_name,
|
||||||
sizeof(cb_name));
|
sizeof(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);
|
generate_prototype(cb, cb_name);
|
||||||
|
}
|
||||||
|
|
||||||
if (cb->need_config_write && need_config_write) {
|
if (cb->need_config_write && need_config_write) {
|
||||||
generate_config_write_cb_name(snode, cb_name,
|
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,
|
static void generate_callback(const struct nb_callback_info *ncinfo,
|
||||||
const char *cb_name)
|
const char *cb_name)
|
||||||
{
|
{
|
||||||
printf("%s%s%s(%s)\n{\n", static_cbs ? "static " : "",
|
printf("%s%s%s(%s)\n{\n", f_static_cbs ? "static " : "", ncinfo->return_type, cb_name,
|
||||||
ncinfo->return_type, cb_name, ncinfo->arguments);
|
ncinfo->arguments);
|
||||||
|
|
||||||
switch (ncinfo->operation) {
|
switch (ncinfo->operation) {
|
||||||
case NB_CB_CREATE:
|
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,
|
static void generate_config_write_callback(const struct nb_callback_info *ncinfo,
|
||||||
const char *cb_name)
|
const char *cb_name)
|
||||||
{
|
{
|
||||||
printf("%s%s%s(%s)\n{\n", static_cbs ? "static " : "",
|
printf("%s%s%s(%s)\n{\n", f_static_cbs ? "static " : "", ncinfo->return_type, cb_name,
|
||||||
ncinfo->return_type, cb_name, ncinfo->arguments);
|
ncinfo->arguments);
|
||||||
|
|
||||||
/* Add a comment, since these callbacks may not all be needed. */
|
/* 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");
|
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;
|
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,
|
generate_callback_name(snode, cb->operation, cb_name,
|
||||||
sizeof(cb_name));
|
sizeof(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);
|
generate_callback(cb, cb_name);
|
||||||
|
}
|
||||||
|
|
||||||
if (cb->need_config_write && need_config_write) {
|
if (cb->need_config_write && need_config_write) {
|
||||||
generate_config_write_cb_name(snode, cb_name,
|
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");
|
printf("\t\t\t.cbs = {\n");
|
||||||
first = false;
|
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,
|
generate_callback_name(snode, cb->operation, cb_name,
|
||||||
sizeof(cb_name));
|
sizeof(cb_name));
|
||||||
printf("\t\t\t\t.%s = %s,\n",
|
printf("\t\t\t\t.%s = %s,\n", __operation_name(cb->operation), cb_name);
|
||||||
nb_cb_operation_name(cb->operation),
|
|
||||||
cb_name);
|
|
||||||
} else if (cb->need_config_write && need_config_write) {
|
} else if (cb->need_config_write && need_config_write) {
|
||||||
if (first) {
|
if (first) {
|
||||||
yang_snode_get_path(snode,
|
yang_snode_get_path(snode,
|
||||||
@ -417,11 +452,14 @@ int main(int argc, char *argv[])
|
|||||||
int opt;
|
int opt;
|
||||||
bool config_pass;
|
bool config_pass;
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "hp:s")) != -1) {
|
while ((opt = getopt(argc, argv, "hnp:s")) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'h':
|
case 'h':
|
||||||
usage(EXIT_SUCCESS);
|
usage(EXIT_SUCCESS);
|
||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
|
case 'n':
|
||||||
|
f_new_cbs = true;
|
||||||
|
break;
|
||||||
case 'p':
|
case 'p':
|
||||||
if (stat(optarg, &st) == -1) {
|
if (stat(optarg, &st) == -1) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
@ -438,7 +476,7 @@ int main(int argc, char *argv[])
|
|||||||
*darr_append(search_paths) = darr_strdup(optarg);
|
*darr_append(search_paths) = darr_strdup(optarg);
|
||||||
break;
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
static_cbs = true;
|
f_static_cbs = true;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
usage(EXIT_FAILURE);
|
usage(EXIT_FAILURE);
|
||||||
@ -477,7 +515,7 @@ int main(int argc, char *argv[])
|
|||||||
printf("// SPDX-" "License-Identifier: GPL-2.0-or-later\n\n");
|
printf("// SPDX-" "License-Identifier: GPL-2.0-or-later\n\n");
|
||||||
|
|
||||||
/* Generate callback prototypes. */
|
/* Generate callback prototypes. */
|
||||||
if (!static_cbs) {
|
if (!f_static_cbs) {
|
||||||
printf("/* prototypes */\n");
|
printf("/* prototypes */\n");
|
||||||
yang_snodes_iterate(module->info, generate_prototypes, 0, NULL);
|
yang_snodes_iterate(module->info, generate_prototypes, 0, NULL);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
Loading…
Reference in New Issue
Block a user