diff options
author | Harald Welte <laforge@gnumonks.org> | 2009-03-10 19:46:16 +0000 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2009-03-10 19:46:16 +0000 |
commit | c63e51daac1dc0c04041ec2101cee735c170641f (patch) | |
tree | d922bb6f41ab62a79d77f8177e0b2efbc280a17f /src/telnet_interface.c | |
parent | d256d4f19c251e6e78cbbfc3d0e1e796418f90ed (diff) |
* correctly handle VTY_READ/VTY_WRITE events and select loop integration of VTY
Diffstat (limited to 'src/telnet_interface.c')
-rw-r--r-- | src/telnet_interface.c | 37 |
1 files changed, 35 insertions, 2 deletions
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 <openbsc/paging.h> #include <openbsc/signal.h> +#include <vty/buffer.h> + #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) |