mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-02 09:23:31 +00:00
lib: add and use new yang function for finding schema nodes
Add a wrapper around lys_find_xpath which has an unfortunate API returning an allocated set of schema nodes when we only ever expect and want one. Another libyang function `lys_find_path` returns a single node; however, that function can assert/abort on invalid path values so is unsuitable for user input. Replace previous uses of `lys_find_path` with new API when dealing with possible invalid path values (i.e., from a user). Signed-off-by: Christian Hopps <chopps@labn.net>
This commit is contained in:
parent
eee1fca3eb
commit
9e0241c8fb
@ -167,7 +167,7 @@ struct nb_node *nb_node_find(const char *path)
|
|||||||
* Use libyang to find the schema node associated to the path and get
|
* Use libyang to find the schema node associated to the path and get
|
||||||
* the northbound node from there (snode private pointer).
|
* the northbound node from there (snode private pointer).
|
||||||
*/
|
*/
|
||||||
snode = lys_find_path(ly_native_ctx, NULL, path, 0);
|
snode = yang_find_snode(ly_native_ctx, path, 0);
|
||||||
if (!snode)
|
if (!snode)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
17
lib/yang.c
17
lib/yang.c
@ -250,6 +250,23 @@ void yang_snode_get_path(const struct lysc_node *snode,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct lysc_node *yang_find_snode(struct ly_ctx *ly_ctx, const char *xpath,
|
||||||
|
uint32_t options)
|
||||||
|
{
|
||||||
|
struct lysc_node *snode;
|
||||||
|
struct ly_set *set;
|
||||||
|
LY_ERR err;
|
||||||
|
|
||||||
|
err = lys_find_xpath(ly_native_ctx, NULL, xpath, options, &set);
|
||||||
|
if (err || !set->count)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
snode = set->snodes[0];
|
||||||
|
ly_set_free(set, NULL);
|
||||||
|
|
||||||
|
return snode;
|
||||||
|
}
|
||||||
|
|
||||||
struct lysc_node *yang_snode_real_parent(const struct lysc_node *snode)
|
struct lysc_node *yang_snode_real_parent(const struct lysc_node *snode)
|
||||||
{
|
{
|
||||||
struct lysc_node *parent = snode->parent;
|
struct lysc_node *parent = snode->parent;
|
||||||
|
21
lib/yang.h
21
lib/yang.h
@ -210,6 +210,27 @@ extern void yang_snode_get_path(const struct lysc_node *snode,
|
|||||||
enum yang_path_type type, char *xpath,
|
enum yang_path_type type, char *xpath,
|
||||||
size_t xpath_len);
|
size_t xpath_len);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Find libyang schema node for the given xpath. Uses `lys_find_xpath`,
|
||||||
|
* returning only the first of a set of nodes -- normally there should only
|
||||||
|
* be one.
|
||||||
|
*
|
||||||
|
* ly_ctx
|
||||||
|
* libyang context to operate on.
|
||||||
|
*
|
||||||
|
* xpath
|
||||||
|
* XPath expression (absolute or relative) to find the schema node for.
|
||||||
|
*
|
||||||
|
* options
|
||||||
|
* Libyang findxpathoptions value (see lys_find_xpath).
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* The libyang schema node if found, or NULL if not found.
|
||||||
|
*/
|
||||||
|
extern struct lysc_node *yang_find_snode(struct ly_ctx *ly_ctx,
|
||||||
|
const char *xpath, uint32_t options);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Find first parent schema node which is a presence-container or a list
|
* Find first parent schema node which is a presence-container or a list
|
||||||
* (non-presence containers are ignored).
|
* (non-presence containers are ignored).
|
||||||
|
@ -235,8 +235,8 @@ struct yang_translator *yang_translator_load(const char *path)
|
|||||||
xpath_custom =
|
xpath_custom =
|
||||||
yang_dnode_get_string(set->dnodes[i], "./custom");
|
yang_dnode_get_string(set->dnodes[i], "./custom");
|
||||||
|
|
||||||
snode_custom = lys_find_path(translator->ly_ctx, NULL,
|
snode_custom =
|
||||||
xpath_custom, 0);
|
yang_find_snode(translator->ly_ctx, xpath_custom, 0);
|
||||||
if (!snode_custom) {
|
if (!snode_custom) {
|
||||||
flog_warn(EC_LIB_YANG_TRANSLATOR_LOAD,
|
flog_warn(EC_LIB_YANG_TRANSLATOR_LOAD,
|
||||||
"%s: unknown data path: %s", __func__,
|
"%s: unknown data path: %s", __func__,
|
||||||
@ -247,8 +247,7 @@ struct yang_translator *yang_translator_load(const char *path)
|
|||||||
|
|
||||||
xpath_native =
|
xpath_native =
|
||||||
yang_dnode_get_string(set->dnodes[i], "./native");
|
yang_dnode_get_string(set->dnodes[i], "./native");
|
||||||
snode_native =
|
snode_native = yang_find_snode(ly_native_ctx, xpath_native, 0);
|
||||||
lys_find_path(ly_native_ctx, NULL, xpath_native, 0);
|
|
||||||
if (!snode_native) {
|
if (!snode_native) {
|
||||||
flog_warn(EC_LIB_YANG_TRANSLATOR_LOAD,
|
flog_warn(EC_LIB_YANG_TRANSLATOR_LOAD,
|
||||||
"%s: unknown data path: %s", __func__,
|
"%s: unknown data path: %s", __func__,
|
||||||
@ -315,7 +314,7 @@ yang_translate_xpath(const struct yang_translator *translator, int dir,
|
|||||||
else
|
else
|
||||||
ly_ctx = ly_native_ctx;
|
ly_ctx = ly_native_ctx;
|
||||||
|
|
||||||
snode = lys_find_path(ly_ctx, NULL, xpath, 0);
|
snode = yang_find_snode(ly_ctx, xpath, 0);
|
||||||
if (!snode) {
|
if (!snode) {
|
||||||
flog_warn(EC_LIB_YANG_TRANSLATION_ERROR,
|
flog_warn(EC_LIB_YANG_TRANSLATION_ERROR,
|
||||||
"%s: unknown data path: %s", __func__, xpath);
|
"%s: unknown data path: %s", __func__, xpath);
|
||||||
|
@ -89,7 +89,7 @@ static const char *yang_get_default_value(const char *xpath)
|
|||||||
const struct lysc_node *snode;
|
const struct lysc_node *snode;
|
||||||
const char *value;
|
const char *value;
|
||||||
|
|
||||||
snode = lys_find_path(ly_native_ctx, NULL, xpath, 0);
|
snode = yang_find_snode(ly_native_ctx, xpath, 0);
|
||||||
if (snode == NULL) {
|
if (snode == NULL) {
|
||||||
flog_err(EC_LIB_YANG_UNKNOWN_DATA_PATH,
|
flog_err(EC_LIB_YANG_UNKNOWN_DATA_PATH,
|
||||||
"%s: unknown data path: %s", __func__, xpath);
|
"%s: unknown data path: %s", __func__, xpath);
|
||||||
@ -206,7 +206,7 @@ int yang_str2enum(const char *xpath, const char *value)
|
|||||||
const struct lysc_type_enum *type;
|
const struct lysc_type_enum *type;
|
||||||
const struct lysc_type_bitenum_item *enums;
|
const struct lysc_type_bitenum_item *enums;
|
||||||
|
|
||||||
snode = lys_find_path(ly_native_ctx, NULL, xpath, 0);
|
snode = yang_find_snode(ly_native_ctx, xpath, 0);
|
||||||
if (snode == NULL) {
|
if (snode == NULL) {
|
||||||
flog_err(EC_LIB_YANG_UNKNOWN_DATA_PATH,
|
flog_err(EC_LIB_YANG_UNKNOWN_DATA_PATH,
|
||||||
"%s: unknown data path: %s", __func__, xpath);
|
"%s: unknown data path: %s", __func__, xpath);
|
||||||
@ -241,7 +241,7 @@ struct yang_data *yang_data_new_enum(const char *xpath, int value)
|
|||||||
const struct lysc_type_enum *type;
|
const struct lysc_type_enum *type;
|
||||||
const struct lysc_type_bitenum_item *enums;
|
const struct lysc_type_bitenum_item *enums;
|
||||||
|
|
||||||
snode = lys_find_path(ly_native_ctx, NULL, xpath, 0);
|
snode = yang_find_snode(ly_native_ctx, xpath, 0);
|
||||||
if (snode == NULL) {
|
if (snode == NULL) {
|
||||||
flog_err(EC_LIB_YANG_UNKNOWN_DATA_PATH,
|
flog_err(EC_LIB_YANG_UNKNOWN_DATA_PATH,
|
||||||
"%s: unknown data path: %s", __func__, xpath);
|
"%s: unknown data path: %s", __func__, xpath);
|
||||||
|
Loading…
Reference in New Issue
Block a user