forked from Mirror/frr
lib: replace vtyvec/vtyshvec with lists
These are just used to iterate over active vty sessions, a vector is a weird choice there. Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
parent
69b089fbfd
commit
43dd8cafa3
84
lib/vty.c
84
lib/vty.c
|
@ -60,6 +60,8 @@ DEFINE_MTYPE_STATIC(LIB, VTY, "VTY");
|
||||||
DEFINE_MTYPE_STATIC(LIB, VTY_OUT_BUF, "VTY output buffer");
|
DEFINE_MTYPE_STATIC(LIB, VTY_OUT_BUF, "VTY output buffer");
|
||||||
DEFINE_MTYPE_STATIC(LIB, VTY_HIST, "VTY history");
|
DEFINE_MTYPE_STATIC(LIB, VTY_HIST, "VTY history");
|
||||||
|
|
||||||
|
DECLARE_DLIST(vtys, struct vty, itm);
|
||||||
|
|
||||||
/* Vty events */
|
/* Vty events */
|
||||||
enum event {
|
enum event {
|
||||||
VTY_SERV,
|
VTY_SERV,
|
||||||
|
@ -79,11 +81,9 @@ static void vty_event(enum event, struct vty *);
|
||||||
/* Extern host structure from command.c */
|
/* Extern host structure from command.c */
|
||||||
extern struct host host;
|
extern struct host host;
|
||||||
|
|
||||||
/* Vector which store each vty structure. */
|
/* active connections */
|
||||||
static vector vtyvec;
|
static struct vtys_head vty_sessions[1] = {INIT_DLIST(vty_sessions[0])};
|
||||||
|
static struct vtys_head vtysh_sessions[1] = {INIT_DLIST(vtysh_sessions[0])};
|
||||||
/* Vector for vtysh connections. */
|
|
||||||
static vector vtyshvec;
|
|
||||||
|
|
||||||
/* Vty timeout value. */
|
/* Vty timeout value. */
|
||||||
static unsigned long vty_timeout_val = VTY_TIMEOUT_DEFAULT;
|
static unsigned long vty_timeout_val = VTY_TIMEOUT_DEFAULT;
|
||||||
|
@ -423,19 +423,12 @@ static int vty_command(struct vty *vty, char *buf)
|
||||||
cp++;
|
cp++;
|
||||||
}
|
}
|
||||||
if (cp != NULL && *cp != '\0') {
|
if (cp != NULL && *cp != '\0') {
|
||||||
unsigned i;
|
|
||||||
char vty_str[VTY_BUFSIZ];
|
char vty_str[VTY_BUFSIZ];
|
||||||
char prompt_str[VTY_BUFSIZ];
|
char prompt_str[VTY_BUFSIZ];
|
||||||
|
|
||||||
/* format the base vty info */
|
/* format the base vty info */
|
||||||
snprintf(vty_str, sizeof(vty_str), "vty[??]@%s", vty->address);
|
snprintf(vty_str, sizeof(vty_str), "vty[%d]@%s", vty->fd,
|
||||||
|
vty->address);
|
||||||
for (i = 0; i < vector_active(vtyvec); i++)
|
|
||||||
if (vty == vector_slot(vtyvec, i)) {
|
|
||||||
snprintf(vty_str, sizeof(vty_str), "vty[%d]@%s",
|
|
||||||
i, vty->address);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* format the prompt */
|
/* format the prompt */
|
||||||
snprintf(prompt_str, sizeof(prompt_str), cmd_prompt(vty->node),
|
snprintf(prompt_str, sizeof(prompt_str), cmd_prompt(vty->node),
|
||||||
|
@ -1567,13 +1560,14 @@ static struct vty *vty_new_init(int vty_sock)
|
||||||
memset(vty->xpath, 0, sizeof(vty->xpath));
|
memset(vty->xpath, 0, sizeof(vty->xpath));
|
||||||
vty->private_config = false;
|
vty->private_config = false;
|
||||||
vty->candidate_config = vty_shared_candidate_config;
|
vty->candidate_config = vty_shared_candidate_config;
|
||||||
vector_set_index(vtyvec, vty_sock, vty);
|
|
||||||
vty->status = VTY_NORMAL;
|
vty->status = VTY_NORMAL;
|
||||||
vty->lines = -1;
|
vty->lines = -1;
|
||||||
vty->iac = 0;
|
vty->iac = 0;
|
||||||
vty->iac_sb_in_progress = 0;
|
vty->iac_sb_in_progress = 0;
|
||||||
vty->sb_len = 0;
|
vty->sb_len = 0;
|
||||||
|
|
||||||
|
vtys_add_tail(vty_sessions, vty);
|
||||||
|
|
||||||
return vty;
|
return vty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1984,7 +1978,7 @@ static int vtysh_accept(struct thread *thread)
|
||||||
vty->wfd = sock;
|
vty->wfd = sock;
|
||||||
vty->type = VTY_SHELL_SERV;
|
vty->type = VTY_SHELL_SERV;
|
||||||
vty->node = VIEW_NODE;
|
vty->node = VIEW_NODE;
|
||||||
vector_set_index(vtyshvec, sock, vty);
|
vtys_add_tail(vtysh_sessions, vty);
|
||||||
|
|
||||||
vty_event(VTYSH_READ, vty);
|
vty_event(VTYSH_READ, vty);
|
||||||
|
|
||||||
|
@ -2160,9 +2154,9 @@ void vty_close(struct vty *vty)
|
||||||
/* Unset vector. */
|
/* Unset vector. */
|
||||||
if (vty->fd != -1) {
|
if (vty->fd != -1) {
|
||||||
if (vty->type == VTY_SHELL_SERV)
|
if (vty->type == VTY_SHELL_SERV)
|
||||||
vector_unset(vtyshvec, vty->fd);
|
vtys_del(vtysh_sessions, vty);
|
||||||
else
|
else
|
||||||
vector_unset(vtyvec, vty->fd);
|
vtys_del(vty_sessions, vty);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vty->wfd > 0 && vty->type == VTY_FILE)
|
if (vty->wfd > 0 && vty->type == VTY_FILE)
|
||||||
|
@ -2494,22 +2488,12 @@ static void update_xpath(struct vty *vty, const char *oldpath,
|
||||||
void vty_update_xpath(const char *oldpath, const char *newpath)
|
void vty_update_xpath(const char *oldpath, const char *newpath)
|
||||||
{
|
{
|
||||||
struct vty *vty;
|
struct vty *vty;
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
for (i = 0; i < vector_active(vtyshvec); i++) {
|
|
||||||
if ((vty = vector_slot(vtyshvec, i)) == NULL)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
|
frr_each (vtys, vtysh_sessions, vty)
|
||||||
update_xpath(vty, oldpath, newpath);
|
update_xpath(vty, oldpath, newpath);
|
||||||
}
|
frr_each (vtys, vty_sessions, vty)
|
||||||
|
|
||||||
for (i = 0; i < vector_active(vtyvec); i++) {
|
|
||||||
if ((vty = vector_slot(vtyvec, i)) == NULL)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
update_xpath(vty, oldpath, newpath);
|
update_xpath(vty, oldpath, newpath);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
int vty_config_enter(struct vty *vty, bool private_config, bool exclusive)
|
int vty_config_enter(struct vty *vty, bool private_config, bool exclusive)
|
||||||
{
|
{
|
||||||
|
@ -2660,13 +2644,11 @@ DEFUN_NOSH (config_who,
|
||||||
"who",
|
"who",
|
||||||
"Display who is on vty\n")
|
"Display who is on vty\n")
|
||||||
{
|
{
|
||||||
unsigned int i;
|
|
||||||
struct vty *v;
|
struct vty *v;
|
||||||
|
|
||||||
for (i = 0; i < vector_active(vtyvec); i++)
|
frr_each (vtys, vty_sessions, v)
|
||||||
if ((v = vector_slot(vtyvec, i)) != NULL)
|
|
||||||
vty_out(vty, "%svty[%d] connected from %s.\n",
|
vty_out(vty, "%svty[%d] connected from %s.\n",
|
||||||
v->config ? "*" : " ", i, v->address);
|
v->config ? "*" : " ", v->fd, v->address);
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2983,8 +2965,7 @@ void vty_reset(void)
|
||||||
struct vty *vty;
|
struct vty *vty;
|
||||||
struct thread *vty_serv_thread;
|
struct thread *vty_serv_thread;
|
||||||
|
|
||||||
for (i = 0; i < vector_active(vtyvec); i++)
|
frr_each_safe (vtys, vty_sessions, vty) {
|
||||||
if ((vty = vector_slot(vtyvec, i)) != NULL) {
|
|
||||||
buffer_reset(vty->lbuf);
|
buffer_reset(vty->lbuf);
|
||||||
buffer_reset(vty->obuf);
|
buffer_reset(vty->obuf);
|
||||||
vty->status = VTY_CLOSE;
|
vty->status = VTY_CLOSE;
|
||||||
|
@ -3048,7 +3029,7 @@ int vty_shell_serv(struct vty *vty)
|
||||||
|
|
||||||
void vty_init_vtysh(void)
|
void vty_init_vtysh(void)
|
||||||
{
|
{
|
||||||
vtyvec = vector_init(VECTOR_MIN_SIZE);
|
/* currently nothing to do, but likely to have future use */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Install vty's own commands like `who' command. */
|
/* Install vty's own commands like `who' command. */
|
||||||
|
@ -3057,9 +3038,6 @@ void vty_init(struct thread_master *master_thread, bool do_command_logging)
|
||||||
/* For further configuration read, preserve current directory. */
|
/* For further configuration read, preserve current directory. */
|
||||||
vty_save_cwd();
|
vty_save_cwd();
|
||||||
|
|
||||||
vtyvec = vector_init(VECTOR_MIN_SIZE);
|
|
||||||
vtyshvec = vector_init(VECTOR_MIN_SIZE);
|
|
||||||
|
|
||||||
vty_master = master_thread;
|
vty_master = master_thread;
|
||||||
|
|
||||||
atexit(vty_stdio_atexit);
|
atexit(vty_stdio_atexit);
|
||||||
|
@ -3101,17 +3079,29 @@ void vty_init(struct thread_master *master_thread, bool do_command_logging)
|
||||||
|
|
||||||
void vty_terminate(void)
|
void vty_terminate(void)
|
||||||
{
|
{
|
||||||
|
struct vty *vty;
|
||||||
|
|
||||||
memset(vty_cwd, 0x00, sizeof(vty_cwd));
|
memset(vty_cwd, 0x00, sizeof(vty_cwd));
|
||||||
|
|
||||||
if (vtyvec && Vvty_serv_thread) {
|
|
||||||
vty_reset();
|
vty_reset();
|
||||||
vector_free(vtyvec);
|
|
||||||
|
/* default state of vty_sessions is initialized & empty. */
|
||||||
|
vtys_fini(vty_sessions);
|
||||||
|
vtys_init(vty_sessions);
|
||||||
|
|
||||||
|
/* vty_reset() doesn't close vtysh sessions */
|
||||||
|
frr_each_safe (vtys, vtysh_sessions, vty) {
|
||||||
|
buffer_reset(vty->lbuf);
|
||||||
|
buffer_reset(vty->obuf);
|
||||||
|
vty->status = VTY_CLOSE;
|
||||||
|
vty_close(vty);
|
||||||
|
}
|
||||||
|
|
||||||
|
vtys_fini(vtysh_sessions);
|
||||||
|
vtys_init(vtysh_sessions);
|
||||||
|
|
||||||
|
if (Vvty_serv_thread) {
|
||||||
vector_free(Vvty_serv_thread);
|
vector_free(Vvty_serv_thread);
|
||||||
vtyvec = NULL;
|
|
||||||
Vvty_serv_thread = NULL;
|
Vvty_serv_thread = NULL;
|
||||||
}
|
}
|
||||||
if (vtyshvec) {
|
|
||||||
vector_free(vtyshvec);
|
|
||||||
vtyshvec = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue