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 | |
parent | d256d4f19c251e6e78cbbfc3d0e1e796418f90ed (diff) |
* correctly handle VTY_READ/VTY_WRITE events and select loop integration of VTY
Diffstat (limited to 'src')
-rw-r--r-- | src/telnet_interface.c | 37 | ||||
-rw-r--r-- | src/vty/vty.c | 23 |
2 files changed, 38 insertions, 22 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) diff --git a/src/vty/vty.c b/src/vty/vty.c index 66cc13b48..370d1f7a9 100644 --- a/src/vty/vty.c +++ b/src/vty/vty.c @@ -18,19 +18,6 @@ #include <vty/command.h> #include <vty/buffer.h> -/* Vty events */ -enum event { - VTY_SERV, - VTY_READ, - VTY_WRITE, - VTY_TIMEOUT_RESET, -#ifdef VTYSH - VTYSH_SERV, - VTYSH_READ, - VTYSH_WRITE -#endif /* VTYSH */ -}; - extern struct host host; /* Vector which store each vty structure. */ @@ -235,6 +222,7 @@ int vty_out_newline(struct vty *vty) { char *p = vty_newline(vty); buffer_put(vty->obuf, p, strlen(p)); + return 0; } int vty_config_lock(struct vty *vty) @@ -255,12 +243,6 @@ int vty_config_unlock(struct vty *vty) return vty->config; } -static void vty_event(enum event event, int sock, struct vty *vty) -{ - fprintf(stdout, "vty_event(%d, %d, %p)\n", event, sock, vty); - buffer_flush_all(vty->obuf, sock); -} - /* Say hello to vty interface. */ void vty_hello(struct vty *vty) { @@ -1375,7 +1357,7 @@ int vty_read(struct vty *vty) /* Create new vty structure. */ struct vty * -vty_create (int vty_sock) +vty_create (int vty_sock, void *priv) { struct vty *vty; @@ -1388,6 +1370,7 @@ vty_create (int vty_sock) /* Allocate new vty structure and set up default values. */ vty = vty_new (); vty->fd = vty_sock; + vty->priv = priv; vty->type = VTY_TERM; if (no_password_check) { |