From d50b0bc437f5ffd0d2c9f843217f8ed098c8d675 Mon Sep 17 00:00:00 2001 From: Jan Maria Matejka Date: Tue, 11 Sep 2018 16:55:41 +0200 Subject: [PATCH] Conf: Show the line:char position where the syntax error happens --- conf/cf-lex.l | 6 ++++-- conf/conf.c | 1 + conf/conf.h | 4 +++- sysdep/unix/main.c | 6 +++--- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/conf/cf-lex.l b/conf/cf-lex.l index c3154b36..9bbb3660 100644 --- a/conf/cf-lex.l +++ b/conf/cf-lex.l @@ -100,6 +100,7 @@ static struct include_file_stack *ifs_head; #define YY_INPUT(buf,result,max) result = cf_read_hook(buf, max, ifs->fd); #define YY_NO_UNPUT #define YY_FATAL_ERROR(msg) cf_error(msg) +#define YY_USER_ACTION ifs->chno += yyleng; ifs->toklen = yyleng; static void cf_include(char *arg, int alen); static int check_eof(void); @@ -313,7 +314,7 @@ else: { {WHITE}+ -\n ifs->lino++; +\n ifs->lino++; ifs->chno = 0; # BEGIN(COMMENT); @@ -323,13 +324,14 @@ else: { \n { ifs->lino++; + ifs->chno = 0; BEGIN(INITIAL); } . \*\/ BEGIN(INITIAL); -\n ifs->lino++; +\n ifs->lino++; ifs->chno = 0; \/\* cf_error("Comment nesting not supported"); <> cf_error("Unterminated comment"); . diff --git a/conf/conf.c b/conf/conf.c index 885e2e7e..8dbefe96 100644 --- a/conf/conf.c +++ b/conf/conf.c @@ -512,6 +512,7 @@ cf_error(const char *msg, ...) va_end(args); new_config->err_msg = cfg_strdup(buf); new_config->err_lino = ifs->lino; + new_config->err_chno = ifs->chno - ifs->toklen + 1; new_config->err_file_name = ifs->file_name; cf_lex_unwind(); longjmp(conf_jmpbuf, 1); diff --git a/conf/conf.h b/conf/conf.h index f174d352..5689fb67 100644 --- a/conf/conf.h +++ b/conf/conf.h @@ -47,6 +47,7 @@ struct config { u32 watchdog_timeout; /* Watchdog timeout (in seconds, 0 = disabled) */ char *err_msg; /* Parser error message */ int err_lino; /* Line containing error */ + int err_chno; /* Character where the parser stopped */ char *err_file_name; /* File name containing error */ char *file_name; /* Name of main configuration file */ int file_fd; /* File descriptor of main configuration file */ @@ -139,6 +140,8 @@ struct include_file_stack { char *file_name; /* File name */ int fd; /* File descriptor */ int lino; /* Current line num */ + int chno; /* Current char num (on current line) */ + int toklen; /* Current token length */ int depth; /* Include depth, 0 = cannot include */ struct include_file_stack *prev; /* Previous record in stack */ @@ -147,7 +150,6 @@ struct include_file_stack { extern struct include_file_stack *ifs; - int cf_lex(void); void cf_lex_init(int is_cli, struct config *c); void cf_lex_unwind(void); diff --git a/sysdep/unix/main.c b/sysdep/unix/main.c index 0912a9c5..d2380501 100644 --- a/sysdep/unix/main.c +++ b/sysdep/unix/main.c @@ -213,7 +213,7 @@ read_config(void) if (!unix_read_config(&conf, config_name)) { if (conf->err_msg) - die("%s, line %d: %s", conf->err_file_name, conf->err_lino, conf->err_msg); + die("%s:%d:%d %s", conf->err_file_name, conf->err_lino, conf->err_chno, conf->err_msg); else die("Unable to open configuration file %s: %m", config_name); } @@ -230,7 +230,7 @@ async_config(void) if (!unix_read_config(&conf, config_name)) { if (conf->err_msg) - log(L_ERR "%s, line %d: %s", conf->err_file_name, conf->err_lino, conf->err_msg); + log(L_ERR "%s:%d:%d %s", conf->err_file_name, conf->err_lino, conf->err_chno, conf->err_msg); else log(L_ERR "Unable to open configuration file %s: %m", config_name); config_free(conf); @@ -251,7 +251,7 @@ cmd_read_config(char *name) if (!unix_read_config(&conf, name)) { if (conf->err_msg) - cli_msg(8002, "%s, line %d: %s", conf->err_file_name, conf->err_lino, conf->err_msg); + cli_msg(8002, "%s:%d:%d %s", conf->err_file_name, conf->err_lino, conf->err_chno, conf->err_msg); else cli_msg(8002, "%s: %m", name); config_free(conf);