X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvlib%2Fcli.c;h=6d83e2a3ce3141e8ecacc8670ebfea27c2b857a4;hb=5fed42ad7b3b138f7e734d38d3a2e78d7882681e;hp=4e8f3ae5ae58684c748c882ec8420834d367b55d;hpb=900cbadde906a000ce1b431fc637a9c0f7089339;p=vpp.git diff --git a/src/vlib/cli.c b/src/vlib/cli.c index 4e8f3ae5ae5..6d83e2a3ce3 100644 --- a/src/vlib/cli.c +++ b/src/vlib/cli.c @@ -552,6 +552,31 @@ vlib_cli_dispatch_sub_commands (vlib_main_t * vm, parent_command_index); unformat_free (&sub_input); } + else if (unformat (input, "leak-check %U", + unformat_vlib_cli_sub_input, &sub_input)) + { + u8 *leak_report; + clib_mem_trace (1); + error = + vlib_cli_dispatch_sub_commands (vm, cm, &sub_input, + parent_command_index); + unformat_free (&sub_input); + + /* Otherwise, the clib_error_t shows up as a leak... */ + if (error) + { + vlib_cli_output (vm, "%v", error->what); + clib_error_free (error); + error = 0; + } + + (void) clib_mem_trace_enable_disable (0); + leak_report = format (0, "%U", format_mheap, clib_mem_get_heap (), + 1 /* verbose, i.e. print leaks */ ); + clib_mem_trace (0); + vlib_cli_output (vm, "%v", leak_report); + vec_free (leak_report); + } else if (unformat_user (input, unformat_vlib_cli_sub_command, vm, parent, &c)) @@ -684,7 +709,7 @@ vlib_unix_error_report (vlib_main_t * vm, clib_error_t * error) } /* Process CLI input. */ -void +int vlib_cli_input (vlib_main_t * vm, unformat_input_t * input, vlib_cli_output_function_t * function, uword function_arg) @@ -694,6 +719,7 @@ vlib_cli_input (vlib_main_t * vm, clib_error_t *error; vlib_cli_output_function_t *save_function; uword save_function_arg; + int rv = 0; save_function = cp->output_function; save_function_arg = cp->output_function_arg; @@ -713,11 +739,15 @@ vlib_cli_input (vlib_main_t * vm, { vlib_cli_output (vm, "%v", error->what); vlib_unix_error_report (vm, error); + /* clib_error_return is unfortunately often called with a '0' + return code */ + rv = error->code != 0 ? error->code : -1; clib_error_free (error); } cp->output_function = save_function; cp->output_function_arg = save_function_arg; + return rv; } /* Output to current CLI connection. */