zlog_tls_buffer_init();
}
-static void frr_vty_serv(void)
+void frr_vty_serv_start(void)
{
/* allow explicit override of vty_path in the future
* (not currently set anywhere) */
di->vty_path = vtypath_default;
}
- vty_serv_sock(di->vty_addr, di->vty_port, di->vty_path);
+ vty_serv_start(di->vty_addr, di->vty_port, di->vty_path);
+}
+
+void frr_vty_serv_stop(void)
+{
+ vty_serv_stop();
+
+ if (di->vty_path)
+ unlink(di->vty_path);
}
static void frr_check_detach(void)
{
char instanceinfo[64] = "";
- frr_vty_serv();
+ if (!(di->flags & FRR_MANUAL_VTY_START))
+ frr_vty_serv_start();
if (di->instance)
snprintf(instanceinfo, sizeof(instanceinfo), "instance %u ",
* Does nothing if -d isn't used.
*/
#define FRR_DETACH_LATER (1 << 6)
+/* If FRR_MANUAL_VTY_START is used, frr_run() will not automatically start
+ * listening on for vty connection (either TCP or Unix socket based). The daemon
+ * is responsible for calling frr_vty_serv() itself.
+ */
+#define FRR_MANUAL_VTY_START (1 << 7)
PREDECL_DLIST(log_args);
struct log_arg {
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_stop(void);
extern bool frr_zclient_addr(struct sockaddr_storage *sa, socklen_t *sa_len,
const char *path);
#endif /* VTYSH */
/* Determine address family to bind. */
-void vty_serv_sock(const char *addr, unsigned short port, const char *path)
+void vty_serv_start(const char *addr, unsigned short port, const char *path)
{
/* If port is set to 0, do not listen on TCP/IP at all! */
if (port)
#endif /* VTYSH */
}
+void vty_serv_stop(void)
+{
+ struct vty_serv *vtyserv;
+
+ while ((vtyserv = vtyservs_pop(vty_servs))) {
+ EVENT_OFF(vtyserv->t_accept);
+ close(vtyserv->sock);
+ XFREE(MTYPE_VTY_SERV, vtyserv);
+ }
+
+ vtyservs_fini(vty_servs);
+ vtyservs_init(vty_servs);
+}
+
static void vty_error_delete(void *arg)
{
struct vty_error *ve = arg;
mgmt_fe_connected = connected;
/* Start or stop listening for vty connections */
- if (connected) {
- zlog_info("mgmtd: starting vty servers");
+ if (connected)
frr_vty_serv_start();
- } else {
- zlog_info("mgmtd: stopping vty servers");
+ else
frr_vty_serv_stop();
- }
}
/*
void vty_terminate(void)
{
struct vty *vty;
- struct vty_serv *vtyserv;
if (mgmt_lib_hndl) {
mgmt_fe_client_lib_destroy();
vtys_fini(vtysh_sessions);
vtys_init(vtysh_sessions);
- while ((vtyserv = vtyservs_pop(vty_servs))) {
- EVENT_OFF(vtyserv->t_accept);
- close(vtyserv->sock);
- XFREE(MTYPE_VTY_SERV, vtyserv);
- }
-
- vtyservs_fini(vty_servs);
- vtyservs_init(vty_servs);
+ vty_serv_stop();
}
extern void vty_read_file(struct nb_config *config, FILE *confp);
extern void vty_read_file_finish(struct vty *vty, struct nb_config *config);
extern void vty_time_print(struct vty *, int);
-extern void vty_serv_sock(const char *, unsigned short, const char *);
+extern void vty_serv_start(const char *, unsigned short, const char *);
+extern void vty_serv_stop(void);
extern void vty_close(struct vty *);
extern char *vty_get_cwd(void);
extern void vty_update_xpath(const char *oldpath, const char *newpath);
.signals = mgmt_signals, .n_signals = array_size(mgmt_signals),
.privs = &mgmt_privs, .yang_modules = mgmt_yang_modules,
- .n_yang_modules = array_size(mgmt_yang_modules));
+ .n_yang_modules = array_size(mgmt_yang_modules),
+
+ /* avoid libfrr trying to read our config file for us */
+ .flags = FRR_MANUAL_VTY_START);
#define DEPRECATED_OPTIONS ""
}
/* Create VTY socket */
- vty_serv_sock(vty_addr, vty_port, "/tmp/.heavy.sock");
+ vty_serv_start(vty_addr, vty_port, "/tmp/.heavy.sock");
/* Configuration file read*/
if (!config_file)