summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonatas Abraitis <donatas@opensourcerouting.org>2024-07-25 13:25:06 +0300
committerGitHub <noreply@github.com>2024-07-25 13:25:06 +0300
commit4a582da39d0d1d12ba0b36489c43ce27c2b22666 (patch)
treede7db4fc4a8c120a34e6c3153d30d10b645fdb3d
parente612bc5075ffe09ecc41e8885dcd6729d5ce002b (diff)
parent3284a7325a4c5b7382a13b0fa9c98409168368fe (diff)
Merge pull request #16459 from FRRouting/mergify/bp/stable/10.0/pr-16451
lib: mgmtd: fix too early daemon detach of mgmtd (backport #16451)
-rw-r--r--lib/libfrr.c30
-rw-r--r--lib/libfrr.h2
-rw-r--r--lib/vty.c2
3 files changed, 19 insertions, 15 deletions
diff --git a/lib/libfrr.c b/lib/libfrr.c
index 2861ebe0b9..cb295f7e1b 100644
--- a/lib/libfrr.c
+++ b/lib/libfrr.c
@@ -1035,7 +1035,17 @@ void frr_config_fork(void)
zlog_tls_buffer_init();
}
-void frr_vty_serv_start(void)
+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;
+}
+
+void frr_vty_serv_start(bool check_detach)
{
/* allow explicit override of vty_path in the future
* (not currently set anywhere) */
@@ -1058,6 +1068,9 @@ void frr_vty_serv_start(void)
}
vty_serv_start(di->vty_addr, di->vty_port, di->vty_path);
+
+ if (check_detach)
+ frr_check_detach();
}
void frr_vty_serv_stop(void)
@@ -1068,16 +1081,6 @@ void frr_vty_serv_stop(void)
unlink(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;
@@ -1163,7 +1166,7 @@ void frr_run(struct event_loop *master)
char instanceinfo[64] = "";
if (!(di->flags & FRR_MANUAL_VTY_START))
- frr_vty_serv_start();
+ frr_vty_serv_start(false);
if (di->instance)
snprintf(instanceinfo, sizeof(instanceinfo), "instance %u ",
@@ -1201,7 +1204,8 @@ void frr_run(struct event_loop *master)
close(nullfd);
}
- frr_check_detach();
+ if (!(di->flags & FRR_MANUAL_VTY_START))
+ frr_check_detach();
}
/* end fixed stderr startup logging */
diff --git a/lib/libfrr.h b/lib/libfrr.h
index ee436d9f8f..8de881d5da 100644
--- a/lib/libfrr.h
+++ b/lib/libfrr.h
@@ -200,7 +200,7 @@ extern void frr_config_fork(void);
extern void frr_run(struct event_loop *master);
extern void frr_detach(void);
-extern void frr_vty_serv_start(void);
+extern void frr_vty_serv_start(bool check_detach);
extern void frr_vty_serv_stop(void);
extern bool frr_zclient_addr(struct sockaddr_storage *sa, socklen_t *sa_len,
diff --git a/lib/vty.c b/lib/vty.c
index 22858b937f..cec8dd64b8 100644
--- a/lib/vty.c
+++ b/lib/vty.c
@@ -3486,7 +3486,7 @@ static void vty_mgmt_server_connected(struct mgmt_fe_client *client,
/* Start or stop listening for vty connections */
if (connected)
- frr_vty_serv_start();
+ frr_vty_serv_start(true);
else
frr_vty_serv_stop();
}