From af038fcf186496ba07fe1cf59263b6741a0988da Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Tue, 22 Aug 2017 18:01:44 +0200 Subject: src: add include_paths to struct nft_ctx Not convenient to keep this as static for the upcoming library, so let's move it where it belongs. Signed-off-by: Pablo Neira Ayuso --- src/main.c | 17 +++++++++++------ src/parser_bison.y | 5 +++-- src/scanner.l | 10 +++++----- 3 files changed, 19 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/main.c b/src/main.c index b86ae62f..eb0dfb02 100644 --- a/src/main.c +++ b/src/main.c @@ -34,9 +34,6 @@ unsigned int max_errors = 10; unsigned int debug_level; #endif -const char *include_paths[INCLUDE_PATHS_MAX] = { DEFAULT_INCLUDE_PATH }; -static unsigned int num_include_paths = 1; - enum opt_vals { OPT_HELP = 'h', OPT_VERSION = 'v', @@ -253,7 +250,7 @@ int nft_run(struct nft_ctx *nft, struct mnl_socket *nf_sock, struct cmd *cmd, *next; int ret; - ret = nft_parse(scanner, state); + ret = nft_parse(nft, scanner, state); if (ret != 0 || state->nerrs > 0) { ret = -1; goto err1; @@ -294,6 +291,12 @@ void nft_exit(void) mark_table_exit(); } +static void nft_ctx_init(struct nft_ctx *nft) +{ + nft->include_paths[0] = DEFAULT_INCLUDE_PATH; + nft->num_include_paths = 1; +} + int main(int argc, char * const *argv) { struct parser_state state; @@ -308,6 +311,8 @@ int main(int argc, char * const *argv) init_list_head(&nft.cache.list); nft_init(); + nft_ctx_init(&nft); + nf_sock = netlink_open_sock(); while (1) { val = getopt_long(argc, argv, OPTSTRING, options, NULL); @@ -332,13 +337,13 @@ int main(int argc, char * const *argv) interactive = true; break; case OPT_INCLUDEPATH: - if (num_include_paths >= INCLUDE_PATHS_MAX) { + if (nft.num_include_paths >= INCLUDE_PATHS_MAX) { fprintf(stderr, "Too many include paths " "specified, max. %u\n", INCLUDE_PATHS_MAX - 1); exit(NFT_EXIT_FAILURE); } - include_paths[num_include_paths++] = optarg; + nft.include_paths[nft.num_include_paths++] = optarg; break; case OPT_NUMERIC: if (++nft.output.numeric > NUMERIC_ALL) { diff --git a/src/parser_bison.y b/src/parser_bison.y index 18be53e8..0a56d12c 100644 --- a/src/parser_bison.y +++ b/src/parser_bison.y @@ -48,7 +48,7 @@ void parser_init(struct mnl_socket *nf_sock, struct nft_cache *cache, state->ectx.nf_sock = nf_sock; } -static void yyerror(struct location *loc, void *scanner, +static void yyerror(struct location *loc, struct nft_ctx *nft, void *scanner, struct parser_state *state, const char *s) { erec_queue(error(loc, "%s", s), state->msgs); @@ -109,6 +109,7 @@ static void location_update(struct location *loc, struct location *rhs, int n) %name-prefix "nft_" %debug %pure-parser +%parse-param { struct nft_ctx *nft } %parse-param { void *scanner } %parse-param { struct parser_state *state } %lex-param { scanner } @@ -709,7 +710,7 @@ opt_newline : NEWLINE common_block : INCLUDE QUOTED_STRING stmt_seperator { - if (scanner_include_file(scanner, $2, &@$) < 0) { + if (scanner_include_file(nft, scanner, $2, &@$) < 0) { xfree($2); YYERROR; } diff --git a/src/scanner.l b/src/scanner.l index b6ba32d8..d50e2b67 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -773,8 +773,8 @@ static bool search_in_include_path(const char *filename) filename[0] != '/'); } -int scanner_include_file(void *scanner, const char *filename, - const struct location *loc) +int scanner_include_file(struct nft_ctx *nft, void *scanner, + const char *filename, const struct location *loc) { struct parser_state *state = yyget_extra(scanner); struct error_record *erec; @@ -784,13 +784,13 @@ int scanner_include_file(void *scanner, const char *filename, if (search_in_include_path(filename)) { for (i = 0; i < INCLUDE_PATHS_MAX; i++) { - if (include_paths[i] == NULL) + if (nft->include_paths[i] == NULL) break; ret = snprintf(buf, sizeof(buf), "%s/%s", - include_paths[i], filename); + nft->include_paths[i], filename); if (ret < 0 || ret >= PATH_MAX) { erec = error(loc, "Too long file path \"%s/%s\"\n", - include_paths[i], filename); + nft->include_paths[i], filename); erec_queue(erec, state->msgs); return -1; } -- cgit v1.2.3