X-Git-Url: http://git.madism.org/?p=apps%2Fmadtty.git;a=blobdiff_plain;f=rote.c;h=322e8eb18b6fac05bb0d090fc9fcfe56e085f37e;hp=19ec25d47b25694fecee59cf3e324819c54d2fb8;hb=a5dc17572e59a3a0461ef129c7633fbcab996dfb;hpb=57358ec0b92d3529774187a4176c0e8a422eaf1b diff --git a/rote.c b/rote.c index 19ec25d..322e8eb 100644 --- a/rote.c +++ b/rote.c @@ -26,6 +26,8 @@ Copyright (c) 2004 Bruno T. C. de Oliveira #include #include +#define ROTE_VT_UPDATE_ITERATIONS 5 + RoteTerm *rote_vt_create(int rows, int cols) { RoteTerm *rt; int i, j; @@ -158,9 +160,17 @@ void rote_vt_update(RoteTerm *rt) { struct timeval tvzero; char buf[512]; int bytesread; + int n = ROTE_VT_UPDATE_ITERATIONS; if (rt->pd->pty < 0) return; /* nothing to pump */ - while (1) { + while (n--) { /* iterate at most ROVE_VT_UPDATE_ITERATIONS times. + * As Phil Endecott pointed out, if we don't restrict this, + * a program that floods the terminal with output + * could cause this loop to iterate forever, never + * being able to catch up. So we'll rely on the client + * calling rote_vt_update often, as the documentation + * recommends :-) */ + /* check if pty has something to say */ FD_ZERO(&ifs); FD_SET(rt->pd->pty, &ifs); tvzero.tv_sec = 0; tvzero.tv_usec = 0;