diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/libfrr.c | 48 | ||||
| -rw-r--r-- | lib/libfrr.h | 16 |
2 files changed, 46 insertions, 18 deletions
diff --git a/lib/libfrr.c b/lib/libfrr.c index 2bce4766d3..252132201d 100644 --- a/lib/libfrr.c +++ b/lib/libfrr.c @@ -54,6 +54,7 @@ static char pidfile_default[512]; static char vtypath_default[256]; bool debug_memstats_at_exit = 0; +static bool nodetach_term, nodetach_daemon; static char comb_optstr[256]; static struct option comb_lo[64]; @@ -281,6 +282,8 @@ void frr_preinit(struct frr_daemon_info *daemon, int argc, char **argv) opt_extend(&os_zclient); if (!(di->flags & FRR_NO_TCPVTY)) opt_extend(&os_vty); + if (di->flags & FRR_DETACH_LATER) + nodetach_daemon = true; snprintf(config_default, sizeof(config_default), "%s/%s.conf", frr_sysconfdir, di->name); @@ -767,13 +770,16 @@ 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) { - frr_config_read_in(NULL); - exit(0); - } + if (!(di->flags & FRR_NO_CFG_PID_DRY)) { + /* Don't start execution if we are in dry-run mode */ + if (di->dryrun) { + frr_config_read_in(NULL); + exit(0); + } - thread_add_event(master, frr_config_read_in, NULL, 0, &di->read_in); + thread_add_event(master, frr_config_read_in, NULL, 0, + &di->read_in); + } if (di->daemon_mode || di->terminal) frr_daemonize(); @@ -783,7 +789,7 @@ void frr_config_fork(void) pid_output(di->pid_file); } -void frr_vty_serv(void) +static void frr_vty_serv(void) { /* allow explicit override of vty_path in the future * (not currently set anywhere) */ @@ -810,14 +816,22 @@ void frr_vty_serv(void) vty_serv_sock(di->vty_addr, di->vty_port, di->vty_path); } +static void frr_check_detach(void) +{ + if (nodetach_term || nodetach_daemon) + return; + + if (daemon_ctl_sock != -1) + close(daemon_ctl_sock); + daemon_ctl_sock = -1; +} + static void frr_terminal_close(int isexit) { int nullfd; - if (daemon_ctl_sock != -1) { - close(daemon_ctl_sock); - daemon_ctl_sock = -1; - } + nodetach_term = false; + frr_check_detach(); if (!di->daemon_mode || isexit) { printf("\n%s exiting\n", di->name); @@ -881,6 +895,12 @@ out: return 0; } +void frr_detach(void) +{ + nodetach_daemon = false; + frr_check_detach(); +} + void frr_run(struct thread_master *master) { char instanceinfo[64] = ""; @@ -895,6 +915,8 @@ void frr_run(struct thread_master *master) instanceinfo, di->vty_port, di->startinfo); if (di->terminal) { + nodetach_term = true; + vty_stdio(frr_terminal_close); if (daemon_ctl_sock != -1) { set_nonblocking(daemon_ctl_sock); @@ -914,9 +936,7 @@ void frr_run(struct thread_master *master) close(nullfd); } - if (daemon_ctl_sock != -1) - close(daemon_ctl_sock); - daemon_ctl_sock = -1; + frr_check_detach(); } /* end fixed stderr startup logging */ diff --git a/lib/libfrr.h b/lib/libfrr.h index d255279906..db58ff92be 100644 --- a/lib/libfrr.h +++ b/lib/libfrr.h @@ -29,11 +29,21 @@ #include "module.h" #include "hook.h" +/* The following options disable specific command line options that + * are not applicable for a particular daemon. + */ #define FRR_NO_PRIVSEP (1 << 0) #define FRR_NO_TCPVTY (1 << 1) #define FRR_LIMITED_CLI (1 << 2) -#define FRR_NO_CFG_PID_DRY (1 << 3) +#define FRR_NO_CFG_PID_DRY (1 << 3) #define FRR_NO_ZCLIENT (1 << 4) +/* If FRR_DETACH_LATER is used, the daemon will keep its parent running + * until frr_detach() is called. Normally "somedaemon -d" returns once the + * main event loop is reached in the daemon; use this for extra startup bits. + * + * Does nothing if -d isn't used. + */ +#define FRR_DETACH_LATER (1 << 5) struct frr_daemon_info { unsigned flags; @@ -102,10 +112,8 @@ extern struct thread_master *frr_init(void); DECLARE_HOOK(frr_late_init, (struct thread_master * tm), (tm)) extern void frr_config_fork(void); -extern void frr_vty_serv(void); - -/* note: contains call to frr_vty_serv() */ extern void frr_run(struct thread_master *master); +extern void frr_detach(void); extern bool frr_zclient_addr(struct sockaddr_storage *sa, socklen_t *sa_len, const char *path); |
