summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>2004-05-31 17:55:30 +0000
committerMartin Mares <mj@ucw.cz>2004-05-31 17:55:30 +0000
commit5f2a6a9ff324d846c86ffafb60ae5a4c01d06313 (patch)
tree36be871d290f918f9ae79a22b583069626277f2c
parenta4ffe2739d1a3efb45f209b63b2b6faa558e43a9 (diff)
Fix handling on full pipe to client in bird. Prevent packet overflows
for even only medium sized route table output. Fix a strange garbled output problem in the client. The latter seems to be caused by some library doing tcflush while there is still command output pending. So the best fix here is to do fflush and then tcdrain. Note that this problem occurs only under certain load situations and is not too easy to reproduce. (by Andreas)
-rw-r--r--client/client.c4
-rw-r--r--sysdep/unix/main.c6
2 files changed, 8 insertions, 2 deletions
diff --git a/client/client.c b/client/client.c
index f1c73c43..836941fd 100644
--- a/client/client.c
+++ b/client/client.c
@@ -281,6 +281,10 @@ server_got_reply(char *x)
}
else
printf("??? <%s>\n", x);
+ /* need this, otherwise some lib seems to eat pending output when
+ the prompt is displayed */
+ fflush(stdout);
+ tcdrain(fileno(stdout));
}
static void
diff --git a/sysdep/unix/main.c b/sysdep/unix/main.c
index e16eb699..75852c18 100644
--- a/sysdep/unix/main.c
+++ b/sysdep/unix/main.c
@@ -183,10 +183,12 @@ cli_write(cli *c)
if (c->tx_pos)
{
struct cli_out *o = c->tx_pos;
- c->tx_pos = o->next;
s->tbuf = o->outpos;
if (sk_send(s, o->wpos - o->outpos) > 0)
- ev_schedule(c->event);
+ {
+ c->tx_pos = o->next;
+ ev_schedule(c->event);
+ }
}
return !c->tx_pos;
}