aboutsummaryrefslogtreecommitdiffstats
path: root/src
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
parentd256d4f19c251e6e78cbbfc3d0e1e796418f90ed (diff)
* correctly handle VTY_READ/VTY_WRITE events and select loop integration of VTY
Diffstat (limited to 'src')
-rw-r--r--src/telnet_interface.c37
-rw-r--r--src/vty/vty.c23
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)
{