From e7b48af2cbaaac99e6087600bf8735d698d022cf Mon Sep 17 00:00:00 2001 From: Amin Ben Romdhane Date: Fri, 21 Jul 2023 11:20:19 +0200 Subject: [PATCH] B#11542: GPN walk at each level fails with micro-services --- libbbfdm-api/dmbbf.c | 10 ++++++++++ libbbfdm-api/dmcommon.c | 16 ++++++++++++++++ libbbfdm-api/dmcommon.h | 1 + 3 files changed, 27 insertions(+) diff --git a/libbbfdm-api/dmbbf.c b/libbbfdm-api/dmbbf.c index 007b7064..0c4e2f4a 100644 --- a/libbbfdm-api/dmbbf.c +++ b/libbbfdm-api/dmbbf.c @@ -1279,6 +1279,7 @@ static int set_ubus_value(struct dmctx *dmctx, struct dmnode *node) static int get_ubus_name(struct dmctx *dmctx, struct dmnode *node) { + unsigned int in_path_dot_num = count_occurrences(dmctx->in_param, '.'); json_object *res = NULL, *res_obj = NULL; char *ubus_name = node->obj->checkdep; @@ -1324,6 +1325,15 @@ static int get_ubus_name(struct dmctx *dmctx, struct dmnode *node) char *data = dmjson_get_value(res_obj, 1, "data"); char *type = dmjson_get_value(res_obj, 1, "type"); + if (dmctx->nextlevel) { + unsigned int path_dot_num = count_occurrences(path, '.'); + size_t len = DM_STRLEN(path); + + if ((path[len - 1] == '.' && path_dot_num > in_path_dot_num + 1) || + (path[len - 1] != '.' && path_dot_num > in_path_dot_num)) + continue; + } + add_list_parameter(dmctx, dmstrdup(path), dmstrdup(data), dmstrdup(type), NULL); } diff --git a/libbbfdm-api/dmcommon.c b/libbbfdm-api/dmcommon.c index ef9873f3..a782caf9 100644 --- a/libbbfdm-api/dmcommon.c +++ b/libbbfdm-api/dmcommon.c @@ -653,6 +653,22 @@ struct uci_section *is_dmmap_section_exist_eq(char* package, char* section, char return NULL; } +unsigned int count_occurrences(char *str, char c) +{ + int count = 0; + + if (!str) + return 0; + + char *pch = strchr(str, c); + while (pch) { + count++; + pch = strchr(pch + 1, c); + } + + return count; +} + unsigned char isdigit_str(char *str) { if (!(*str)) return 0; diff --git a/libbbfdm-api/dmcommon.h b/libbbfdm-api/dmcommon.h index 8c642793..4c9da135 100644 --- a/libbbfdm-api/dmcommon.h +++ b/libbbfdm-api/dmcommon.h @@ -227,6 +227,7 @@ int adm_entry_get_linker_param(struct dmctx *ctx, char *param, char *linker, cha int adm_entry_get_linker_value(struct dmctx *ctx, char *param, char **value); int dm_entry_validate_allowed_objects(struct dmctx *ctx, char *value, char *objects[]); char *check_create_dmmap_package(const char *dmmap_package); +unsigned int count_occurrences(char *str, char c); unsigned char isdigit_str(char *str); bool special_char(char c); bool special_char_exits(const char *str);