diff --git a/vtysh/vtysh.c b/vtysh/vtysh.c index 93c3e9ae1e..7c9c46202e 100644 --- a/vtysh/vtysh.c +++ b/vtysh/vtysh.c @@ -135,8 +135,6 @@ struct vtysh_client vtysh_client[] = { {.name = "pim6d", .flag = VTYSH_PIM6D}, }; -char my_client[64]; - /* Searches for client by name, returns index */ static int vtysh_client_lookup(const char *name) { diff --git a/vtysh/vtysh.h b/vtysh/vtysh.h index e43dd69350..640922eed9 100644 --- a/vtysh/vtysh.h +++ b/vtysh/vtysh.h @@ -132,6 +132,5 @@ struct vtysh_client { }; extern struct vtysh_client vtysh_client[22]; -extern char my_client[64]; #endif /* VTYSH_H */ diff --git a/vtysh/vtysh_main.c b/vtysh/vtysh_main.c index f34bb9a456..053d663245 100644 --- a/vtysh/vtysh_main.c +++ b/vtysh/vtysh_main.c @@ -345,6 +345,8 @@ int main(int argc, char **argv, char **env) char pathspace[MAXPATHLEN] = ""; const char *histfile = NULL; const char *histfile_env = getenv("VTYSH_HISTFILE"); + char my_client[64]; + int my_client_type; /* SUID: drop down to calling user & go back up when needed */ elevuid = geteuid(); @@ -739,6 +741,7 @@ int main(int argc, char **argv, char **env) /* Store name of client this fork will handle */ strlcpy(my_client, vtysh_client[i].name, sizeof(my_client)); + my_client_type = vtysh_client[i].flag; fork_pid = fork(); /* If child, break */ @@ -761,15 +764,21 @@ int main(int argc, char **argv, char **env) */ for (unsigned int i = 0; i < array_size(vtysh_client); i++) { - if (strcmp(my_client, vtysh_client[i].name)) { + if (my_client_type != vtysh_client[i].flag) { + struct vtysh_client *cl; + /* * If this is a client we aren't * responsible for, disconnect */ - if (vtysh_client[i].fd >= 0) - close(vtysh_client[i].fd); - vtysh_client[i].fd = -1; - } else if (vtysh_client[i].fd == -1) { + for (cl = &vtysh_client[i]; cl; + cl = cl->next) { + if (cl->fd >= 0) + close(cl->fd); + cl->fd = -1; + } + } else if (vtysh_client[i].fd == -1 && + vtysh_client[i].next == NULL) { /* * If this is the client we are * responsible for, but we aren't