commit 13ed2fb63f4915da96fcc7f8022480561a87567e from: Omar Polo date: Wed Jan 27 16:45:45 2021 UTC improve configuration parsing error commit - 40dc608f1fa19319e07a762a416073d6c9b5e2c2 commit + 13ed2fb63f4915da96fcc7f8022480561a87567e blob - 5668a4fd8a4d0771d06a5630b9ce59b3f1d7423c blob + 272a39d3499d0115c4ef3b9d777e29e152bba6db --- gmid.c +++ gmid.c @@ -32,7 +32,7 @@ struct vhost hosts[HOSTSLEN]; -int exfd, foreground, goterror; +int exfd, foreground; struct conf conf; @@ -292,37 +292,6 @@ load_local_cert(const char *hostname, const char *dir) } void -yyerror(const char *msg) -{ - goterror = 1; - fprintf(stderr, "%d: %s\n", yylineno, msg); -} - -int -parse_portno(const char *p) -{ - const char *errstr; - int n; - - n = strtonum(p, 0, UINT16_MAX, &errstr); - if (errstr != NULL) - errx(1, "port number is %s: %s", errstr, p); - return n; -} - -void -parse_conf(const char *path) -{ - if ((yyin = fopen(path, "r")) == NULL) - fatal("cannot open config %s", path); - yyparse(); - fclose(yyin); - - if (goterror) - exit(1); -} - -void load_vhosts(void) { struct vhost *h; blob - 9e1eac56d82e945e73c31d808b036798188bf323 blob + a2f87942c64d032eb3ac8008b271ea50e3de0a6e --- gmid.h +++ gmid.h @@ -171,9 +171,6 @@ void gen_certificate(const char*, const char*, const void mkdirs(const char*); char *data_dir(void); void load_local_cert(const char*, const char*); -void yyerror(const char*); -int parse_portno(const char*); -void parse_conf(const char*); void load_vhosts(void); int make_socket(int, int); void setup_tls(void); @@ -188,6 +185,10 @@ extern int yylineno; extern int yyparse(void); extern int yylex(void); +void yyerror(const char*); +int parse_portno(const char*); +void parse_conf(const char*); + /* mime.c */ void init_mime(struct mime*); void add_mime(struct mime*, const char*, const char*); blob - f7e041d20e78bf48c7a58a601b7b971c85b95495 blob + a2e4bf9dc4c56d491d54fbf72ed83ca3c8c9b566 --- lex.l +++ lex.l @@ -76,7 +76,7 @@ auto return TAUTO; [ \t]+ ; -. errx(1, "%d: unexpected character %c", yylineno, *yytext); +. yyerror("unexpected character"); exit(1); %% blob - b626c1b676ead5fe5f4ee6a82f8b64a3142d3f50 blob + 7929e5317f47d66c1de000faec574415f84bcaf5 --- parse.y +++ parse.y @@ -33,8 +33,13 @@ size_t ihost = 0; struct location *loc = &hosts[0].locations[0]; size_t iloc = 0; -extern void yyerror(const char*); +int goterror = 0; +const char *config_path; +void yyerror(const char*); +int parse_portno(const char*); +void parse_conf(const char*); + %} /* for bison: */ @@ -145,3 +150,37 @@ locopt : TDEFAULT TTYPE TSTRING { } | TAUTO TINDEX TBOOL { loc->auto_index = $3 ? 1 : -1; } ; + +%% + +void +yyerror(const char *msg) +{ + goterror = 1; + fprintf(stderr, "%s:%d: %s\n", config_path, yylineno, msg); +} + +int +parse_portno(const char *p) +{ + const char *errstr; + int n; + + n = strtonum(p, 0, UINT16_MAX, &errstr); + if (errstr != NULL) + errx(1, "port number is %s: %s", errstr, p); + return n; +} + +void +parse_conf(const char *path) +{ + config_path = path; + if ((yyin = fopen(path, "r")) == NULL) + fatal("cannot open config %s", path); + yyparse(); + fclose(yyin); + + if (goterror) + exit(1); +}