From c63e51daac1dc0c04041ec2101cee735c170641f Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Tue, 10 Mar 2009 19:46:16 +0000 Subject: * correctly handle VTY_READ/VTY_WRITE events and select loop integration of VTY --- src/telnet_interface.c | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) (limited to 'src/telnet_interface.c') diff --git a/src/telnet_interface.c b/src/telnet_interface.c index 422af3b22..5ed9a0e26 100644 --- a/src/telnet_interface.c +++ b/src/telnet_interface.c @@ -35,6 +35,8 @@ #include #include +#include + #define WRITE_CONNECTION(fd, msg...) \ int ret; \ char buf[4096]; \ @@ -129,7 +131,20 @@ int telnet_close_client(struct bsc_fd *fd) { static int client_data(struct bsc_fd *fd, unsigned int what) { struct telnet_connection *conn = fd->data; - return vty_read(conn->vty); + int rc; + + if (what & BSC_FD_READ) { + conn->fd.when &= ~BSC_FD_READ; + rc = vty_read(conn->vty); + } + + if (what & BSC_FD_WRITE) { + rc = buffer_flush_all(conn->vty->obuf, fd->fd); + if (rc == BUFFER_EMPTY) + conn->fd.when &= ~BSC_FD_WRITE; + } + + return rc; } static int telnet_new_connection(struct bsc_fd *fd, unsigned int what) { @@ -157,13 +172,31 @@ static int telnet_new_connection(struct bsc_fd *fd, unsigned int what) { print_welcome(new_connection); - connection->vty = vty_create(new_connection); + connection->vty = vty_create(new_connection, connection); if (!connection->vty) return -1; return 0; } +/* callback from VTY code */ +void vty_event(enum event event, int sock, struct vty *vty) +{ + struct telnet_connection *connection = vty->priv; + struct bsc_fd *bfd = &connection->fd; + + switch (event) { + case VTY_READ: + bfd->when |= BSC_FD_READ; + break; + case VTY_WRITE: + bfd->when |= BSC_FD_WRITE; + break; + default: + break; + } +} + #if 0 static int telnet_paging_callback(unsigned int subsys, unsigned int singal, void *handler_data, void *signal_data) -- cgit v1.2.3