* Strict namespace setting can be a problem when upgrading existing database files, such as startup-db or persistent running-db, or any other saved XML file.
* For backward compatibility, load of startup and running set CLICON_XML_NS_STRICT to false temporarily. * Added three-valued return values for several validate functions where -1 is fatal error, 0 is validation failed and 1 is validation OK. * This includes: `xmldb_put`, `xml_yang_validate_all`, `xml_yang_validate_add`, `xml_yang_validate_rpc`, `api_path2xml`, `api_path2xpath` * Added new xml functions for specific types: `xml_child_nr_notype`, `xml_child_nr_notype`, `xml_child_i_type`, `xml_find_type`.
This commit is contained in:
parent
861300d6c0
commit
0baebc93fd
71 changed files with 2679 additions and 1573 deletions
|
|
@ -43,6 +43,7 @@ int xml2json_cbuf(cbuf *cb, cxobj *x, int pretty);
|
|||
int xml2json_cbuf_vec(cbuf *cb, cxobj **vec, size_t veclen, int pretty);
|
||||
int xml2json(FILE *f, cxobj *x, int pretty);
|
||||
int xml2json_vec(FILE *f, cxobj **vec, size_t veclen, int pretty);
|
||||
int json2xml_ns(yang_spec *yspec, cxobj *x, cxobj **xerr);
|
||||
int json_parse_str(char *str, cxobj **xt);
|
||||
int json_parse_file(int fd, yang_spec *yspec, cxobj **xt);
|
||||
|
||||
|
|
|
|||
|
|
@ -52,7 +52,8 @@ int netconf_bad_element(cbuf *cb, char *type, char *info, char *element);
|
|||
int netconf_bad_element_xml(cxobj **xret, char *type, char *info, char *element);
|
||||
int netconf_unknown_element(cbuf *cb, char *type, char *element, char *message);
|
||||
int netconf_unknown_element_xml(cxobj **xret, char *type, char *element, char *message);
|
||||
int netconf_unknown_namespace(cbuf *cb, char *type, char *info, char *message);
|
||||
int netconf_unknown_namespace(cbuf *cb, char *type, char *namespace, char *message);
|
||||
int netconf_unknown_namespace_xml(cxobj **xret, char *type, char *namespace, char *message);
|
||||
int netconf_access_denied(cbuf *cb, char *type, char *message);
|
||||
int netconf_access_denied_xml(cxobj **xret, char *type, char *message);
|
||||
int netconf_lock_denied(cbuf *cb, char *info, char *message);
|
||||
|
|
|
|||
|
|
@ -153,6 +153,9 @@ static inline char *clicon_xmldb_dir(clicon_handle h){
|
|||
static inline char *clicon_xmldb_plugin(clicon_handle h){
|
||||
return clicon_option_str(h, "CLICON_XMLDB_PLUGIN");
|
||||
}
|
||||
static inline int clicon_xml_sort(clicon_handle h){
|
||||
return clicon_option_bool(h, "CLICON_XML_SORT");
|
||||
}
|
||||
|
||||
/*-- Specific option access functions for YANG options w type conversion--*/
|
||||
int clicon_cli_genmodel(clicon_handle h);
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ int xml_chardata_encode(char **escp, char *fmt, ...);
|
|||
int uri_percent_decode(char *enc, char **str);
|
||||
const char *clicon_int2str(const map_str2int *mstab, int i);
|
||||
int clicon_str2int(const map_str2int *mstab, char *str);
|
||||
|
||||
int nodeid_split(char *nodeid, char **prefix, char **id);
|
||||
#ifndef HAVE_STRNDUP
|
||||
char *clicon_strndup (const char *, size_t);
|
||||
#endif /* ! HAVE_STRNDUP */
|
||||
|
|
|
|||
|
|
@ -45,6 +45,8 @@
|
|||
* namespace (rfc6241 3.1)
|
||||
*/
|
||||
#define DEFAULT_XML_RPC_NAMESPACE "urn:ietf:params:xml:ns:netconf:base:1.0"
|
||||
/* default namespace statement, such as in <rpc xmlns="..."> */
|
||||
#define DEFAULT_XMLNS "xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\""
|
||||
|
||||
/*
|
||||
* Types
|
||||
|
|
@ -84,14 +86,13 @@ typedef int (xml_applyfn_t)(cxobj *x, void *arg);
|
|||
#define XML_FLAG_CHANGE 0x08 /* Node is changed (commits) or child changed rec */
|
||||
#define XML_FLAG_NONE 0x10 /* Node is added as NONE */
|
||||
|
||||
|
||||
/* Iterate through modules to find the matching datanode
|
||||
* or rpc if no xmlns attribute specifies namespace.
|
||||
* This is loose semantics of finding namespaces.
|
||||
* This is lazy non-strict semantics of finding namespaces.
|
||||
* And it is wrong, but is the way Clixon originally was written."
|
||||
* @see CLICON_XML_NS_ITERATE clixon configure option
|
||||
* @see CLICON_XML_NS_STRICT clixon configure option
|
||||
*/
|
||||
extern int _CLICON_XML_NS_ITERATE;
|
||||
extern int _CLICON_XML_NS_STRICT;
|
||||
|
||||
/*
|
||||
* Prototypes
|
||||
|
|
@ -102,6 +103,7 @@ int xml_name_set(cxobj *xn, char *name);
|
|||
char *xml_prefix(cxobj *xn);
|
||||
int xml_prefix_set(cxobj *xn, char *name);
|
||||
int xml2ns(cxobj *x, char *localname, char **namespace);
|
||||
int xmlns_set(cxobj *x, char *prefix, char *namespace);
|
||||
cxobj *xml_parent(cxobj *xn);
|
||||
int xml_parent_set(cxobj *xn, cxobj *parent);
|
||||
|
||||
|
|
@ -117,7 +119,9 @@ int xml_type_set(cxobj *xn, enum cxobj_type type);
|
|||
|
||||
int xml_child_nr(cxobj *xn);
|
||||
int xml_child_nr_type(cxobj *xn, enum cxobj_type type);
|
||||
int xml_child_nr_notype(cxobj *xn, enum cxobj_type type);
|
||||
cxobj *xml_child_i(cxobj *xn, int i);
|
||||
cxobj *xml_child_i_type(cxobj *xn, int i, enum cxobj_type type);
|
||||
cxobj *xml_child_i_set(cxobj *xt, int i, cxobj *xc);
|
||||
cxobj *xml_child_each(cxobj *xparent, cxobj *xprev, enum cxobj_type type);
|
||||
|
||||
|
|
@ -139,6 +143,7 @@ char *xml_body(cxobj *xn);
|
|||
cxobj *xml_body_get(cxobj *xn);
|
||||
char *xml_find_type_value(cxobj *xn_parent, char *prefix,
|
||||
char *name, enum cxobj_type type);
|
||||
cxobj *xml_find_type(cxobj *xn_parent, char *prefix, char *name, enum cxobj_type type);
|
||||
char *xml_find_value(cxobj *xn_parent, char *name);
|
||||
char *xml_find_body(cxobj *xn, char *name);
|
||||
cxobj *xml_find_body_obj(cxobj *xt, char *name, char *val);
|
||||
|
|
|
|||
|
|
@ -43,10 +43,13 @@
|
|||
*/
|
||||
int xml2txt(FILE *f, cxobj *x, int level);
|
||||
int xml2cli(FILE *f, cxobj *x, char *prepend, enum genmodel_type gt);
|
||||
int xml_yang_root(cxobj *x, cxobj **xr);
|
||||
int xmlns_assign(cxobj *x);
|
||||
int xml_yang_validate_rpc(cxobj *xrpc, cbuf *cbret);
|
||||
int xml_yang_validate_add(cxobj *xt, cbuf *cbret);
|
||||
int xml_yang_validate_all(cxobj *xt, cbuf *cbret);
|
||||
int xml_yang_validate_all_top(cxobj *xt, cbuf *cbret);
|
||||
int xml_yang_find_non_strict(cxobj *x, yang_spec *yspec, yang_stmt **y);
|
||||
int xml2cvec(cxobj *xt, yang_stmt *ys, cvec **cvv0);
|
||||
int cvec2xml_1(cvec *cvv, char *toptag, cxobj *xp, cxobj **xt0);
|
||||
int xml_diff(yang_spec *yspec, cxobj *xt1, cxobj *xt2,
|
||||
|
|
@ -64,8 +67,7 @@ int xml_sanity(cxobj *x, void *arg);
|
|||
int xml_non_config_data(cxobj *xt, void *arg);
|
||||
int xml_spec_populate_rpc(clicon_handle h, cxobj *x, yang_spec *yspec);
|
||||
int xml_spec_populate(cxobj *x, void *arg);
|
||||
int api_path2xpath_cvv(yang_spec *yspec, cvec *cvv, int offset, cbuf *xpath);
|
||||
int api_path2xpath(yang_spec *yspec, char *api_path, cbuf *xpath);
|
||||
int api_path2xpath(yang_spec *yspec, cvec *cvv, int offset, cbuf *xpath);
|
||||
int api_path2xml(char *api_path, yang_spec *yspec, cxobj *xtop,
|
||||
yang_class nodeclass, cxobj **xpathp, yang_node **ypathp);
|
||||
int xml_merge(cxobj *x0, cxobj *x1, yang_spec *yspec, char **reason);
|
||||
|
|
|
|||
|
|
@ -37,14 +37,16 @@
|
|||
#define _CLIXON_XML_SORT_H
|
||||
|
||||
/* Sort and binary search of XML children
|
||||
* Experimental
|
||||
* XXX This variable is a kludge since low-level functions xml_merge/xml_diff calls
|
||||
* match_base_child without handle
|
||||
* @see clicon_xml_sort
|
||||
*/
|
||||
extern int xml_child_sort;
|
||||
|
||||
/*
|
||||
* Prototypes
|
||||
*/
|
||||
int xml_child_spec(char *name, cxobj *xp, yang_spec *yspec, yang_stmt **yp);
|
||||
int xml_child_spec(cxobj *x, cxobj *xp, yang_spec *yspec, yang_stmt **yp);
|
||||
int xml_cmp(const void* arg1, const void* arg2);
|
||||
int xml_sort(cxobj *x0, void *arg);
|
||||
cxobj *xml_search(cxobj *x, char *name, int yangi, enum rfc_6020 keyword, int keynr, char **keyvec, char **keyval);
|
||||
|
|
@ -53,6 +55,6 @@ int xml_insert_pos(cxobj *x0, char *name, int yangi, enum rfc_6020 keyword,
|
|||
int upper);
|
||||
cxobj *xml_match(cxobj *x0, char *name, enum rfc_6020 keyword, int keynr, char **keyvec, char **keyval);
|
||||
int xml_sort_verify(cxobj *x, void *arg);
|
||||
int match_base_child(cxobj *x0, cxobj *x1c, cxobj **x0cp, yang_stmt *yc);
|
||||
int match_base_child(cxobj *x0, cxobj *x1c, cxobj **x0cp, int xml_sort, yang_stmt *yc);
|
||||
|
||||
#endif /* _CLIXON_XML_SORT_H */
|
||||
|
|
|
|||
|
|
@ -252,17 +252,16 @@ yang_stmt *yn_each(yang_node *yn, yang_stmt *ys);
|
|||
char *yang_key2str(int keyword);
|
||||
char *yarg_prefix(yang_stmt *ys);
|
||||
char *yarg_id(yang_stmt *ys);
|
||||
int yang_nodeid_split(char *nodeid, char **prefix, char **id);
|
||||
int ys_module_by_xml(yang_spec *ysp, struct xml *xt, yang_stmt **ymodp);
|
||||
yang_stmt *ys_module(yang_stmt *ys);
|
||||
yang_spec *ys_spec(yang_stmt *ys);
|
||||
yang_stmt *yang_find_module_by_prefix(yang_stmt *ys, char *prefix);
|
||||
yang_stmt *yang_find_module_by_namespace(yang_spec *yspec, char *namespace);
|
||||
yang_stmt *yang_find_module_by_name(yang_spec *yspec, char *name);
|
||||
yang_stmt *yang_find(yang_node *yn, int keyword, const char *argument);
|
||||
int yang_match(yang_node *yn, int keyword, char *argument);
|
||||
yang_stmt *yang_find_datanode(yang_node *yn, char *argument);
|
||||
yang_stmt *yang_find_schemanode(yang_node *yn, char *argument);
|
||||
yang_stmt *yang_find_topnode(yang_spec *ysp, char *name, yang_class class);
|
||||
char *yang_find_myprefix(yang_stmt *ys);
|
||||
char *yang_find_mynamespace(yang_stmt *ys);
|
||||
int yang_order(yang_stmt *y);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue