mirror of
				https://gitlab.labs.nic.cz/labs/bird.git
				synced 2024-05-11 16:54:54 +00:00 
			
		
		
		
	Conf: Show the line:char position where the syntax error happens
This commit is contained in:
		| @@ -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_INPUT(buf,result,max) result = cf_read_hook(buf, max, ifs->fd); | ||||||
| #define YY_NO_UNPUT | #define YY_NO_UNPUT | ||||||
| #define YY_FATAL_ERROR(msg) cf_error(msg) | #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 void cf_include(char *arg, int alen); | ||||||
| static int check_eof(void); | static int check_eof(void); | ||||||
| @@ -313,7 +314,7 @@ else: { | |||||||
|  |  | ||||||
| {WHITE}+ | {WHITE}+ | ||||||
|  |  | ||||||
| \n	ifs->lino++; | \n	ifs->lino++; ifs->chno = 0; | ||||||
|  |  | ||||||
| #	BEGIN(COMMENT); | #	BEGIN(COMMENT); | ||||||
|  |  | ||||||
| @@ -323,13 +324,14 @@ else: { | |||||||
|  |  | ||||||
| <COMMENT>\n { | <COMMENT>\n { | ||||||
|   ifs->lino++; |   ifs->lino++; | ||||||
|  |   ifs->chno = 0; | ||||||
|   BEGIN(INITIAL); |   BEGIN(INITIAL); | ||||||
| } | } | ||||||
|  |  | ||||||
| <COMMENT>. | <COMMENT>. | ||||||
|  |  | ||||||
| <CCOMM>\*\/	BEGIN(INITIAL); | <CCOMM>\*\/	BEGIN(INITIAL); | ||||||
| <CCOMM>\n	ifs->lino++; | <CCOMM>\n	ifs->lino++; ifs->chno = 0; | ||||||
| <CCOMM>\/\*	cf_error("Comment nesting not supported"); | <CCOMM>\/\*	cf_error("Comment nesting not supported"); | ||||||
| <CCOMM><<EOF>>	cf_error("Unterminated comment"); | <CCOMM><<EOF>>	cf_error("Unterminated comment"); | ||||||
| <CCOMM>. | <CCOMM>. | ||||||
|   | |||||||
| @@ -512,6 +512,7 @@ cf_error(const char *msg, ...) | |||||||
|   va_end(args); |   va_end(args); | ||||||
|   new_config->err_msg = cfg_strdup(buf); |   new_config->err_msg = cfg_strdup(buf); | ||||||
|   new_config->err_lino = ifs->lino; |   new_config->err_lino = ifs->lino; | ||||||
|  |   new_config->err_chno = ifs->chno - ifs->toklen + 1; | ||||||
|   new_config->err_file_name = ifs->file_name; |   new_config->err_file_name = ifs->file_name; | ||||||
|   cf_lex_unwind(); |   cf_lex_unwind(); | ||||||
|   longjmp(conf_jmpbuf, 1); |   longjmp(conf_jmpbuf, 1); | ||||||
|   | |||||||
| @@ -47,6 +47,7 @@ struct config { | |||||||
|   u32 watchdog_timeout;			/* Watchdog timeout (in seconds, 0 = disabled) */ |   u32 watchdog_timeout;			/* Watchdog timeout (in seconds, 0 = disabled) */ | ||||||
|   char *err_msg;			/* Parser error message */ |   char *err_msg;			/* Parser error message */ | ||||||
|   int err_lino;				/* Line containing error */ |   int err_lino;				/* Line containing error */ | ||||||
|  |   int err_chno;				/* Character where the parser stopped */ | ||||||
|   char *err_file_name;			/* File name containing error */ |   char *err_file_name;			/* File name containing error */ | ||||||
|   char *file_name;			/* Name of main configuration file */ |   char *file_name;			/* Name of main configuration file */ | ||||||
|   int file_fd;				/* File descriptor 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 */ |   char *file_name;			/* File name */ | ||||||
|   int fd;				/* File descriptor */ |   int fd;				/* File descriptor */ | ||||||
|   int lino;				/* Current line num */ |   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 */ |   int depth;				/* Include depth, 0 = cannot include */ | ||||||
|  |  | ||||||
|   struct include_file_stack *prev;	/* Previous record in stack */ |   struct include_file_stack *prev;	/* Previous record in stack */ | ||||||
| @@ -147,7 +150,6 @@ struct include_file_stack { | |||||||
|  |  | ||||||
| extern struct include_file_stack *ifs; | extern struct include_file_stack *ifs; | ||||||
|  |  | ||||||
|  |  | ||||||
| int cf_lex(void); | int cf_lex(void); | ||||||
| void cf_lex_init(int is_cli, struct config *c); | void cf_lex_init(int is_cli, struct config *c); | ||||||
| void cf_lex_unwind(void); | void cf_lex_unwind(void); | ||||||
|   | |||||||
| @@ -213,7 +213,7 @@ read_config(void) | |||||||
|   if (!unix_read_config(&conf, config_name)) |   if (!unix_read_config(&conf, config_name)) | ||||||
|     { |     { | ||||||
|       if (conf->err_msg) |       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 |       else | ||||||
| 	die("Unable to open configuration file %s: %m", config_name); | 	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 (!unix_read_config(&conf, config_name)) | ||||||
|     { |     { | ||||||
|       if (conf->err_msg) |       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 |       else | ||||||
| 	log(L_ERR "Unable to open configuration file %s: %m", config_name); | 	log(L_ERR "Unable to open configuration file %s: %m", config_name); | ||||||
|       config_free(conf); |       config_free(conf); | ||||||
| @@ -251,7 +251,7 @@ cmd_read_config(char *name) | |||||||
|   if (!unix_read_config(&conf, name)) |   if (!unix_read_config(&conf, name)) | ||||||
|     { |     { | ||||||
|       if (conf->err_msg) |       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 |       else | ||||||
| 	cli_msg(8002, "%s: %m", name); | 	cli_msg(8002, "%s: %m", name); | ||||||
|       config_free(conf); |       config_free(conf); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user