From 8eb2ce1f936bb27267c9fb312fbb4c3ea008f5af Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Thu, 14 Mar 2013 14:48:37 +0100 Subject: [PATCH] Implement reload option for includes to decide whether includes should get reloaded on firewall reloads (useful when they tap into internal chains) --- includes.c | 19 +++++++++++++++---- includes.h | 7 +++++-- main.c | 7 ++----- options.h | 2 ++ 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/includes.c b/includes.c index 4221def..23cfda0 100644 --- a/includes.c +++ b/includes.c @@ -25,6 +25,7 @@ const struct fw3_option fw3_include_opts[] = { FW3_OPT("path", string, include, path), FW3_OPT("type", include_type, include, type), FW3_OPT("family", family, include, family), + FW3_OPT("reload", bool, include, reload), { } }; @@ -82,7 +83,7 @@ fw3_load_includes(struct fw3_state *state, struct uci_package *p) static void -print_include(enum fw3_family family, struct fw3_include *include) +print_include(struct fw3_include *include, enum fw3_family family) { FILE *f; char line[1024]; @@ -105,13 +106,18 @@ print_include(enum fw3_family family, struct fw3_include *include) } void -fw3_print_includes(enum fw3_family family, struct fw3_state *state) +fw3_print_includes(struct fw3_state *state, enum fw3_family family, bool reload) { struct fw3_include *include; list_for_each_entry(include, &state->includes, list) + { + if (reload && !include->reload) + continue; + if (include->type == FW3_INC_TYPE_RESTORE) - print_include(family, include); + print_include(include, family); + } } @@ -144,11 +150,16 @@ run_include(struct fw3_include *include) } void -fw3_run_includes(struct fw3_state *state) +fw3_run_includes(struct fw3_state *state, bool reload) { struct fw3_include *include; list_for_each_entry(include, &state->includes, list) + { + if (reload && !include->reload) + continue; + if (include->type == FW3_INC_TYPE_SCRIPT) run_include(include); + } } diff --git a/includes.h b/includes.h index 5c091b7..cd48ede 100644 --- a/includes.h +++ b/includes.h @@ -25,8 +25,11 @@ extern const struct fw3_option fw3_include_opts[]; void fw3_load_includes(struct fw3_state *state, struct uci_package *p); -void fw3_print_includes(enum fw3_family family, struct fw3_state *state); -void fw3_run_includes(struct fw3_state *state); + +void fw3_print_includes(struct fw3_state *state, enum fw3_family family, + bool reload); + +void fw3_run_includes(struct fw3_state *state, bool reload); #define fw3_free_include(include) \ fw3_free_object(include, fw3_include_opts) diff --git a/main.c b/main.c index 3c2b4eb..90ef820 100644 --- a/main.c +++ b/main.c @@ -293,8 +293,7 @@ start(struct fw3_state *state, bool reload) fw3_pr("COMMIT\n"); } - if (!reload) - fw3_print_includes(family, state); + fw3_print_includes(state, family, reload); fw3_command_close(); family_set(state, family, true); @@ -308,9 +307,7 @@ start(struct fw3_state *state, bool reload) if (!print_rules) { - if (!reload) - fw3_run_includes(state); - + fw3_run_includes(state, reload); fw3_hotplug_zones(true, state); fw3_write_statefile(state); } diff --git a/options.h b/options.h index bb98fb6..33224b8 100644 --- a/options.h +++ b/options.h @@ -417,6 +417,8 @@ struct fw3_include const char *path; enum fw3_include_type type; + + bool reload; }; struct fw3_state -- 2.11.0