lib: Improve error reporting from broken config files

* command.h: (config_from_file) Add variable to interface for line
      number reporting.
    * command.c: (config_from_file) Set & increment 'line_num' while parsing.
    * vty.c: (vty_read_file) Report parse errors in the correct order to
      stderr, with added line numbers.

Conflicts:
	lib/command.c
	lib/vty.c

Integrated in changes made to continue loading code even after failure
to read a line in properly as part of this cherry-pick
This commit is contained in:
Steve Hill 2009-07-28 16:36:14 -04:00 committed by Donald Sharp
parent c8a96aef3e
commit 13fbc82d86
3 changed files with 22 additions and 9 deletions

View File

@ -2777,14 +2777,18 @@ cmd_execute_command_strict (vector vline, struct vty *vty,
/* Configuration make from file. */
int
config_from_file (struct vty *vty, FILE *fp)
config_from_file (struct vty *vty, FILE *fp, unsigned int *line_num)
{
int ret, error_ret=0;
int saved_node;
*line_num = 0;
vector vline;
while (fgets (vty->buf, VTY_BUFSIZ, fp))
{
if (!error_ret)
++(*line_num);
vline = cmd_make_strvec (vty->buf);
/* In case of comment line */

View File

@ -532,7 +532,7 @@ extern void cmd_free_strvec (vector);
extern vector cmd_describe_command (vector, struct vty *, int *status);
extern char **cmd_complete_command (vector, struct vty *, int *status);
extern const char *cmd_prompt (enum node_type);
extern int config_from_file (struct vty *, FILE *);
extern int config_from_file (struct vty *, FILE *, unsigned int *line_num);
extern enum node_type node_parent (enum node_type);
extern int cmd_execute_command (vector, struct vty *, struct cmd_element **, int);
extern int cmd_execute_command_strict (vector, struct vty *, struct cmd_element **);

View File

@ -2234,28 +2234,37 @@ vty_read_file (FILE *confp)
{
int ret;
struct vty *vty;
unsigned int line_num = 0;
vty = vty_new ();
vty->fd = 0; /* stdout */
vty->type = VTY_TERM;
vty->fd = dup(STDERR_FILENO); /* vty_close() will close this */
if (vty->fd < 0)
{
/* Fine, we couldn't make a new fd. vty_close doesn't close stdout. */
vty->fd = STDOUT_FILENO;
}
vty->type = VTY_FILE;
vty->node = CONFIG_NODE;
/* Execute configuration file */
ret = config_from_file (vty, confp);
ret = config_from_file (vty, confp, &line_num);
/* Flush any previous errors before printing messages below */
buffer_flush_all (vty->obuf, vty->fd);
if ( !((ret == CMD_SUCCESS) || (ret == CMD_ERR_NOTHING_TODO)) )
{
switch (ret)
{
case CMD_ERR_AMBIGUOUS:
fprintf (stderr, "\nAmbiguous command.");
fprintf (stderr, "*** Error reading config: Ambiguous command.\n");
break;
case CMD_ERR_NO_MATCH:
fprintf (stderr, "\nThere is no such command.");
fprintf (stderr, "*** Error reading config: There is no such command.\n");
break;
}
fprintf (stderr, "\nError occured during reading below line.\n%s\n",
vty->error_buf);
fprintf (stderr, "*** Error occured processing line %u, below:\n%s\n",
line_num, vty->error_buf);
}
vty_close (vty);