diff options
-rw-r--r-- | src/vlib/cli.c | 58 | ||||
-rw-r--r-- | src/vlib/cli.h | 1 | ||||
-rw-r--r-- | src/vlib/unix/main.c | 14 | ||||
-rw-r--r-- | src/vnet/ipsec/ipsec_cli.c | 2 |
4 files changed, 73 insertions, 2 deletions
diff --git a/src/vlib/cli.c b/src/vlib/cli.c index 01409b8b677..80da2d59992 100644 --- a/src/vlib/cli.c +++ b/src/vlib/cli.c @@ -199,6 +199,64 @@ unformat_vlib_cli_args (unformat_input_t *i, va_list *va) return 1; } +uword +unformat_vlib_cli_line (unformat_input_t *i, va_list *va) +{ + unformat_input_t *result = va_arg (*va, unformat_input_t *); + u8 *line = 0; + uword c; + int skip; + +next_line: + skip = 0; + + /* skip leading whitespace if any */ + unformat_skip_white_space (i); + + if (unformat_is_eof (i)) + return 0; + + while ((c = unformat_get_input (i)) != UNFORMAT_END_OF_INPUT) + { + if (c == '\\') + { + c = unformat_get_input (i); + + if (c == '\n') + { + if (!skip) + vec_add1 (line, '\n'); + skip = 0; + continue; + } + + if (!skip) + vec_add1 (line, '\\'); + + if (c == UNFORMAT_END_OF_INPUT) + break; + + if (!skip) + vec_add1 (line, c); + continue; + } + + if (c == '#') + skip = 1; + else if (c == '\n') + break; + + if (!skip) + vec_add1 (line, c); + } + + if (line == 0) + goto next_line; + + unformat_init_vector (result, line); + return 1; +} + /* Looks for string based sub-input formatted { SUB-INPUT }. */ uword unformat_vlib_cli_sub_input (unformat_input_t * i, va_list * args) diff --git a/src/vlib/cli.h b/src/vlib/cli.h index 32e46f9e0da..86913e9708c 100644 --- a/src/vlib/cli.h +++ b/src/vlib/cli.h @@ -205,6 +205,7 @@ clib_error_t *vlib_cli_register_parse_rule (struct vlib_main_t *vm, vlib_cli_parse_rule_t * c); uword unformat_vlib_cli_args (unformat_input_t *i, va_list *va); +unformat_function_t unformat_vlib_cli_line; uword unformat_vlib_cli_sub_input (unformat_input_t * i, va_list * args); /* Return an vector of strings consisting of possible auto-completions diff --git a/src/vlib/unix/main.c b/src/vlib/unix/main.c index 3710d8e8b68..fd8a7e863a1 100644 --- a/src/vlib/unix/main.c +++ b/src/vlib/unix/main.c @@ -347,8 +347,20 @@ startup_config_process (vlib_main_t * vm, if (vec_len (buf)) { + unformat_input_t in; unformat_init_vector (&sub_input, buf); - vlib_cli_input (vm, &sub_input, 0, 0); + + while (unformat_user (&sub_input, unformat_vlib_cli_line, &in)) + { + if (vlib_cli_input (vm, &in, 0, 0) != 0) + { + /* cli failed - stop */ + unformat_free (&in); + break; + } + unformat_free (&in); + } + /* frees buf for us */ unformat_free (&sub_input); } diff --git a/src/vnet/ipsec/ipsec_cli.c b/src/vnet/ipsec/ipsec_cli.c index e1263037c6c..df8f9378111 100644 --- a/src/vnet/ipsec/ipsec_cli.c +++ b/src/vnet/ipsec/ipsec_cli.c @@ -143,7 +143,7 @@ ipsec_sa_add_del_command_fn (vlib_main_t * vm, else if (unformat (line_input, "integ-alg %U", unformat_ipsec_integ_alg, &integ_alg)) ; - else if (unformat (line_input, " %U", unformat_tunnel, &tun)) + else if (unformat (line_input, "%U", unformat_tunnel, &tun)) { flags |= IPSEC_SA_FLAG_IS_TUNNEL; if (AF_IP6 == tunnel_get_af (&tun)) |