conf.c: pass lineno to handler funcs

This commit is contained in:
rofl0r 2018-12-18 23:36:04 +00:00 committed by rofl0r
parent b935dc85c3
commit 1186c297b4

View File

@ -91,7 +91,8 @@
* All configuration handling functions are REQUIRED to be defined * All configuration handling functions are REQUIRED to be defined
* with the same function template as below. * with the same function template as below.
*/ */
typedef int (*CONFFILE_HANDLER) (struct config_s *, const char *, regmatch_t[]); typedef int (*CONFFILE_HANDLER) (struct config_s *, const char *,
unsigned long, regmatch_t[]);
/* /*
* Define the pattern used by any directive handling function. The * Define the pattern used by any directive handling function. The
@ -106,7 +107,7 @@ typedef int (*CONFFILE_HANDLER) (struct config_s *, const char *, regmatch_t[]);
*/ */
#define HANDLE_FUNC(func) \ #define HANDLE_FUNC(func) \
int func(struct config_s* conf, const char* line, \ int func(struct config_s* conf, const char* line, \
regmatch_t match[]) unsigned long lineno, regmatch_t match[])
/* /*
* List all the handling functions. These are defined later, but they need * List all the handling functions. These are defined later, but they need
@ -369,7 +370,8 @@ config_free_regex (void)
* Returns 0 if a match was found and successfully processed; otherwise, * Returns 0 if a match was found and successfully processed; otherwise,
* a negative number is returned. * a negative number is returned.
*/ */
static int check_match (struct config_s *conf, const char *line) static int check_match (struct config_s *conf, const char *line,
unsigned long lineno)
{ {
regmatch_t match[RE_MAX_MATCHES]; regmatch_t match[RE_MAX_MATCHES];
unsigned int i; unsigned int i;
@ -380,7 +382,7 @@ static int check_match (struct config_s *conf, const char *line)
assert (directives[i].cre); assert (directives[i].cre);
if (!regexec if (!regexec
(directives[i].cre, line, RE_MAX_MATCHES, match, 0)) (directives[i].cre, line, RE_MAX_MATCHES, match, 0))
return (*directives[i].handler) (conf, line, match); return (*directives[i].handler) (conf, line, lineno, match);
} }
return -1; return -1;
@ -395,7 +397,7 @@ static int config_parse (struct config_s *conf, FILE * f)
unsigned long lineno = 1; unsigned long lineno = 1;
while (fgets (buffer, sizeof (buffer), f)) { while (fgets (buffer, sizeof (buffer), f)) {
if (check_match (conf, buffer)) { if (check_match (conf, buffer, lineno)) {
printf ("Syntax error on line %ld\n", lineno); printf ("Syntax error on line %ld\n", lineno);
return 1; return 1;
} }