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:
David Lamparter 2021-10-22 14:15:55 +02:00
parent 69b089fbfd
commit 43dd8cafa3
2 changed files with 48 additions and 54 deletions

View file

@ -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,21 +2488,11 @@ 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 ? "*" : " ", v->fd, v->address);
v->config ? "*" : " ", i, v->address);
return CMD_SUCCESS; return CMD_SUCCESS;
} }
@ -2983,13 +2965,12 @@ 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; vty_close(vty);
vty_close(vty); }
}
for (i = 0; i < vector_active(Vvty_serv_thread); i++) for (i = 0; i < vector_active(Vvty_serv_thread); i++)
if ((vty_serv_thread = vector_slot(Vvty_serv_thread, i)) if ((vty_serv_thread = vector_slot(Vvty_serv_thread, i))
@ -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;
}
} }

View file

@ -56,8 +56,12 @@ struct vty_cfg_change {
const char *value; const char *value;
}; };
PREDECL_DLIST(vtys);
/* VTY struct. */ /* VTY struct. */
struct vty { struct vty {
struct vtys_item itm;
/* File descripter of this vty. */ /* File descripter of this vty. */
int fd; int fd;