diff options
Diffstat (limited to 'lib/command.c')
| -rw-r--r-- | lib/command.c | 50 |
1 files changed, 24 insertions, 26 deletions
diff --git a/lib/command.c b/lib/command.c index 9eb43db94f..593822a66e 100644 --- a/lib/command.c +++ b/lib/command.c @@ -262,7 +262,10 @@ cmd_make_strvec (const char *string) // if the entire string was whitespace or a comment, return if (*copy == '\0' || *copy == '!' || *copy == '#') + { + XFREE (MTYPE_TMP, copystart); return NULL; + } vector strvec = vector_init (VECTOR_MIN_SIZE); const char *delim = " \n\r\t", *tok = NULL; @@ -546,7 +549,7 @@ completions_to_vec (struct list *completions) } if (!exists) - vector_set (comps, copy_cmd_token (token)); + vector_set (comps, token); } // sort completions @@ -560,7 +563,7 @@ completions_to_vec (struct list *completions) { vector_set_index (comps, vector_active (comps), NULL); memmove (comps->index + 1, comps->index, (comps->alloced - 1) * sizeof (void *)); - vector_set_index (comps, 0, copy_cmd_token (cr)); + vector_set_index (comps, 0, cr); } return comps; @@ -584,13 +587,7 @@ cmd_complete_command_real (vector vline, struct vty *vty, int *status) if (MATCHER_ERROR(rv)) { - switch (rv) - { - case MATCHER_AMBIGUOUS: - *status = CMD_ERR_AMBIGUOUS; - default: - *status = CMD_ERR_NO_MATCH; - } + *status = CMD_ERR_NO_MATCH; return NULL; } @@ -687,20 +684,17 @@ cmd_complete_command (vector vline, struct vty *vty, int *status) struct cmd_token *token = vector_slot (initial_comps, i); if (token->type == WORD_TKN) vector_set (comps, token); - else - del_cmd_token (token); } vector_free (initial_comps); // copy completions text into an array of char* - ret = XMALLOC (MTYPE_TMP, vector_active (comps) * sizeof (char *) + 1); + ret = XMALLOC (MTYPE_TMP, (vector_active (comps)+1) * sizeof (char *)); unsigned int i; for (i = 0; i < vector_active (comps); i++) { struct cmd_token *token = vector_slot (comps, i); ret[i] = XSTRDUP (MTYPE_TMP, token->text); vector_unset (comps, i); - del_cmd_token (token); } // set the last element to NULL, because this array is used in // a Readline completion_generator function which expects NULL @@ -778,11 +772,11 @@ static int cmd_execute_command_real (vector vline, enum filter_type filter, struct vty *vty, - struct cmd_element **cmd) + const struct cmd_element **cmd) { struct list *argv_list; enum matcher_rv status; - struct cmd_element *matched_element = NULL; + const struct cmd_element *matched_element = NULL; struct graph *cmdgraph = cmd_node_graph (cmdvec, vty->node); status = command_match (cmdgraph, vline, &argv_list, &matched_element); @@ -792,6 +786,7 @@ cmd_execute_command_real (vector vline, // if matcher error, return corresponding CMD_ERR if (MATCHER_ERROR(status)) + { switch (status) { case MATCHER_INCOMPLETE: @@ -801,6 +796,7 @@ cmd_execute_command_real (vector vline, default: return CMD_ERR_NO_MATCH; } + } // build argv array from argv list struct cmd_token **argv = XMALLOC (MTYPE_TMP, argv_list->count * sizeof (struct cmd_token *)); @@ -820,6 +816,7 @@ cmd_execute_command_real (vector vline, // delete list and cmd_token's in it list_delete (argv_list); + XFREE (MTYPE_TMP, argv); return ret; } @@ -840,14 +837,16 @@ cmd_execute_command_real (vector vline, * as to why no command could be executed. */ int -cmd_execute_command (vector vline, struct vty *vty, struct cmd_element **cmd, - int vtysh) { +cmd_execute_command (vector vline, struct vty *vty, + const struct cmd_element **cmd, + int vtysh) +{ int ret, saved_ret = 0; enum node_type onode, try_node; onode = try_node = vty->node; - if ( cmd_try_do_shortcut(vty->node, vector_slot(vline, 0) ) ) + if (cmd_try_do_shortcut(vty->node, vector_slot(vline, 0))) { vector shifted_vline; unsigned int index; @@ -867,7 +866,6 @@ cmd_execute_command (vector vline, struct vty *vty, struct cmd_element **cmd, return ret; } - saved_ret = ret = cmd_execute_command_real (vline, FILTER_RELAXED, vty, cmd); if (vtysh) @@ -907,7 +905,7 @@ cmd_execute_command (vector vline, struct vty *vty, struct cmd_element **cmd, */ int cmd_execute_command_strict (vector vline, struct vty *vty, - struct cmd_element **cmd) + const struct cmd_element **cmd) { return cmd_execute_command_real(vline, FILTER_STRICT, vty, cmd); } @@ -925,7 +923,7 @@ cmd_execute_command_strict (vector vline, struct vty *vty, * as to why no command could be executed. */ int -command_config_read_one_line (struct vty *vty, struct cmd_element **cmd, int use_daemon) +command_config_read_one_line (struct vty *vty, const struct cmd_element **cmd, int use_daemon) { vector vline; int saved_node; @@ -2404,13 +2402,13 @@ del_cmd_token (struct cmd_token *token) if (!token) return; if (token->text) - free (token->text); + XFREE (MTYPE_CMD_TOKENS, token->text); if (token->desc) - free (token->desc); + XFREE (MTYPE_CMD_TOKENS, token->desc); if (token->arg) - free (token->arg); + XFREE (MTYPE_CMD_TOKENS, token->arg); - free (token); + XFREE (MTYPE_CMD_TOKENS, token); } struct cmd_token * @@ -2436,7 +2434,7 @@ del_cmd_element(struct cmd_element *cmd) } struct cmd_element * -copy_cmd_element(struct cmd_element *cmd) +copy_cmd_element(const struct cmd_element *cmd) { struct cmd_element *el = XMALLOC(MTYPE_CMD_TOKENS, sizeof (struct cmd_element)); el->string = cmd->string ? XSTRDUP(MTYPE_CMD_TOKENS, cmd->string) : NULL; |
