diff --git a/apps/cli/cli_show.c b/apps/cli/cli_show.c
index 05df9061..e5a6d4c4 100644
--- a/apps/cli/cli_show.c
+++ b/apps/cli/cli_show.c
@@ -387,19 +387,28 @@ show_yang(clicon_handle h,
cvec *cvv,
cvec *argv)
{
+ int retval = -1;
yang_stmt *yn;
char *str = NULL;
yang_stmt *yspec;
yspec = clicon_dbspec_yang(h);
if (cvec_len(argv) > 0){
- str = cv_string_get(cvec_i(argv, 0));
- yn = yang_find(yspec, 0, str);
+ if ((str = cv_string_get(cvec_i(argv, 0))) != NULL &&
+ (yn = yang_find(yspec, 0, str)) != NULL)
+ if (yang_print_cb(stdout, yn, cligen_output) < 0)
+ goto done;
}
- else
- yn = yspec;
- yang_print_cb(stdout, yn, cligen_output); /* Doesnt use cligen_output */
- return 0;
+ else{
+ yn = NULL;
+ while ((yn = yn_each(yspec, yn)) != NULL) {
+ if (yang_print_cb(stdout, yn, cligen_output) < 0)
+ goto done;
+ }
+ }
+ retval = 0;
+ done:
+ return retval;
}
/*! Common internal show routine for several show cli callbacks
diff --git a/lib/clixon/clixon_yang.h b/lib/clixon/clixon_yang.h
index 428180af..aa2b970a 100644
--- a/lib/clixon/clixon_yang.h
+++ b/lib/clixon/clixon_yang.h
@@ -261,7 +261,7 @@ yang_stmt *yang_choice(yang_stmt *y);
int yang_order(yang_stmt *y);
int yang_print_cb(FILE *f, yang_stmt *yn, clicon_output_cb *fn);
int yang_print(FILE *f, yang_stmt *yn);
-int yang_print_cbuf(cbuf *cb, yang_stmt *yn, int marginal);
+int yang_print_cbuf(cbuf *cb, yang_stmt *yn, int marginal, int pretty);
int yang_deviation(yang_stmt *ys, void *arg);
int yang_spec_print(FILE *f, yang_stmt *yspec);
int yang_spec_dump(yang_stmt *yspec, int debuglevel);
diff --git a/lib/src/clixon_json.c b/lib/src/clixon_json.c
index bdc57e32..4b774b75 100644
--- a/lib/src/clixon_json.c
+++ b/lib/src/clixon_json.c
@@ -721,7 +721,6 @@ json_metadata_encoding(cbuf *cb,
* @param[in] xp XML node, parent of xa
* @param[in] yp Yang spec of xp
* @param[in] level Indentation level
- * @param[in] level Indentation level
* @param[in] pretty Pretty-print output (2 means debug)
* @param[in] modname Name of yang module
* @param[in,out] metacb Encode into cbuf
diff --git a/lib/src/clixon_xml_io.c b/lib/src/clixon_xml_io.c
index 3aeb8b92..5b934134 100644
--- a/lib/src/clixon_xml_io.c
+++ b/lib/src/clixon_xml_io.c
@@ -742,8 +742,10 @@ clixon_xml_parse_file(FILE *fp,
* @code
* cxobj *xt = NULL;
* cxobj *xerr = NULL;
- * if (clixon_xml_parse_string(str, YB_MODULE, yspec, &xt, &xerr) < 0)
+ * if ((ret = clixon_xml_parse_string(str, YB_MODULE, yspec, &xt, &xerr)) < 0)
* err;
+ * if (ret == 0)
+ * // use xerr
* if (xml_rootchild(xt, 0, &xt) < 0) # If you want to remove TOP
* err;
* @endcode
diff --git a/lib/src/clixon_yang.c b/lib/src/clixon_yang.c
index 0f527589..b8bac38e 100644
--- a/lib/src/clixon_yang.c
+++ b/lib/src/clixon_yang.c
@@ -1774,6 +1774,8 @@ quotedstring(char *s)
* @param[in] f File to print to.
* @param[in] yn Yang node to print
* @param[in] fn Callback to make print function
+ * @retval 0 OK
+ * @retval -1 Error
* @see yang_print_cbuf
*/
int
@@ -1788,7 +1790,7 @@ yang_print_cb(FILE *f,
clicon_err(OE_YANG, errno, "cbuf_new");
goto done;
}
- if (yang_print_cbuf(cb, yn, 0) < 0)
+ if (yang_print_cbuf(cb, yn, 0, 1) < 0)
goto done;
(*fn)(f, "%s", cbuf_get(cb));
if (cb)
@@ -1876,9 +1878,12 @@ yang_spec_dump(yang_stmt *yspec,
* @param[in] cb Cligen buffer. This is where the pretty print is.
* @param[in] yn Yang node to print
* @param[in] marginal Tab indentation, mainly for recursion.
+ * @param[in] pretty Pretty-print output
+ * @retval 0 OK
+ * @retval -1 Error
* @code
* cbuf *cb = cbuf_new();
- * yang_print_cbuf(cb, yn, 0);
+ * yang_print_cbuf(cb, yn, 0, 1);
* // output is in cbuf_buf(cb);
* cbuf_free(cb);
* @endcode
@@ -1886,31 +1891,58 @@ yang_spec_dump(yang_stmt *yspec,
int
yang_print_cbuf(cbuf *cb,
yang_stmt *yn,
- int marginal)
+ int marginal,
+ int pretty)
{
- yang_stmt *ys = NULL;
+ int retval = -1;
+ yang_stmt *ys;
+ enum rfc_6020 keyw;
+ char *arg;
- while ((ys = yn_each(yn, ys)) != NULL) {
- if (ys->ys_keyword == Y_UNKNOWN){ /* dont print unknown - proxy for extension*/
- cprintf(cb, "%*s", marginal-1, "");
- }
- else
- cprintf(cb, "%*s%s", marginal, "", yang_key2str(ys->ys_keyword));
- if (ys->ys_argument){
- if (quotedstring(ys->ys_argument))
- cprintf(cb, " \"%s\"", ys->ys_argument);
- else
- cprintf(cb, " %s", ys->ys_argument);
- }
- if (ys->ys_len){
- cprintf(cb, " {\n");
- yang_print_cbuf(cb, ys, marginal+3);
- cprintf(cb, "%*s%s\n", marginal, "", "}");
- }
- else
- cprintf(cb, ";\n");
+ if (yn == NULL || cb == NULL){
+ clicon_err(OE_YANG, EINVAL, "cb or yn is NULL");
+ goto done;
}
- return 0;
+ keyw = yang_keyword_get(yn);
+ if (keyw == Y_UNKNOWN){ /* dont print unknown - proxy for extension*/
+ if (pretty)
+ cprintf(cb, "%*s", marginal-1, "");
+ }
+ else{
+ if (pretty)
+ cprintf(cb, "%*s%s", marginal, "", yang_key2str(keyw));
+ else
+ cprintf(cb, "%s", yang_key2str(keyw));
+ }
+ arg = yang_argument_get(yn);
+ if (arg){
+ if (quotedstring(arg))
+ cprintf(cb, " \"%s\"", arg);
+ else
+ cprintf(cb, " %s", arg);
+ }
+ if (yang_len_get(yn)){
+ cprintf(cb, " {");
+ if (pretty)
+ cprintf(cb, "\n");
+ ys = NULL;
+ while ((ys = yn_each(yn, ys)) != NULL) {
+ if (yang_print_cbuf(cb, ys, marginal + PRETTYPRINT_INDENT, pretty) < 0)
+ goto done;
+ }
+ if (pretty)
+ cprintf(cb, "%*s%s\n", marginal, "", "}");
+ else
+ cprintf(cb, "}");
+ }
+ else{
+ cprintf(cb, ";");
+ if (pretty)
+ cprintf(cb, "\n");
+ }
+ retval = 0;
+ done:
+ return retval;
}
/*! Yang deviation/deviate
diff --git a/lib/src/clixon_yang_parse_lib.c b/lib/src/clixon_yang_parse_lib.c
index 9d10a524..83f18466 100644
--- a/lib/src/clixon_yang_parse_lib.c
+++ b/lib/src/clixon_yang_parse_lib.c
@@ -918,11 +918,11 @@ yang_parse_find_match(clicon_handle h,
uint32_t *revactual,
cbuf *fbuf)
{
- int retval = -1;
- cbuf *regex = NULL;
- cxobj *x;
- cxobj *xc;
- char *dir;
+ int retval = -1;
+ cbuf *regex = NULL;
+ cxobj *x;
+ cxobj *xc;
+ char *dir;
cvec *cvv = NULL;
cg_var *cv = NULL;
cg_var *bestcv = NULL;
@@ -961,6 +961,8 @@ yang_parse_find_match(clicon_handle h,
*/
if (ndp != 0){
cprintf(fbuf, "%s/%s", dir, dp[ndp-1].d_name);
+ if (dp)
+ free(dp);
retval = 1;
goto done;
}
diff --git a/test/test_upgrade_checkold.sh b/test/test_upgrade_checkold.sh
index 3da12564..574ab9ef 100755
--- a/test/test_upgrade_checkold.sh
+++ b/test/test_upgrade_checkold.sh
@@ -106,7 +106,7 @@ EOF
fi
for modstate in true false; do
if $modstate; then
- modstatestr="default42A2016-01-01urn:example:a"
+ modstatestr="default42A2016-01-01urn:example:a"
# modstatestr="42A2016-01-01urn:example:a"
else
modstatestr=""
diff --git a/test/valgrind-clixon.supp b/test/valgrind-clixon.supp
index 8be3dc21..b7f6dd90 100644
--- a/test/valgrind-clixon.supp
+++ b/test/valgrind-clixon.supp
@@ -50,4 +50,12 @@
fun:*
fun:*
fun:_dl_map_object
-}
\ No newline at end of file
+}
+{
+ supp8
+ Memcheck:Leak
+ match-leak-kinds: reachable
+ fun:*
+ fun:*
+ fun:_dl_close_worker
+}