From a3114ac60a4f0c9f953e10939763ab569f73156e Mon Sep 17 00:00:00 2001 From: "dthornto@ziaframe.thorspot.net" Date: Fri, 27 May 2022 08:38:20 -0600 Subject: [PATCH] added retries= config to limit persistent state to retries --- src/config.c | 12 ++++++++++++ src/config.h | 1 + src/main.c | 18 ++++++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/src/config.c b/src/config.c index 7e692e98..e0c41935 100644 --- a/src/config.c +++ b/src/config.c @@ -60,6 +60,7 @@ const struct vpn_config invalid_cfg = { .use_syslog = -1, .half_internet_routes = -1, .persistent = -1, + .retries = -1, #if HAVE_USR_SBIN_PPPD .pppd_log = NULL, .pppd_plugin = NULL, @@ -310,6 +311,15 @@ int load_config(struct vpn_config *cfg, const char *filename) continue; } cfg->half_internet_routes = half_internet_routes; + } else if (strcmp(key, "retries") == 0) { + unsigned long retries = strtoul(val, NULL, 0); + + if (retries > UINT_MAX) { + log_warn("Bad value for retries in configuration file: \"%s\".\n", + val); + continue; + } + cfg->retries = retries; } else if (strcmp(key, "persistent") == 0) { unsigned long persistent = strtoul(val, NULL, 0); @@ -527,6 +537,8 @@ void merge_config(struct vpn_config *dst, struct vpn_config *src) dst->use_syslog = src->use_syslog; if (src->half_internet_routes != invalid_cfg.half_internet_routes) dst->half_internet_routes = src->half_internet_routes; + if (src->retries != invalid_cfg.retries) + dst->retries = src->retries; if (src->persistent != invalid_cfg.persistent) dst->persistent = src->persistent; #if HAVE_USR_SBIN_PPPD diff --git a/src/config.h b/src/config.h index f7783e1f..e451e159 100644 --- a/src/config.h +++ b/src/config.h @@ -107,6 +107,7 @@ struct vpn_config { int half_internet_routes; unsigned int persistent; + unsigned int retries; #if HAVE_USR_SBIN_PPPD char *pppd_log; diff --git a/src/main.c b/src/main.c index ff94907a..d1a8c48b 100644 --- a/src/main.c +++ b/src/main.c @@ -84,6 +84,7 @@ PPPD_USAGE \ " [--user-cert=] [--user-key=]\n" \ " [--use-syslog] [--trusted-cert=]\n" \ " [--persistent=] [-c ] [-v|-q]\n" \ +" [--persistent=] [--retries=] [-c ] [-v|-q]\n" \ " openfortivpn --help\n" \ " openfortivpn --version\n" \ "\n" @@ -161,6 +162,7 @@ PPPD_USAGE \ " dh key." help_seclevel_1 "\n" \ " --persistent= Run the vpn persistently in a loop and try to re-\n" \ " connect every seconds when dropping out.\n" \ +" --retries= Limit persistent retries to cycles.\n" \ " -v Increase verbosity. Can be used multiple times\n" \ " to be even more verbose.\n" \ " -q Decrease verbosity. Can be used multiple times\n" \ @@ -208,6 +210,7 @@ int main(int argc, char **argv) .use_syslog = 0, .half_internet_routes = 0, .persistent = 0, + .retries = 0, #if HAVE_RESOLVCONF .use_resolvconf = USE_RESOLVCONF, #endif @@ -261,6 +264,7 @@ int main(int argc, char **argv) {"no-dns", no_argument, &cli_cfg.set_dns, 0}, {"use-syslog", no_argument, &cli_cfg.use_syslog, 1}, {"persistent", required_argument, NULL, 0}, + {"retries", required_argument, NULL, 0}, {"ca-file", required_argument, NULL, 0}, {"user-cert", required_argument, NULL, 0}, {"user-key", required_argument, NULL, 0}, @@ -498,6 +502,18 @@ int main(int argc, char **argv) cli_cfg.persistent = persistent; break; } + if (strcmp(long_options[option_index].name, + "retries") == 0) { + long retries = strtol(optarg, NULL, 0); + + if (retries < 0 || retries > UINT_MAX) { + log_warn("Bad retries option: \"%s\"\n", + optarg); + break; + } + cli_cfg.retries = retries; + break; + } if (strcmp(long_options[option_index].name, "set-dns") == 0) { int set_dns = strtob(optarg); @@ -648,6 +664,8 @@ int main(int argc, char **argv) ret = EXIT_FAILURE; else ret = EXIT_SUCCESS; + if (cfg.retries-- == 0) + cfg.persistent = 0; if ((cfg.persistent > 0) && (get_sig_received() == 0)) sleep(cfg.persistent); } while ((get_sig_received() == 0) && (cfg.persistent != 0));