diff options
author | Martin Mares <mj@ucw.cz> | 2000-04-27 22:35:08 +0000 |
---|---|---|
committer | Martin Mares <mj@ucw.cz> | 2000-04-27 22:35:08 +0000 |
commit | f75e3bbc01f2b711d1a2479eddd9ea35f8cfff47 (patch) | |
tree | 8063cd5dab1f0441a8cf49de52a6c6fb52b806bc | |
parent | 54896cbdba42a2ccd83c7f23c8ba14bed37a8b73 (diff) |
Fixed a couple of nasty CLI bugs which were triggered on long or multi-part
outputs. It took a whole evening to hunt them down, but now the CLI seems
to work fine.
Now I run three BGP connections with several thousand routes!
-rw-r--r-- | nest/cli.c | 11 | ||||
-rw-r--r-- | sysdep/unix/io.c | 2 | ||||
-rw-r--r-- | sysdep/unix/main.c | 5 |
3 files changed, 9 insertions, 9 deletions
@@ -29,13 +29,13 @@ cli_alloc_out(cli *c, int size) c->tx_write->next = o; else c->tx_buf = o; - o->next = NULL; o->wpos = o->outpos = o->buf; o->end = o->buf + CLI_TX_BUF_SIZE; } c->tx_write = o; if (!c->tx_pos) c->tx_pos = o; + o->next = NULL; } o->wpos += size; return o->wpos - size; @@ -123,7 +123,6 @@ cli_free_out(cli *c) if (o = c->tx_buf) { - c->tx_write = c->tx_pos = NULL; o->wpos = o->outpos = o->buf; while (p = o->next) { @@ -131,6 +130,7 @@ cli_free_out(cli *c) mb_free(p); } } + c->tx_write = c->tx_pos = NULL; c->async_msg_size = 0; } @@ -175,7 +175,7 @@ cli_command(struct cli *c) cli_printf(c, 9001, f.err_msg); } -static int +static void cli_event(void *data) { cli *c = data; @@ -193,7 +193,7 @@ cli_event(void *data) { err = cli_get_command(c); if (!err) - return 0; + return; if (err < 0) cli_printf(c, 9000, "Command too long"); else @@ -202,9 +202,8 @@ cli_event(void *data) if (cli_write(c)) { cli_free_out(c); - return 1; + ev_schedule(c->event); } - return 0; } cli * diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c index 35af2df8..895f5373 100644 --- a/sysdep/unix/io.c +++ b/sysdep/unix/io.c @@ -870,7 +870,7 @@ sk_write(sock *s) case SK_DELETED: return; default: - while (s->ttx != s->tbuf && sk_maybe_write(s) > 0) + while (s->ttx != s->tpos && sk_maybe_write(s) > 0) s->tx_hook(s); } } diff --git a/sysdep/unix/main.c b/sysdep/unix/main.c index 621d85ca..06d1d1dc 100644 --- a/sysdep/unix/main.c +++ b/sysdep/unix/main.c @@ -179,9 +179,10 @@ cli_write(cli *c) struct cli_out *o = c->tx_pos; c->tx_pos = o->next; s->tbuf = o->outpos; - return sk_send(s, o->wpos - o->outpos); + if (sk_send(s, o->wpos - o->outpos) > 0) + ev_schedule(c->event); } - return 1; + return !c->tx_pos; } int |