aboutsummaryrefslogtreecommitdiffstats
path: root/src/telnet_interface.c
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2009-03-10 19:46:16 +0000
committerHarald Welte <laforge@gnumonks.org>2009-03-10 19:46:16 +0000
commitc63e51daac1dc0c04041ec2101cee735c170641f (patch)
treed922bb6f41ab62a79d77f8177e0b2efbc280a17f /src/telnet_interface.c
parentd256d4f19c251e6e78cbbfc3d0e1e796418f90ed (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.c37
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)