]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib/vty: add separate output fd support to VTYs
authorDavid Lamparter <equinox@diac24.net>
Thu, 30 May 2013 14:31:49 +0000 (16:31 +0200)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 8 Jun 2016 19:08:05 +0000 (15:08 -0400)
to be used with stdin/stdout terminals, this adds support for writing to
a different FD than we're reading from.  Also fixes error messages from
config load being written to stdin.

[v2: fixed config write]
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
(cherry picked from commit 4715a53b4d390e72a06c864a6a505971841e3dc9)

lib/command.c
lib/vty.c
lib/vty.h

index 015d97266d84a5776c74caf3ef6ab0043edde751..72a273989506cf860033eb82dcbb297d4c7037ee 100644 (file)
@@ -3153,7 +3153,7 @@ DEFUN (config_write_file,
   
   /* Make vty for configuration file. */
   file_vty = vty_new ();
-  file_vty->fd = fd;
+  file_vty->wfd = fd;
   file_vty->type = VTY_FILE;
 
   /* Config file header print. */
index 97ce245b334f310163413fbc4991c921e82e3256..21f6f0da6f00cb9966bcc28f4875d8371d19cd1e 100644 (file)
--- a/lib/vty.c
+++ b/lib/vty.c
@@ -184,7 +184,7 @@ vty_log_out (struct vty *vty, const char *level, const char *proto_str,
   buf[len++] = '\r';
   buf[len++] = '\n';
 
-  if (write(vty->fd, buf, len) < 0)
+  if (write(vty->wfd, buf, len) < 0)
     {
       if (ERRNO_IO_RETRY(errno))
        /* Kernel buffer is full, probably too much debugging output, so just
@@ -1543,7 +1543,7 @@ vty_read (struct thread *thread)
     vty_close (vty);
   else
     {
-      vty_event (VTY_WRITE, vty_sock, vty);
+      vty_event (VTY_WRITE, vty->wfd, vty);
       vty_event (VTY_READ, vty_sock, vty);
     }
   return 0;
@@ -1572,12 +1572,12 @@ vty_flush (struct thread *thread)
 
   /* N.B. if width is 0, that means we don't know the window size. */
   if ((vty->lines == 0) || (vty->width == 0))
-    flushrc = buffer_flush_available(vty->obuf, vty->fd);
+    flushrc = buffer_flush_available(vty->obuf, vty_sock);
   else if (vty->status == VTY_MORELINE)
-    flushrc = buffer_flush_window(vty->obuf, vty->fd, vty->width,
+    flushrc = buffer_flush_window(vty->obuf, vty_sock, vty->width,
                                  1, erase, 0);
   else
-    flushrc = buffer_flush_window(vty->obuf, vty->fd, vty->width,
+    flushrc = buffer_flush_window(vty->obuf, vty_sock, vty->width,
                                  vty->lines >= 0 ? vty->lines :
                                                    vty->height,
                                  erase, 0);
@@ -1623,6 +1623,7 @@ vty_create (int vty_sock, union sockunion *su)
   /* Allocate new vty structure and set up default values. */
   vty = vty_new ();
   vty->fd = vty_sock;
+  vty->wfd = vty_sock;
   vty->type = VTY_TERM;
   strcpy (vty->address, buf);
   if (no_password_check)
@@ -2023,6 +2024,7 @@ vtysh_accept (struct thread *thread)
 
   vty = vty_new ();
   vty->fd = sock;
+  vty->wfd = sock;
   vty->type = VTY_SHELL_SERV;
   vty->node = VIEW_NODE;
 
@@ -2034,10 +2036,10 @@ vtysh_accept (struct thread *thread)
 static int
 vtysh_flush(struct vty *vty)
 {
-  switch (buffer_flush_available(vty->obuf, vty->fd))
+  switch (buffer_flush_available(vty->obuf, vty->wfd))
     {
     case BUFFER_PENDING:
-      vty_event(VTYSH_WRITE, vty->fd, vty);
+      vty_event(VTYSH_WRITE, vty->wfd, vty);
       break;
     case BUFFER_ERROR:
       vty->monitor = 0; /* disable monitoring to avoid infinite recursion */
@@ -2173,7 +2175,7 @@ vty_close (struct vty *vty)
     thread_cancel (vty->t_timeout);
 
   /* Flush buffer. */
-  buffer_flush_all (vty->obuf, vty->fd);
+  buffer_flush_all (vty->obuf, vty->wfd);
 
   /* Free input buffer. */
   buffer_free (vty->obuf);
@@ -2233,12 +2235,13 @@ vty_read_file (FILE *confp)
   unsigned int line_num = 0;
 
   vty = vty_new ();
-  vty->fd = dup(STDERR_FILENO); /* vty_close() will close this */
-  if (vty->fd < 0)
+  vty->wfd = dup(STDERR_FILENO); /* vty_close() will close this */
+  if (vty->wfd < 0)
   {
     /* Fine, we couldn't make a new fd. vty_close doesn't close stdout. */
-    vty->fd = STDOUT_FILENO;
+    vty->wfd = STDOUT_FILENO;
   }
+  vty->fd = STDIN_FILENO;
   vty->type = VTY_FILE;
   vty->node = CONFIG_NODE;
   
@@ -2493,7 +2496,7 @@ vty_log_fixed (char *buf, size_t len)
       if (((vty = vector_slot (vtyvec, i)) != NULL) && vty->monitor)
        /* N.B. We don't care about the return code, since process is
           most likely just about to die anyway. */
-       if (writev(vty->fd, iov, 2) == -1)
+       if (writev(vty->wfd, iov, 2) == -1)
          {
            fprintf(stderr, "Failure to writev: %d\n", errno);
            exit(-1);
index f0286202bd53da969fb7090e50286b89e4564614..7968e92fd5bbb034c1fb930b4dcabf05618b83b8 100644 (file)
--- a/lib/vty.h
+++ b/lib/vty.h
@@ -34,6 +34,9 @@ struct vty
   /* File descripter of this vty. */
   int fd;
 
+  /* output FD, to support stdin/stdout combination */
+  int wfd;
+
   /* Is this vty connect to file or not */
   enum {VTY_TERM, VTY_FILE, VTY_SHELL, VTY_SHELL_SERV} type;