From e27336e054fafb4e712ddcbb326c67901f05aa3d Mon Sep 17 00:00:00 2001 From: Olof hagsand Date: Thu, 24 Nov 2022 17:34:32 +0100 Subject: [PATCH] C-API change yang_print: print top-level and add pretty-print parameter Test: Fix valgrind dlclose suppresion --- apps/cli/cli_show.c | 21 ++++++--- lib/clixon/clixon_yang.h | 2 +- lib/src/clixon_json.c | 1 - lib/src/clixon_xml_io.c | 4 +- lib/src/clixon_yang.c | 80 +++++++++++++++++++++++---------- lib/src/clixon_yang_parse_lib.c | 12 ++--- test/test_upgrade_checkold.sh | 2 +- test/valgrind-clixon.supp | 10 ++++- 8 files changed, 92 insertions(+), 40 deletions(-) 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 +}