vpp: fix stdin vs non-interactive command clash 46/40446/2
authorVladislav Grishenko <themiron@yandex-team.ru>
Sun, 14 Mar 2021 21:48:09 +0000 (02:48 +0500)
committerDamjan Marion <dmarion@0xa5.net>
Tue, 5 Mar 2024 18:51:37 +0000 (18:51 +0000)
In case of both stdin and non-interactive inputs are there
vppctl parses them all, causing mixed corrupted output:
  $ echo foo | vppctl sh bar
  show: unknown input `bar'
  unknown input `foo'

This is not desired, stdin should be ignored if there's a command
but still allow stdin commands - following cases are still equal:
  $ vppctl foo
  $ echo foo | vppctl

Type: fix
Signed-off-by: Vladislav Grishenko <themiron@yandex-team.ru>
Change-Id: I98667391627150c98a57d49ae544e48ef3351f34

src/vpp/app/vppctl.c

index 7166ce1..5b93cec 100644 (file)
@@ -291,17 +291,20 @@ main (int argc, char *argv[])
   efd = epoll_create1 (0);
 
   /* register STDIN */
-  event.events = EPOLLIN | EPOLLPRI | EPOLLERR;
-  event.data.fd = STDIN_FILENO;
-  if (epoll_ctl (efd, EPOLL_CTL_ADD, STDIN_FILENO, &event) != 0)
+  if (cmd == 0)
     {
-      /* ignore EPERM; it means stdin is something like /dev/null */
-      if (errno != EPERM)
+      event.events = EPOLLIN | EPOLLPRI | EPOLLERR;
+      event.data.fd = STDIN_FILENO;
+      if (epoll_ctl (efd, EPOLL_CTL_ADD, STDIN_FILENO, &event) != 0)
        {
-         error = errno;
-         fprintf (stderr, "epoll_ctl[%d]", STDIN_FILENO);
-         perror (0);
-         goto done;
+         /* ignore EPERM; it means stdin is something like /dev/null */
+         if (errno != EPERM)
+           {
+             error = errno;
+             fprintf (stderr, "epoll_ctl[%d]", STDIN_FILENO);
+             perror (0);
+             goto done;
+           }
        }
     }
 
@@ -341,7 +344,7 @@ main (int argc, char *argv[])
       if (n == 0)
        continue;
 
-      if (event.data.fd == STDIN_FILENO)
+      if (event.data.fd == STDIN_FILENO && cmd == 0)
        {
          int n;
          char c[100];