libdraw: don't loop forever when getting eof on /dev/cons in keyboard ioproc

This commit is contained in:
cinap_lenrek 2015-05-19 20:04:47 +02:00
parent 8f8c2d6779
commit 6198954859

View file

@ -19,7 +19,7 @@ static
void void
_ioproc(void *arg) _ioproc(void *arg)
{ {
int m, n; int m, n, nerr;
char buf[20]; char buf[20];
Rune r; Rune r;
Keyboardctl *kc; Keyboardctl *kc;
@ -27,18 +27,27 @@ _ioproc(void *arg)
kc = arg; kc = arg;
threadsetname("kbdproc"); threadsetname("kbdproc");
n = 0; n = 0;
loop: nerr = 0;
while(kc->consfd >= 0){ while(kc->consfd >= 0){
m = read(kc->consfd, buf+n, sizeof buf-n);
if(m <= 0){
yield(); /* if error is due to exiting, we'll exit here */
if(kc->consfd < 0)
break;
fprint(2, "keyboard: short read: %r\n");
if(m<0 || ++nerr>10)
threadexits("read error");
continue;
}
nerr = 0;
n += m;
while(n>0 && fullrune(buf, n)){ while(n>0 && fullrune(buf, n)){
m = chartorune(&r, buf); m = chartorune(&r, buf);
n -= m; n -= m;
memmove(buf, buf+m, n); memmove(buf, buf+m, n);
if(send(kc->c, &r) < 0) if(send(kc->c, &r) < 0)
goto loop; break;
} }
if((m = read(kc->consfd, buf+n, sizeof buf-n)) <= 0)
goto loop;
n += m;
} }
chanfree(kc->c); chanfree(kc->c);
free(kc->file); free(kc->file);