]> git.puffer.fish Git - mirror/frr.git/commitdiff
vtysh: use daemon type and handle multi-instance types
authorMark Stapp <mstapp@nvidia.com>
Thu, 21 Oct 2021 13:21:35 +0000 (13:21 +0000)
committerDonald Sharp <sharpd@nvidia.com>
Tue, 28 Mar 2023 14:10:33 +0000 (10:10 -0400)
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>
vtysh/vtysh.c
vtysh/vtysh.h
vtysh/vtysh_main.c

index 93c3e9ae1e19dd32e24a14bc88b7245ca946abd2..7c9c46202e10877c0dcf973bd66797a65b48dc26 100644 (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)
 {
index e43dd69350701e80782e89203c97713e6e2daf21..640922eed92f61f74e5d0407f08221983fffe6ec 100644 (file)
@@ -132,6 +132,5 @@ struct vtysh_client {
 };
 
 extern struct vtysh_client vtysh_client[22];
-extern char my_client[64];
 
 #endif /* VTYSH_H */
index f34bb9a4560bc42d5b80c22e6bb03a9b9eb8c129..053d66324518e6b88ecd53d2e07ae6e22b421022 100644 (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