summaryrefslogtreecommitdiffstats
path: root/lib/vty.c
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@diac24.net>2013-05-30 16:31:49 +0200
committerDavid Lamparter <equinox@opensourcerouting.org>2015-05-27 20:34:40 +0200
commit4715a53b4d390e72a06c864a6a505971841e3dc9 (patch)
treea7618f437bd55b6695c9f8e4b03a252a0513f6d5 /lib/vty.c
parentee53c8b9f7979c79beada960746ca35046016a45 (diff)
downloadquagga-4715a53b4d390e72a06c864a6a505971841e3dc9.tar.bz2
quagga-4715a53b4d390e72a06c864a6a505971841e3dc9.tar.xz
lib/vty: add separate output fd support to VTYs
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>
Diffstat (limited to 'lib/vty.c')
-rw-r--r--lib/vty.c27
1 files changed, 15 insertions, 12 deletions
diff --git a/lib/vty.c b/lib/vty.c
index d623b853..4b445892 100644
--- 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
@@ -1542,7 +1542,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;
@@ -1571,12 +1571,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);
@@ -1622,6 +1622,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)
@@ -2022,6 +2023,7 @@ vtysh_accept (struct thread *thread)
vty = vty_new ();
vty->fd = sock;
+ vty->wfd = sock;
vty->type = VTY_SHELL_SERV;
vty->node = VIEW_NODE;
@@ -2033,10 +2035,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 */
@@ -2172,7 +2174,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);
@@ -2229,12 +2231,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;
@@ -2475,7 +2478,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. */
- writev(vty->fd, iov, 2);
+ writev(vty->wfd, iov, 2);
}
}