diff -ur ncurses-5.9+20140712/ncurses/tinfo/lib_tputs.c ncurses-5.9+20140712-new/ncurses/tinfo/lib_tputs.c --- ncurses-5.9+20140712/ncurses/tinfo/lib_tputs.c 2013-01-12 21:57:32.000000000 +0100 +++ ncurses-5.9+20140712-new/ncurses/tinfo/lib_tputs.c 2014-12-31 11:29:10.060358445 +0100 @@ -121,13 +121,32 @@ { if (SP_PARM != 0 && SP_PARM->_ofd >= 0) { if (SP_PARM->out_inuse) { + char *buf = SP_PARM->out_buffer; size_t amount = SP->out_inuse; + ssize_t res; /* * Help a little, if the write is interrupted, by first resetting * our amount. */ + + while (amount) + { + res = write(SP_PARM->_ofd, buf, amount); + + if (res > 0) + { + amount -= res; + buf += res; + } else { + if (errno == EAGAIN) + continue; + if (errno == EINTR) + continue; + break; /* an error we can not recover from */ + } + } + SP->out_inuse = 0; - IGNORE_RC(write(SP_PARM->_ofd, SP_PARM->out_buffer, amount)); } } }