From d5deb9d19d57feef8acf25df2877539b4af0d39a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96man?= Date: Mon, 5 Nov 2012 13:05:43 +0100 Subject: [PATCH] HTSP: Handle partial write()s --- src/htsp_server.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/htsp_server.c b/src/htsp_server.c index d1f65f60..8fcbdd41 100644 --- a/src/htsp_server.c +++ b/src/htsp_server.c @@ -1469,24 +1469,30 @@ htsp_write_scheduler(void *aux) r = htsmsg_binary_serialize(hm->hm_msg, &dptr, &dlen, INT32_MAX); -#if 0 - if(hm->hm_pktref) { - usleep(hm->hm_payloadsize * 3); - } -#endif htsp_msg_destroy(hm); - - /* ignore return value */ - r = write(htsp->htsp_fd, dptr, dlen); - if(r != dlen) - tvhlog(LOG_INFO, "htsp", "%s: Write error -- %s", - htsp->htsp_logname, strerror(errno)); - free(dptr); + + void *freeme = dptr; + + while(dlen > 0) { + r = write(htsp->htsp_fd, dptr, dlen); + if(r < 1) { + tvhlog(LOG_INFO, "htsp", "%s: Write error -- %s", + htsp->htsp_logname, strerror(errno)); + break; + } + + dptr += r; + dlen -= r; + } + + free(freeme); pthread_mutex_lock(&htsp->htsp_out_mutex); - if(r != dlen) + if(dlen) break; } + // Shutdown socket to make receive thread terminate entire HTSP connection + shutdown(htsp->htsp_fd, SHUT_RDWR); pthread_mutex_unlock(&htsp->htsp_out_mutex); return NULL; }