tty_emit(): loop on EAGAIN #894

pull/900/head
nick black 4 years ago
parent 7100e2b83c
commit 0b70bbd66f
No known key found for this signature in database
GPG Key ID: 5F43400C21CBFACC

@ -464,15 +464,23 @@ tty_emit(const char* name __attribute__ ((unused)), const char* seq, int fd){
if(!seq){
return -1;
}
ssize_t ret = write(fd, seq, strlen(seq));
if(ret < 0){
size_t slen = strlen(seq);
size_t written = 0;
do{
ssize_t ret = write(fd, seq, slen);
if(ret > 0){
written += ret;
}
if(ret < 0){
if(errno != EAGAIN){
break;
}
}
}while(written < slen);
if(written < slen){
//fprintf(stderr, "Error emitting %zub %s escape (%s)\n", strlen(seq), name, strerror(errno));
return -1;
}
if((size_t)ret != strlen(seq)){
//fprintf(stderr, "Short write (%db) for %zub %s sequence\n", ret, strlen(seq), name);
return -1;
}
return 0;
}

@ -87,7 +87,7 @@ notcurses_stop_minimal(notcurses* nc){
}
// this wildly unsafe handler will attempt to restore the screen upon
// reception of SIG{INT, SEGV, ABRT, QUIT}. godspeed you, black emperor!
// reception of SIG{INT, SEGV, ABRT, QUIT, TERM}. godspeed you, black emperor!
static void
fatal_handler(int signo){
notcurses* nc = atomic_load(&signal_nc);

Loading…
Cancel
Save