diff options
-rw-r--r-- | lib/libfrr.c | 25 | ||||
-rw-r--r-- | lib/libfrr.h | 2 |
2 files changed, 23 insertions, 4 deletions
diff --git a/lib/libfrr.c b/lib/libfrr.c index 4620cb258..4f3b8c66d 100644 --- a/lib/libfrr.c +++ b/lib/libfrr.c @@ -721,20 +721,37 @@ static void frr_daemonize(void) frr_daemon_wait(fds[0]); } -void frr_config_fork(void) +/* + * Why is this a thread? + * + * The read in of config for integrated config happens *after* + * thread execution starts( because it is passed in via a vtysh -b -n ) + * While if you are not using integrated config we want the ability + * to read the config in after thread execution starts, so that + * we can match this behavior. + */ +static int frr_config_read_in(struct thread *t) { - hook_call(frr_late_init, master); - if (!vty_read_config(di->config_file, config_default) && di->backup_config_file) { zlog_info("Attempting to read backup config file: %s specified", di->backup_config_file); vty_read_config(di->backup_config_file, config_default); } + return 0; +} + +void frr_config_fork(void) +{ + hook_call(frr_late_init, master); /* Don't start execution if we are in dry-run mode */ - if (di->dryrun) + if (di->dryrun) { + frr_config_read_in(NULL); exit(0); + } + + thread_add_event(master, frr_config_read_in, NULL, 0, &di->read_in); if (di->daemon_mode || di->terminal) frr_daemonize(); diff --git a/lib/libfrr.h b/lib/libfrr.h index bd572cce1..1c744ee1b 100644 --- a/lib/libfrr.h +++ b/lib/libfrr.h @@ -50,6 +50,8 @@ struct frr_daemon_info { bool dryrun; bool daemon_mode; bool terminal; + + struct thread *read_in; const char *config_file; const char *backup_config_file; const char *pid_file; |