vtysh: use daemon type and handle multi-instance types

To handle multi-instance daemons (ospf, e.g.), each forked
vtysh handles all of the instances of a daemon type.

Signed-off-by: Mark Stapp <mstapp@nvidia.com>
This commit is contained in:
Mark Stapp 2021-10-21 13:21:35 +00:00 committed by Donald Sharp
parent 916af6559c
commit 449f66552f
3 changed files with 14 additions and 8 deletions

View File

@ -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)
{

View File

@ -132,6 +132,5 @@ struct vtysh_client {
};
extern struct vtysh_client vtysh_client[22];
extern char my_client[64];
#endif /* VTYSH_H */

View File

@ -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